題 目:若是在N個數中找出其中前K大的數?數組
思路一:分佈式
先對N個數進行排序,而後在取其前K大的數;(冒泡排序,快速排序等)spa
思路二:排序
部分排序,只排除前K大的數便可(使用選擇排序進行部分排序,選擇排序的時間複雜度O(N2))事件
思路三:內存
我能夠用分治法,這有點相似快排中partition的操做。隨機選一個數t,而後對整個數組進行partition,會獲得兩部分,前一部分的數都大於t,後一部分的數都小於t。資源
若是說前一部分總數大於1000個,那就繼續在前一部分進行partition尋找。若是前一部分的數小於1000個,那就在後一部分再進行partition,尋找剩下的數。it
該思路的事件複雜度爲O(N):首先,partition的過程,時間是o(n)。咱們在進行第一次partition的時候須要花費n,第二次partition的時候,數據量減半了,因此只要花費n/2,同理第三次的時候只要花費n/4,以此類推。而n+n/2+n/4+...顯然是小於2n的,因此這個方法的漸進時間只有o(n)。io
思路四:方法
當N的值過大,且內存資源有限,沒法一次讀取所有數據時,能夠考慮分佈式的實現,將數據切分,而後在多臺機器上分別計算前K大的數,最後在把這些數據彙總。
思路五:
使用最小堆思想。即在內存中維護一個有K個數組成的最小堆;根據最小堆每個節點都要比他的左右直接點小的性質:
首先從N個數中取K個數構成最小堆;
而後依次讀取剩餘數據,而且和堆頂元素比較大小,若是比堆頂小,則直接丟棄。若是比堆頂大,就替換堆頂,並調整最小堆;
全部數據都處理完畢後,最小堆就是N個數中前K大的數。
優勢是:數據只須要讀取一次,不會存在數據屢次讀寫的問題;
【思路五的C++實現】
【待更新。。。。】