演算法基礎 二 topK問題 堆排序應用

2021-08-27 03:06:24 字數 788 閱讀 5005

package algorithm;

/* * topk問題:例如,有1億個浮點數,如何找出其中最大的10000個?

* 運用堆排序解決top k問題

top k問題就是在一堆資料中選擇前k大(前k小)的資料。做法有許多,可以先把所有資料排序,然後選前k個。

然後用堆排序解決top k問題則不用先全部排序,只需維護乙個大小為k的堆即可。

實現思路:

如果要選出前k大,則將資料中的前k個元素建立成乙個小根堆,從第k+1個元素開始往後依次比較,如果元素大於小根堆的堆頂,那麼就和堆頂交換,

交換後重新調整為小根堆。這樣變數一遍所有資料,最後得到的大小為k的小根堆就是前k大的樹。

* */

public class topk ;

int k = 6;

topk(arr,k);

for(int i = 1; i<=k; i++)

} //從k+1開始依次 與小根堆 堆頂比較

public static void topk(int arr, int k)

for(int j = k+1; jarr[1]) arr[1] = arr[j];

shift(arr, 1, k);

} }//堆節點調整方法 詳細見堆排序中

public static void shift(int arr, int low, int high)

if(arr[i]>arr[j])else

} arr[i] = temp;

}}

堆排序與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問題 C

現在有n個數,設計演算法得到前k大的數。k 首先從原列表擷取前k個元素,組成乙個新列表。然後將這個新列表構建成乙個小根堆,那麼根就新列表中最小的數。接著繼續從原列表取出k以後的元素,和小根堆根比對,如果比根小,那麼肯定不屬於前k大的數,如果比根大,替換根,然後做一次向下調整,根重新變成新列表最小的數...

演算法思考 topk問題堆排序 快速排序比較

快速排序求解 這種演算法利用了快速排序的主要思想 每次呼叫快速排序的partition函式後將會得出乙個數n的最終位置,比較n及其右邊所有數的總個數與目標個數k 若大於k,則對數n右邊的數構成的陣列呼叫partition函式 若等於k,則說明n及其右邊的數就是我們想要得到的那k個數,排序結束 若小於...