日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。