一組資料中,需要找出前k大(小)的資料
如果是完全有序,那麼輸出所求資料很簡答了(需要排序,將資料完全排序)
使用快排思想,不斷分片,左側是比基準小的元素,右側是比基準大的元素,
令 index=基準元素下標
a, index右側,在index右側尋找新的基數,直到基數的下標index==k
b,index==k 說明第k小元素就是基準元素
c,index>k 說明第k小元素在index左側,在index左側尋找新的基數,直到基數的下標index==k
陣列長度為n,需要找出topk 小
那麼將陣列分為兩部分
將result中的元素挨個與search中比較,如果result小於serch,資料交換
時間複雜度:
public static int topk(int array,int k) throws exception
if(k>array.length||k<=0)
//開始處理快排:如何找基準數?基準數的大小越靠中間越好
int middleindex=getmiddle(array,0,array.length-1);
while(middleindex!=k)
int keyvalue=input[left];
while (left=keyvalue)
if(leftkeyval ,則需要將keyval放到left,left 元素放到keypos
input[left]=keyvalue;
return left;
}
/**
*@author wangwei
*@created 11:17 2018/9/8
*@classname randomutil
*@classdescription 隨機數生成工具類**/
public class randomutil
}
TOP K問題(c 實現)
top k問題 c 實現 給定乙個陣列,找出陣列中最大的k個數或者最小的k個數,稱為top k問題。這是面試的常考題,解法可以是基於最大堆 最大堆排序 基於快速排序實現等等,文字基於快速排序的思想實現。我們不會採用快速排序的演算法來實現top k問題,但我們可以利用快速排序的思想,在陣列中隨機找乙個...
Top K演算法問題的實現
前奏 中,後來為了論證類似快速排序中partition的方法在最壞情況下,能在o n 的時間複雜度內找到最小的k個數,而前前後後updated了10餘次。所謂功夫不負苦心人,終於得到了乙個想要的結果。簡單總結如下 詳情,請參考原文第三章 1 randomized select,以序列中隨機選取乙個元...
堆排序與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...