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個數,排序結束 若小於...