ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)

2020-04-18 13:40:17  阅读:312  来源: 互联网

标签:map 面试题 similarity docs id2 id1 second 文档 哈希


1. 题目

两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。

例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。

给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。

请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。
请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。

输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。

返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 {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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sparse-similarity-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 题目说稀疏,最多1000对,考虑相同的 文档内容,后面存储《含有该内容的文档 id》
  • sprintf(res, "%d,%d: %.4f", id1, id2, similarity+1e-9);,精度问题,参考评论区+1e-9
  • C 库函数 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;
    }
};

在这里插入图片描述

标签:map,面试题,similarity,docs,id2,id1,second,文档,哈希
来源: https://blog.csdn.net/qq_21201267/article/details/105571936

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有