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
- El título dice escaso, hasta 1000 pares, considere el mismo contenido del documento y luego almacene "la identificación del documento que contiene el contenido"
sprintf(res, "%d,%d: %.4f", id1, id2, similarity+1e-9);
, Problema de precisión, consulte el área de comentarios+1e-9
- C función de biblioteca
int sprintf(char *str, const char *format, ...)
transmite la salida con formato a la cadena apuntada por str - Ejemplos de precisión de tarjetas son bienvenidos
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;
}
};