求海量個無序整數的中位數

2021-06-26 22:50:00 字數 499 閱讀 2711

在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。

不妨假設10g個整數是64bit的。

2g記憶體可以存放256m個64bit整數。

我們可以將64bit的整數空間平均分成256m個取值範圍,用2g的記憶體對每個取值範圍內出現整數個數進行統計。這樣遍歷一邊10g整數後,我們便知道中數在那個範圍內出現,以及這個範圍內總共出現了多少個整數。

如果中數所在範圍出現的整數比較少,我們就可以對這個範圍內的整數進行排序,找到中數。如果這個範圍內出現的整數比較多,我們還可以採用同樣的方法將此範圍再次分成多個更小的範圍(256m=2^28,所以最多需要3次就可以將此範圍縮小到1,也就找到了中數)。

摘自:

注: 文中提到,

如果中數所在範圍出現的整數比較少,我們就可以對這個範圍內的整數進行排序,找到中數。

此處也可以轉換成另乙個問題:找出在無序陣列第k小的數字。即在此範圍內,利用快速排序的思路,以達到o(n)。

海量資料求中位數

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

5億個無序整數 找中位數

有5億個整數,沒有排序。找到他們的中位數 使用雙層桶劃分 分而治之 的策略。假設題目中指的是32位的無符號整數,共有2 32個數字。我們將2 32這個範圍劃分成2 10個區域。對資料進行第一次掃瞄,統計各個落到各個區域內的數字的個數。第一次掃瞄後,通過統計就可以知道,中位數在哪個區域內,以及它是這個...

無序陣列求中位數

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...