對頂堆,求第K大的數

2021-09-05 09:11:59 字數 1416 閱讀 2271

對頂堆,顧名思義就是兩個相對的堆。o(logn)

0即上方是乙個維護最小值的小根堆smheap,下方則維護最大值的大根堆bgheap。

利用這樣的性質,我們就可以求中位數、動態維護k大值。優先佇列是用堆來實現的。

思路:(我們必須保證小根堆裡面的所有值是大於大根堆裡面所有值的)

1. 如果要插入的值x>smheap.top(),那麼就往smheap裡面放。

2. 如果要插入的值x<=smheap.top(),那麼就往bgheap裡面放。

3. 如果smheap.size() == bgheap.size() + 2,那麼就把smheap的堆頂元素移入bgheap

4. 如果bgheap.size() == smheap.size() + 2,那麼就把bgheap的堆頂元素移入smheap

priorityqueuepq = new priorityqueue<>(); //小根堆

priorityqueuepq1 = new priorityqueue<>(new comparator() else else }}

});//大根堆

public double findmediansortedarrays(int nums1, int nums2)

for (int i = 0; i < nums2.length; i++)

if(pq.size() == pq1.size() + 1) return pq.peek();

else if(pq1.size() == pq.size() + 1) return pq1.peek();

return (pq.peek() + pq1.peek()) / 2.0;

}private void insert(int x) else

if(pq.size() == pq1.size() + 2) else if(pq1.size() == pq.size() + 2)

}

第k大數

一、 nth_element(first,nth,last)stl中的乙個函式時間複雜度是o(n)

主要實現:利用快排的思想,在[l,r]上,通過線性的掃瞄交換,使[l,mid)的元素都比mid小,(mid,r]的元素都比mid大,此時mid上的元素就是第mid小的元素,然後判斷k在mid的哪邊,在進行遞迴處理。

實際上也就是每次只處理一半的範圍。

二、維護乙個k大小的最小堆,這種方法可以用於資料量存放不下,極大減小了空間複雜度。

三、利用hash儲存陣列中元素si出現的次數,利用計數排序的思想,線性從大到小掃瞄過程中,前面有k-1個數則為第k大數,平均情況下時間複雜度o(n)

海量資料(top k)

求第K大的數

已知 n個數字各不相同,求其中第 k大的數是多少?1 k n 10000 這是一道簡單的試題,我們完全可以套用常用的快速排序模型來解決,即對所有數字進行排序,然後取出第 k大的數字輸出即可,該演算法的時間複雜度為o nlog2n 快速排序的基本思想關鍵在於不斷調整使分治點左邊的數不大於 或不小於 分...

求第k大的數

求第k大的數 給定乙個長度為n 1 n 1,000,000 的無序正整數序列,以及另乙個數k 1 k 1,000,000 關於第k大的數 例如序列中第3大的數是4。輸入第一行兩個正整數m,n。第二行為n個正整數。輸出第k大的數。樣例輸入 copy 6 31 2 3 4 5 6 樣例輸出 copy 4...

對頂堆(動態維護第k大 小)

對於動態維護第k小的問題,可以用乙個size為k的大根堆,來維護,大根堆的頂部元素即第k小元素,維護大根堆需要乙個小根堆,由小根堆向大根堆傳遞元素,即對頂堆。若當前大根堆size為k,第k 1小元素即小根堆的頂部元素 題目描述 保證b為增序 ac include include include in...