找出一個字符串中出現次數最多的字_海量數據中找出前k大數(topk問題)

在海量數據中找出出現頻率最好的前k個數,或者從海量數據中找出最大的前k個數,這類問題通常被稱為top K問題。

針對top K類問題,通常比較好的方案是分治+Trie樹/hash+小頂堆(就是上面提到的最小堆),即先將數據集按照Hash方法分解成多個小數據集,然后使用Trie樹或者Hash統計每個小數據集中的query詞頻,之后用小頂堆求出每個數據集中出現頻率最高的前K個數,最后在所有top K中求出最終的top K。

方法進階:

1、最簡單的方法就是快排,取topk

2、局部淘汰法。用一個容器保存前k個數,然后將剩余的所有數字——與容器內的最小數字相比,如果所有后續的元素都比容器內的k個數還小,那么容器內這k個數就是最大k個數。如果某一后續元素比容器內最小數字大,則刪掉容器內最小元素,并將該元素插入容器,最后遍歷完所有的數,得到的結果容器中保存的數即為最終結果了

3、分治法。將1億個數據分成100份,每份100萬個數據,找到每份數據中最大的10000個,最后在剩下的100*10000個數據里面找出最大的10000個。100萬個數據里面查找最大的10000個數據的方法如下:用快速排序的方法,將數據分為2堆,如果大的那堆個數N大于10000個,繼續對大堆快速排序一次分成2堆,如果大的那堆個數N大于10000個,繼續對大堆快速排序一次分成2堆,如果大堆個數N小于10000個,就在小的那堆里面快速排序一次,找第10000-n大的數字;遞歸以上過程,就可以找到第1w大的數。參考上面的找出第1w大數字,就可以類似的方法找到前10000大數字了。此種方法需要每次的內存空間為10^6*4=4MB,一共需要101次這樣的比較。

4、采用最小堆。首先讀入前10000個數來創建大小為10000的最小堆,建堆的時間復雜度為O(mlogm)(m為數組的大小即為10000),然后遍歷后續的數字,并于堆頂(最小)數字進行比較。如果比最小的數小,則繼續讀取后續數字;如果比堆頂數字大,則替換堆頂元素并重新調整堆為最小堆。整個過程直至1億個數全部遍歷完為止。然后按照中序遍歷的方式輸出當前堆中的所有10000個數字。該算法的時間復雜度為O(nmlogm),空間復雜度是10000(常數)。

以下是一些經常被提及的該類問題。

(1)有10000000個記錄,這些查詢串的重復度比較高,如果除去重復后,不超過3000000個。一個查詢串的重復度越高,說明查詢它的用戶越多,也就是越熱門。請統計最熱門的10個查詢串,要求使用的內存不能超過1GB。
(2)有10個文件,每個文件1GB,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。按照query的頻度排序。
(3)有一個1GB大小的文件,里面的每一行是一個詞,詞的大小不超過16個字節,內存限制大小是1MB。返回頻數最高的100個詞。
(4)提取某日訪問網站次數最多的那個IP。
(5)10億個整數找出重復次數最多的100個整數。
(6)搜索的輸入信息是一個字符串,統計300萬條輸入信息中最熱門的前10條,每次輸入的一個字符串為不超過255B,內存使用只有1GB。
(7)有1000萬個身份證號以及他們對應的數據,身份證號可能重復,找出出現次數最多的身份證號。

最小堆

對于每個非葉子節點的數值,一定不大于孩子節點的數值。這樣可用含有K個節點的最小堆來保存K個目前的最大值(當然根節點是其中的最小數值)。每次有數據輸入的時候可以先與根節點比較。若不大于根節點,則舍棄;否則用新數值替換根節點數值。并進行最小堆的調整。

de75e39a35893d372d84a046843e6ecb.png

Python 小頂堆:

class solution:def topk(self, inputs, k):import heapqif inputs == None or len(inputs) < k or len(inputs) <= 0 or k <= 0:# 注意極限條件的確定return []output = []for number in inputs:if len(output) < k:output.append(number)else:output = heapq.nlargest(k, output)print(output)if number >= output[-1]:output[-1] = numberelse:continuereturn output  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset

