Entrevista con el programador Código de oro-Pregunta de la entrevista 17.26. Escasa similitud (Hash Map)

1. Título

El número de elementos en la intersección de dos documentos (con diferentes palabras) dividido por el número de elementos en la unión es la similitud de los dos documentos.

Por ejemplo, la similitud entre {1, 5, 3} y {1, 7, 2, 3} es 0.4, donde hay 2 elementos en la intersección y 5 elementos en la unión.

Dada una serie de documentos largos, cada elemento del documento es diferente y está asociado con una ID. Su similitud es muy "escasa", lo que significa que se seleccionan dos documentos y la similitud es cercana a 0.

Diseñe un algoritmo para devolver la identificación y la similitud de cada par de documentos. Solo se debe generar la combinación cuya similitud sea mayor que 0.
Por favor ignore el documento vacío. Por simplicidad, se puede suponer que cada documento está representado por una matriz que contiene enteros diferentes .

La entrada es una matriz bidimensional docs, docs [i] representa el documento con id i.

Devuelve una matriz, donde cada elemento es una cadena, que representa cada par de documentos con una similitud mayor que 0, el formato es {id1},{id2}: {similarity}, donde id1 es la identificación más pequeña de los dos documentos, la similitud es similitud, con una precisión de 4 decimales . La matriz se puede devolver en cualquier orden.

示例:
输入: 
[
  [14, 15, 100, 9, 3],
  [32, 1, 9, 3, 5],
  [15, 29, 2, 6, 8, 7],
  [7, 10]
]
输出:
[
  "0,1: 0.2500",
  "0,2: 0.1000",
  "2,3: 0.1429"
]

提示:
docs.length <= 500
docs[i].length <= 500
相似度大于 0 的文档对数不会超过 1000

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/sparse-similarity-lcci Los
derechos de autor pertenecen a la Red de Deducción Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

2. Resolución de problemas

class Solution {
public:
    vector<string> computeSimilarities(vector<vector<int>>& docs) {
    	unordered_map<int,vector<int>> m;//文档片段,含有该片段的文档id
    	for(int i = 0; i < docs.size(); ++i)
    	{
    		for(int part : docs[i])
    			m[part].push_back(i);
    	}
    	unordered_map<int,unordered_map<int,int>> countSame;//doc1,doc2,sameValue
    	int i, j, id1, id2, num;
    	for(auto& mi : m)
    	{
    		for(i = 0; i < mi.second.size()-1; ++i)
    		{
    			id1 = mi.second[i];
    			for(j = i+1; j < mi.second.size(); ++j)
    			{
    				id2 = mi.second[j];
    				countSame[id1][id2] += 1;
    			}
    		}
    	}
    	vector<string> ans;
    	double similarity;
    	for(auto& vals : countSame)
    	{
    		id1 = vals.first;
    		for(auto& count : vals.second)
    		{
    			id2 = count.first;
    			num = count.second;
    			similarity = double(num)/(docs[id1].size()+docs[id2].size()-num);
    			char res[16];
    			sprintf(res, "%d,%d: %.4f", id1, id2, similarity+1e-9);
    			ans.push_back(string(res,res+16));
    		}
    	}
    	return ans;
    }
};

Inserte la descripción de la imagen aquí

Publicado 860 artículos originales · elogiado 2412 · 450,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_21201267/article/details/105571936
Recomendado
Clasificación