現在有n個數,設計演算法得到前k大的數。(k
首先從原列表擷取前k個元素,組成乙個新列表。
然後將這個新列表構建成乙個小根堆,那麼根就新列表中最小的數。
接著繼續從原列表取出k以後的元素,和小根堆根比對,如果比根小,那麼肯定不屬於前k大的數,如果比根大,替換根,然後做一次向下調整,根重新變成新列表最小的數,接著繼續從原列表取數比對,直到取到原列表最後。
那麼就可以得到乙個前k大的數字組成的小根堆 ,最後出數
先上一下 成果
**如下
public void topk(listli,int k)
//得到乙個小根堆
printlist(ki,":小根堆");
for (int i = k; i < li.count; i++)//從k開始,從原列表取元素比對
}printlist(ki,":比對完成後的小根堆");
for (int i = n - 1; i > -1; i--)//開始出數,i指向堆的最後乙個元素
printlist(ki, ":前" + k + "個最大的數");
}
堆排序與topK問題
找出乙個有10億數字陣列中,前k個最大值 第一步 hash去重 解法1 劃分法 def partition l,left,right low left if left right key l left high right while low high while low high and l hi...
堆排序的應用 TOPK問題
我們知道堆有大根堆和小根堆兩種,那麼在解決找堆中k個最大值的問題時應該用大根堆還是小根堆呢?答案是找k個最大的,要建立k大小的小堆。思路如下 比如下面這個陣列,要去取出其中最大的四個值,然後將後面的值與堆頂值比較,若大於堆頂值則彈出堆頂,將新的值加入堆 重複這個步驟,堆中的值會整體增大,陣列遍歷完後...
演算法思考 topk問題堆排序 快速排序比較
快速排序求解 這種演算法利用了快速排序的主要思想 每次呼叫快速排序的partition函式後將會得出乙個數n的最終位置,比較n及其右邊所有數的總個數與目標個數k 若大於k,則對數n右邊的數構成的陣列呼叫partition函式 若等於k,則說明n及其右邊的數就是我們想要得到的那k個數,排序結束 若小於...