1.Contribution&#xff08;1&#xff09;主要是提出了基于GTA5的GCC數據集數據集下載地址&#xff1a;https://gjy3035.github.io/GCC-CL/?gjy3035.github.io&#xff08;2&#xff09;提出了在如何在GCC上train&#xff0c;然后在傳統的通用數據集上test的遷移學習方案&…

代碼更換ui圖片_用技術的方式,在UI設計稿中設置隨機碼,保證高清

本文首發于&#xff1a;行者AI 在工作中會遇到批量給圖片添加文字&#xff0c;隨機碼等需求&#xff0c;當數據碼數量較大時&#xff0c;UI的工作量就會非常大&#xff0c;這時候我們可以用python來幫我們提高工作效率。1. 需求分析我們有這樣一張圖片&#xff0c;我們需要將一…

hash地址_redis中的hash擴容、漸進式rehash過程

背景&#xff1a; redis字典&#xff08;hash表&#xff09;當數據越來越多的時候&#xff0c;就會發生擴容&#xff0c;也就是rehash對比&#xff1a;java中的hashmap&#xff0c;當數據數量達到閾值的時候(0.75)&#xff0c;就會發生rehash&#xff0c;hash表長度變為原來的二…

是什么牌子_水晶項鏈什么牌子好

閱讀本文前&#xff0c;請您先點擊上面的藍色字體&#xff0c;再點擊“關注”&#xff0c;這樣您就可以免費收到最新內容了。每天都有分享&#xff0c;完全是免費訂閱&#xff0c;請放心關注&#xff01; …

什么是機器人的五點校正法_機器人校正方法

機器人校正方法【專利說明】機器人校正方法[0001]本申請案主張于2012年9月18日申請之美國臨時專利申請案第61/702&#xff0c;377號的優先權&#xff0c;所述專利申請案的揭示完整結合于此以供參考。技術領域[0002]本發明涉及一種工件加工&#xff0c;尤其涉及一種用于工件加工…

stn算子_深度學習常用算子(二)

1、Tensor維度變換1)Flatten作用&#xff1a;將輸入tensor中從start_axis維度到end_axis維度合并為1維2)Reshape作用&#xff1a;將輸入Tensor描述轉換為新的shape3)FreespaceExtract作用&#xff1a;將h維變成1&#xff0c;其他維度不變&#xff0c;從而完成對h的采樣&#xf…

iframe異步加載_5種延遲加載圖像的方法以幫助你提升網站性能與用戶體驗

