海量資料找到中位數 大堆 小堆

2021-10-05 04:33:26 字數 688 閱讀 8177

我們分別定義a_max,a_count,b_min,b_count

a_max:表示位元組流較小的那一半數字所組成的大頂堆(記為堆a)的堆頂

a_count:表示上述大頂堆元素個數

b_min:表示位元組流較大的那一半數字所組成的小頂堆(記為堆b)的堆頂

b_count:表示上述小頂堆元素的個數

其中我們需要保證a_count = b_count或a_count=b_count+1

那麼位元組流的中位數必定是由a_max和b_min求出

1.若陣列個數為奇數,那麼中位數為a_max

2.若陣列個數為偶數,那麼中位數為(a_max+b_min)/2

過程:1.

遍歷陣列v[i]

若v[i] < a_max,交換兩者

若v[i] > b_min,交換兩者

最終得到 a_max < v[i] < b_max

2.若a_count==b_count,那麼將v[i]加入大頂堆a

a_max = v[i]

++a_count

若a_count=b_count+1,那麼將v[i]加入小頂堆b

b_min = v[i]

++b_count

3.最終,中位數一定能從a_max和b_min得到(根據陣列個數為奇偶數判斷)

時間複雜度:o(n)

空間複雜度:o(1)

海量資料找中位數

題目如下 只有2g記憶體的pc機,在乙個存有10g個整數的檔案,從中找到中位數,寫乙個演算法。給出了四種方法來解決 演算法 1.利用外排序的方法,進行排序 然後再去找中位數 2.另外還有個思路利用堆 先求第1g大,然後利用該元素求第2g大,然後利用第2g大,求第3g大.當然這樣的話雖不需排序,但是磁...

海量資料求中位數

參考 1.最簡單 排序 2.堆 4g資料,1g記憶體 步驟 先將1g記憶體都塞進乙個大頂堆,然後小於堆頂的數,插入堆,並pop堆頂,一次遍歷後,得到第1g大的數 第二次遍歷,過濾小於第1g大的數,同樣塞滿乙個1g的大頂堆,小於堆頂的插入堆,並pop堆頂,得到第2g大的數字 3.二分 統計 比如數字範...

O n 時間找到中位數

最直觀的方法是先排序再取中位數,時間複雜度 o n log n 然而最近才得知中位數有時間複雜度 o n 的演算法,事實上任意順序統計量都可以用 o n 時間找出.記待排序的數列 a a 0,dots,a 其子列 a p,dots,r a p,dots,a r 類似快排的方法,找第 i 小的元素.d...