顧名思義,top k就是從海量的資料中選取最大的k個元素或記錄。基本思想就是維護乙個具有k個元素的小頂堆。每當有新的元素加入時,判斷它是否大於堆頂元素,如果大於,用該元素代替堆頂元素,並重新維護小頂堆,直到所有元素被處理完畢。時間複雜度為o(n*logk),基本達到線性複雜度。部分**如下:
//列印陣列元素
void print(int data, int length)
//維護小頂堆
void modifysmallheap(int data, int location, int length) }
//建立小頂堆
void buildsmallheap(int data, int length) }
//top k演算法的簡單實現
void heapsortk(int data, int length, int topk) }
} 為了便於測試,可以利用隨機數函式構造測試用例。鑑於一切從簡,我就不多說了。
ps:順便貼出乙個小頂堆和大頂堆的
Top K演算法問題的實現
前奏 中,後來為了論證類似快速排序中partition的方法在最壞情況下,能在o n 的時間複雜度內找到最小的k個數,而前前後後updated了10餘次。所謂功夫不負苦心人,終於得到了乙個想要的結果。簡單總結如下 詳情,請參考原文第三章 1 randomized select,以序列中隨機選取乙個元...
海量資料Top K演算法(C實現)
最近2天受到 的影響,從頭開始實現了這個演算法。收穫還是挺大的 1 實現了hash鍊錶 2 實現了堆 3 熟悉了c語言的檔案操作 海量資料處理的top k 演算法就是在很大的檔案中找出重複出現次數最多的前k個字串 如果資料可以一次讀入記憶體,那麼可以按照如下思路來解決 1 首先遍歷檔案,將其加入ha...
原創 fast wcsnicmp 演算法實現
對於做路徑過濾或者檔案過濾驅動的朋友來說,fast wcsnicmp函式可以獲得更佳的效能,在負載重的情況下比較明顯。對比微軟的wcsnicmp函式速度快一倍左右,對於學習演算法優化的朋友,這也是個比較好的例子。size t fastwcsnicmp wchar t first,wchar t se...