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;//文档片段,含有该片段的文档idfor(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,sameValueint 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;}
};

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

  1. 程序员面试金典 - 面试题 10.02. 变位词组(哈希map)

    1. 题目 编写一种方法,对字符串数组进行排序,将所有变位词组合在一起. 变位词是指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", ...

  2. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  3. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  4. 程序员面试金典 - 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...

  5. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  6. [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]

    [问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...

  7. 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)

    1. 题目 编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数. 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 ...

  8. 程序员面试金典 - 面试题 17.13. 恢复空格(DP+Trie树)

    文章目录 1. 题目 2. 解题 2.1 动态规划 2.2 Trie树 1. 题目 哦,不!你不小心把一个长篇文章中的空格.标点都删掉了,并且大写也弄成了小写. 像句子"I reset th ...

  9. 程序员面试金典 - 面试题 17.17. 多次搜索(Trie树)

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 Trie树 1. 题目 给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串, ...

最新文章

  1. 大数据,正在到来的数据革命——涂子沛
  2. 感受野receptive field个人理解
  3. 【Python】tqdm创建进度条
  4. WPF插件开发:使用FrameworkElementAdapters时VS报错的问题
  5. Vue过渡 动画混入
  6. 第九十七期:新版Kite:实时补全代码,Python之父都发声力挺!
  7. Linux的铜墙铁壁:防火墙之iptables
  8. react循环的值为什么要有key_糊盒粘箱为什么要检查表面覆膜电晕值
  9. Python Itsdangerous
  10. 郑州大学Oracle期末,郑州大学软件学院2011到2012学年第二学期Oracle期末试卷.doc
  11. 网络摄像头 java_在Java中从网络摄像头捕获图像?
  12. 利用python批量处理Word文件——正文、标题
  13. 样式中的url加载探疑
  14. Kaggle电影数据集:movies_metadata.csv
  15. 【终结版】小家电安规要求以及世界各国安规认证知识分享
  16. 最新全套web前端开发VIP40g项目实战
  17. Java的特征/特点(全)
  18. SCAU 1028 求素数
  19. Linux环境下使用迅雷下载(Xware)
  20. 在线打开 word、excel、pdf 文件

热门文章

  1. 利用Sqoop在数据库和Hive、HDFS之间做ETL操作
  2. MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法
  3. C++ virtual 析构函数
  4. c++面试常考的知识点汇总
  5. matlab穆尔,基于matlab(矩阵实验室)的倒立摆控制系统仿真(34页)-原创力文档
  6. python学习笔记(二十)初识面向对象
  7. Sqlite学习笔记(五)SQLite封锁机制
  8. lz4压缩算法--速度之王
  9. 图文讲解5G调制,特别通俗易懂!
  10. Linux内核LED子系统、请务必看