System-Design高頻:Top K 問題

普通版尋找Top-K問題

用HashMap+priorityQueue

HashMap<key, 次數(shù)>

然后根據(jù)HashMap的每個(gè)Key 創(chuàng)建Node,Node里面包含data和frequency信息。

然后把Node放入PriorityQueue里,comparator按照frequency來存儲。


進(jìn)階版:如果Input的data很大,Single Machine的內(nèi)存裝不下

Naive做法就是直接分成好幾個(gè)部分分配個(gè)多臺機(jī)器

但是這里錯(cuò)誤很明顯!

假設(shè)Google被分到各個(gè)機(jī)器了。然后每個(gè)機(jī)器算出每臺的Top K。Google雖然總次數(shù)排名第一,但是分散到了每個(gè)機(jī)器在每個(gè)機(jī)器都不是第一,這樣我們的結(jié)果就是錯(cuò)的!


所以應(yīng)該:





這里其實(shí)是不對的,NBA總次數(shù)有30呢!而且NBA其實(shí)也沒用group到一臺機(jī)器。

Divide-rehash:


進(jìn)階:

如果是實(shí)時(shí)計(jì)算Top-K







空間大部分會留給那些熱搜度很低的詞,很浪費(fèi)。所以用Approx Top K

之前是每個(gè)單詞有一個(gè)空間。現(xiàn)在是按hash來分空間。同一個(gè)Hash的都去一個(gè)地方。

這樣有可能會有一些error 比如說單詞A出現(xiàn)99次,單詞B沒出現(xiàn)過 但是由于hash一樣,它直接你能夠算作出現(xiàn)了99+1次

Solution:




別的方法:

Map-reduce的word count

還是會用到treeMap. 當(dāng)mapreduce每算出一個(gè)key的結(jié)果,先存在Map里,如果有更高的結(jié)果,再把之前的kick out。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,288評論 0 16
  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過大量細(xì)致的優(yōu)化后,收錄于我的新書《編程之法》第六章中,新書...
    Helen_Cat閱讀 7,455評論 1 39
  • 進(jìn)藏第五天,林芝不愧為藏區(qū)的小江南,隨著海撥的降低,終于擁有了一個(gè)入藏以來最舒服的睡眠。 然而人總是有惰性的,隨著...
    墨莫0801閱讀 313評論 0 1
  • 新加的讀書群,要求昵稱用實(shí)名不用網(wǎng)名。我告訴他們說,我用的是我的字,不是網(wǎng)名。但是字這種事物,現(xiàn)在是不普及的,要求...
    金明啊閱讀 153評論 0 0