面試題中經常用到堆,這裡總結一下。
方法一:對源資料中所有資料進行排序,取出前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...