必考演算法之 Top K 問題

2022-07-03 22:54:16 字數 1400 閱讀 3187

top k 問題是面試中非常常考的演算法題。

8leetcode 上這兩題大同小異,這裡以第一題為例。

題意:

給一組詞,統計出現頻率最高的 k 個。

比如說 「i love leetcode, i love coding」 中頻率最高的 2 個就是 i 和 love 了。

有同學覺得這題特別簡單,但其實這題只是母題,它可以公升級到系統設計層面來問:

在某電商**上,過去的一小時內賣出的最多的 k 種貨物。

我們先看演算法層面:

思路:統計下所有詞的頻率,然後按頻率排序取最高的前 k 個唄。

細節:用 hashmap 存放單詞的頻率,用 minheap/maxheap 來取前 k 個。

實現:建乙個hashmap

這一步時間複雜度是 o(n).

用 size = k 的 minheap 來存放結果,定義好題目中規定的比較順序

a. 首先按照出現的頻率排序;

b. 頻率相同時,按字母順序。

遍歷這個 map,如果

a. minheap 裡面的單詞數還不到 k 個的時候就加進去;

b. 或者遇到更高頻的單詞就把它替換掉。

時空複雜度分析:

第一步是 o(n),第三步是 nlog(k),所以加在一起時間複雜度是 o(nlogk).

用了乙個額外的 heap 和 map,空間複雜度是 o(n).

**:

class

solution

// step 2

priorityqueue> minheap = new priorityqueue<>(k+1, new comparator>() 

return e1.getvalue().compareto(e2.getvalue());

}});

// step 3

listres = new arraylist<>();

for(map.entryentry : map.entryset()) 

}while(!minheap.isempty()) 

collections.reverse(res);

return res;}}

我是小齊,紐約程式媛,終生學習者,每天晚上 9 點,雲自習室裡不見不散!更多乾貨文章見我的 github:

BFPRT演算法(TOP K問題)

在一大堆數中求其前k大或前k小的問題,簡稱top k問題。而目前解決top k問題最有效的演算法即是bfprt演算法,其又稱為中位數的中位數演算法,該演算法由blum floyd pratt rivest tarjan提出,最壞時間複雜度為o n 在首次接觸top k問題時,我們的第一反應就是可以先...

Top K演算法問題的實現

前奏 中,後來為了論證類似快速排序中partition的方法在最壞情況下,能在o n 的時間複雜度內找到最小的k個數,而前前後後updated了10餘次。所謂功夫不負苦心人,終於得到了乙個想要的結果。簡單總結如下 詳情,請參考原文第三章 1 randomized select,以序列中隨機選取乙個元...

資料排序之TopK問題

前言 在大規模資料處理中,常遇到的一類問題是,在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常稱為 topk 問題 解決思路 針對topk類問題,通常比較好的方案是 分治 trie樹 hash 小頂堆 即先將資料集按照hash演算法分解成多個小資料集,然後使用...