topK問題分析與實現

2021-08-27 13:49:49 字數 1026 閱讀 2345

一組資料中,需要找出前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...