堆的應用 topK演算法和堆排序

2021-10-18 21:30:31 字數 1380 閱讀 9540

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問題則不用先全部排序,只需維護乙個...