面試 算法題

  • 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. 根據需要對小根堆中的所有元素繼續利用堆排序算法進行排序。

發佈了33 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章