java解決topk問題

2021-08-28 21:00:11 字數 1182 閱讀 8299

面試題中經常用到堆,這裡總結一下。

方法一:對源資料中所有資料進行排序,取出前k個資料,就是topk。

但是當資料量很大時,只需要k個最大的數,整體排序很耗時,效率不高。

方法二:維護乙個k長度的陣列a,先讀取源資料中的前k個放入陣列,對該陣列進行公升序排序,再依次讀取源資料第k個以後的資料,和陣列中最小的元素(a[0])比較,如果小於a[0]直接pass,大於的話,就丟棄最小的元素a[0],利用二分法找到其位置,然後該位置前的陣列元素整體向前移位,直到源資料讀取結束。

這比方法一效率會有很大的提高,但是當k的值較大的時候,長度為k的資料整體移位,也是非常耗時的。

對於這種問題,效率比較高的解決方法是使用最小堆

首先建立堆

public

class

heap

public

void

buildheap

()

}public

void

heapity

(int i)

public

intgetleft

(int i)

public

intgetright

(int i)

public

void

swap

(int i,int j)

public

intgetmin

()

public

void

setmin

(int i)

}

測試

public

class

topk

heap heap=

new heap(topk);

for (

int j = k; j < data.length; j++)

return topk;

}public

static

void

main

(string args)

;

int topk=topk(data,

3);for (

int i : topk) }}

Java最小堆解決TopK問題

topk問題是指從大量資料 源資料 中獲取最大 或最小 的k個資料。對於這個問題,解決方法有很多 方法一 對源資料中所有資料進行排序,取出前k個資料,就是topk。但是當資料量很大時,只需要k個最大的數,整體排序很耗時,效率不高。方法二 維護乙個k長度的陣列a,先讀取源資料中的前k個放入陣列,對該陣...

堆解決topK問題

小根堆取的話,複雜度過高o nlogn 資料量過大會超時 class solution 堆排序 小根堆 return ans void heap vector int arr start while start 1 else if arr 2 start 1 arr 2 start 2 else s...

最大堆 最小堆Java實現,解決TOP K問題

最大堆,最小堆類似,以下以最小堆為例進行講解。最小堆是滿足以下條件的資料結構 它是一棵完全二叉樹 所有父節點的值小於或等於兩個子節點的值 除了最後一層之外的其他每一層都被完全填充,並且所有結點都保持向左對齊。對於topk問題,解決方法有很多 方法一 對源資料中所有資料進行排序,取出前k個資料,就是t...