两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。 例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。 给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。 请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。 输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。 返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 来源:力扣(LeetCode)
1. 题目
请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。{id1},{id2}: {similarity}
,其中 id1 为两个文档中较小的 id,similarity 为相似度,精确到小数点后 4 位。以任意顺序返回数组均可。示例: 输入: [ [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
链接:https://leetcode-cn.com/problems/sparse-similarity-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
sprintf(res, "%d,%d: %.4f", id1, id2, similarity+1e-9);
,精度问题,参考评论区+1e-9
int sprintf(char *str, const char *format, ...)
发送格式化输出到 str 所指向的字符串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; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算