1. 程式人生 > >找出n個數中最大的m個數的一些解決辦法

找出n個數中最大的m個數的一些解決辦法

方法1:

排序後直接選出,這樣時間開銷為O(NlogN)

方法2:

先用選第k大元素的方法選出第k大元素(具體可以參考選第k大元素的那篇BLOG),按Knuth的說法,時間開銷是O(n),這樣的話,如果我們找到第n-m大的元素,設其為a,然後順序掃描一遍原序列,即可以得到最大的m個數,這樣做的前提是序列中沒有重複元素。時間開銷為O(n)

方法3:

構建一個m元最小堆,然後依次比較後續元素與堆頂元素的大小,如果小,則捨棄;如果大,則修改堆頂元素為新元素,然後調整堆結構。

這樣做的時間開銷為O(mlogm+(n-m)logm),實際當中,(n-m)logm這一項的係數應該會比(n-m)小很多。