海量資料Top K演算法(C實現)

2021-05-25 07:51:51 字數 714 閱讀 2492

最近2天受到

的影響,從頭開始實現了這個演算法。收穫還是挺大的:(1)實現了hash鍊錶(2)實現了堆;(3)熟悉了c語言的檔案操作;

海量資料處理的top k 演算法就是在很大的檔案中找出重複出現次數最多的前k個字串;

如果資料可以一次讀入記憶體,那麼可以按照如下思路來解決:

(1)首先遍歷檔案,將其加入hash鍊錶;hash鍊錶的節點定義為:

word指向字串,count為出現的次數;

(2)建立乙個容量為k的最小堆,然後遍歷hash表中剩下的元素;如果找到了乙個元素的count值比這個元素值大,那麼交換這個節點和堆頂節點;

完整全部**如下:在eclipse + cdt + mingw 下除錯通過

程式有待完善的地方:

(1)存在乙個位置bug:改變hashlen的值,程式崩潰;

(2)hash鍊錶的遍歷不正確,應該遍歷到每乙個節點的時候,在判斷該節點的next是否為空;

執行結果:

100000個樹中重複出現次數最多的前5個數:

the top k is as follows

49 , and its count is 372

4 , and its count is 374

249 , and its count is 373

246 , and its count is 380

227 , and its count is 376

海量資料 TopK問題

在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常被稱為topk問題。下面我們通過乙個簡單的例子來說明 假如面試官給你100w個資料,請找出其最大的前k個數,而且現在只有1m的空間?在32位作業系統中,預設乙個位元組為4個位元組,則有下列運算 needsize ...

海量資料topK問題

給你一億個資料,從中找出前k個大的資料。有兩種解決辦法。1.直接將資料從大到小排序,然後取前k個。但是由於資料的數量過於龐大,要開闢很大的空間,很浪費記憶體,所以這種方法不建議使用。2.用堆來解決。要找前k個大的資料,則將待找的元素的前k個元素建立大小為k的小根堆,小根堆的堆頂元素是這k個資料中最小...

海量資料處理 top K

區域性淘汰法 用乙個容器儲存前 10000個數,然後將剩餘的所有數字一一與容器內的最小數字相比,如果所有後續的元素都比容器內的 1000個數還小,那麼容器內的這 10000個數就是最大的 10000個數。如果某一後續元素比容器內的最小數字大,則刪掉容器內最小元素,並將該元素插入容器,最後遍歷完這1億...