top N 問題
http://www.poluoluo.com/jzxy/200910/66979.html
(1)直接使用List的Sort方法進行處理。
(2)使用排序二叉樹進行排序,然後取出前N名。
(3)使用最大堆排序,然後取出前N名。第一種方案的性能是最差的,後兩種方案性能會好一些,但是還是不能滿足我們的需求。最主要的原因在於使用二叉樹和最大堆排序時,都是對所有的對象進行排序,而不是將代價花費在我們需要的少數的TopN上
使用一個長度爲N的數組,來存放最Top的N個對象,越Top的對象其在數組中的Index就越小。這樣,每次加入一個對象時,就與Index最大的那個對象比較,如果比其更Top,則交換兩個對象的位置。如果被交換的對象是數組中的最後一個對象(Index最大),則該對象會被拋棄。如此,可以保證容器中始終保持的都是最Top的N個對象
算法(以找最大的n個元素爲例):
1. 取出數組的前n個元素,創建長度爲n的小根堆;
2. 從n開始循環數組的剩餘元素,如果當前元素比小根堆的根節點大,則將當前元素設置成小根堆的根節點,並通過調整讓堆保持小根堆;
3. 循環完成後,小根堆中的所有元素就是需要找的最大的n個元素;
4. 根據需要對小根堆中的所有元素繼續利用堆排序算法進行排序。