英文 | https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/翻譯 | web前端開發(ID&#xff1a;web_qdkf)由于圖像是Web上最流行也是必不可少的內容類型之一&#xff0c;因此網站上的圖片頁面加載時間很容易成為一個問題。即使進行了適當的優化&…

ubuntu18安裝python3.6.8_ubuntu 18.04 + Python 3.6.8 更換軟件安裝源

國外的開源項目開展的是如火如荼&#xff0c;我們國內的當然也不甘落后。為了更好的玩轉 Python&#xff0c;我使用了 ubuntu Linux 來作為開發環境。但是由于國內網絡的限制&#xff0c;訪問國外的一些軟件源的時候&#xff0c;速度比較慢&#xff0c;這時我們需要更換成國內的…

springframework報錯_應對報錯信息的必殺技!

今天遇到了一個錯誤&#xff0c;一般的錯誤提示會很明顯&#xff0c;一看就知道是什么問題。今天遇到的這個說實話真的不好找原因&#xff0c;一般在這種情況下該怎么解決呢&#xff1f;分享下我的思路吧&#xff0c;不一定是最好的&#xff0c;至少有用。直接上圖吧&#xff0…

電腦運行卡頓怎么處理_【眾點學】電腦運行PS卡頓?可能是你的虛擬內存沒設置好!...

不少小伙伴都遇到過這樣的煩惱明明自己的電腦擁有大內存PS用著用著就卡頓了經過教體君的仔(bai)細(du)研(yi)究(xia)發現原來電腦的 虛擬內存 只有2G當我們用大型軟件或玩大型游戲電腦越用越卡時該怎么做&#xff1f;今天【眾點學】我們一起來看看Win7和Win10系統下分別如何設置…

線程池拒絕策略 開發中常用什么策略_面試官:說說你知道多少種線程池拒絕策略...

往期文章為什么阿里Java規約要求謹慎使用SimpleDateFormathttps://www.toutiao.com/i6696127929048367629/為什么我強烈推薦你用枚舉來實現單例模式https://www.toutiao.com/i6696861933687013901/為什么不要在MySQL中使用UTF-8編碼方式https://www.toutiao.com/i6697966437727…

css html 雙面打印_從 Linux 命令行進行打印 | Linux 中國

導讀&#xff1a;在 Linux 命令行進行打印的內容比單單一個 lp 命令多得多&#xff0c;讓我們來看一些可用選項。       本文字數&#xff1a;4305&#xff0c;閱讀時長大約&#xff1a;5分鐘https://linux.cn/article-13012-1.html作者&#xff1a;Sandra Henry-stocker譯…

python保存快捷鍵是什么_python常用快捷鍵

最重要的快捷鍵1. ctrlshiftA:萬能命令行2. shift兩次:查看資源文件新建工程第一步操作1. module設置把空包分層去掉,compact empty middle package2. 設置當前的工程是utf-8,設置的Editor-->File Encodings-->全部改成utf-8,注釋1. ctrl/:單行注釋光標操作1. ctrlaltent…

服務器內存超限問題_服務器內存爆滿最佳處置方案

內存爆滿截圖&#xff1a;分析&#xff1a;內存持續飆升&#xff0c;應該是有大量內存一直沒有釋放&#xff0c;考慮僵尸對象&#xff0c;僵尸進程&#xff0c;最簡單的就是重啟服務器&#xff0c;但是就無法找到罪魁禍首了。驗證&#xff1a;top命令查看活躍進程的資源使用情況…

js map對象遍歷_何時使用 Map 來代替變通的 JS 對象

JS 普通對象 {key: value} 用于存放結構化數據。但有一件事我覺得很煩:對象鍵必須是字符串(或很少使用的 symbol)。如果將數字用作鍵會怎樣&#xff1f;在這種情況下不會有錯誤&#xff1a;const names { 1: One, 2: Two,};Object.keys(names); // > [1, 2]JS 會隱式地將…

mysql怎么顯示結果窗口_mysql8中窗口函數

在以前的MySQL版本中是沒有窗口函數的&#xff0c;直到MySQL8.0才引入了窗口函數。窗口函數是對查詢中的每一條記錄執行一個計算&#xff0c;并且這個計算結果是用與該條記錄相關的多條記錄得到的。1.窗口函數與聚合函數窗口函數與聚合函數很像&#xff0c;他們都是在一組記錄而…

python控制臺輸入字符串作為參數_Python-如何將字符串傳遞到subprocess.Popen(使用stdin參數)?...

小編典典Popen.communicate() 說明文件&#xff1a;請注意&#xff0c;如果要將數據發送到進程的stdin&#xff0c;則需要使用stdin PIPE創建Popen對象。同樣&#xff0c;要在結果元組中獲得除None以外的任何內容&#xff0c;你還需要提供stdout PIPE和/或stderr PIPE。替換…

log4jdbc mysql_[簡單]log4jdbc-log4j2配置簡記_MySQL

log4jdbc-log4j2&#xff0c;就不多說了&#xff0c;不了解的可以谷歌&#xff0c;附上log4jdbc-log4j2的官方鏈接&#xff1a;https://code.google.com/p/log4jdbc-log4j2/ &#xff0c;上面有非常詳細的介紹。簡單的貼下配置文件&#xff0c;其他的見附件&#xff1a;databas…

vb實時錯誤6 溢出_java內存溢出系列(6): Out of swap space?

本文是java內存溢出系列第6小篇。JVM啟動參數指定了最大內存限制。如 -Xmx 以及相關的其他啟動參數. 假若JVM使用的內存總量超過可用的物理內存, 操作系統就會用到虛擬內存。錯誤信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交換空間(swap space,虛擬內存) 不…

java備份還原mysql數據庫_Java備份還原Mysql數據庫

///實體類package com.ews.util;/*** 系統備份展示對象** */public class DataFile {private String fileName;//備份文件的名稱private String fileDate;//備份文件的日期private String filePath;//備份文件的地址private String fileSize;//備份文件的大小public String get…