1.topk
找前 k 個最大的,建小堆,堆的大小為k找前 k 個最小的,建大堆,堆的大小為k
public
class
topktestdemo})
;//2.遍歷陣列
for(
int i =
0;i < array.length;i++
)else}}
}//走到這裡,minheap中已經儲存了前k個最大的
//列印
for(
int i =
0; i/** * 測試topk
*/public
static
void
main
(string[
] args)
;topk
(array,3)
;}}
2.找第k小的元素建立大小為k的大堆,陣列遍歷完成後,留在堆頂的就是第k小的元素3.堆排序
從小到大排序---->建大堆從大到小排序---->建小堆
時間複雜度:o(n*logn)無論好壞空間複雜度:o(1)
/**
* 從小到大排序----》建大堆
*/public
class
duipaixv
//走到這裡,child 一定是左右孩子最大值的下標
//然後比較父親和孩子誰大,做交換
if(array[child]
> array[parent]
)else}}
//建立大根堆
public
static
void
createbigheap
(int
array)
}public
static
void
heapsort
(int
array)
}public
static
void
main
(string[
] args)
;heapsort
(array)
; system.out.
println
(arrays.
tostring
(array));
}}
topk 堆排序 小頂堆
問題描述 假設需要我們在一堆海量資料中找出排名前k的資料 最好的方法是用最小堆排序,直接用前k個資料建立乙個小頂堆,然後遍歷剩餘的數,如果此數 堆頂的數,則將此數和堆頂的數交換,然後從堆頂向下調整堆,使其重新滿足小頂堆。說明 堆的儲存 一般用陣列來表示堆,第i個節點的父節點下標為i 2 1 它的左右...
堆排序的應用 TOPK問題
我們知道堆有大根堆和小根堆兩種,那麼在解決找堆中k個最大值的問題時應該用大根堆還是小根堆呢?答案是找k個最大的,要建立k大小的小堆。思路如下 比如下面這個陣列,要去取出其中最大的四個值,然後將後面的值與堆頂值比較,若大於堆頂值則彈出堆頂,將新的值加入堆 重複這個步驟,堆中的值會整體增大,陣列遍歷完後...
演算法基礎 二 topK問題 堆排序應用
package algorithm topk問題 例如,有1億個浮點數,如何找出其中最大的10000個?運用堆排序解決top k問題 top k問題就是在一堆資料中選擇前k大 前k小 的資料。做法有許多,可以先把所有資料排序,然後選前k個。然後用堆排序解決top k問題則不用先全部排序,只需維護乙個...