我們分別定義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...