大資料處理 求中位數

2021-06-19 09:12:49 字數 1104 閱讀 8973

中位數並不是大小位於中間的數,而是排序之後,位置位於中間的數。

若是n個數,n為奇數,則中位數是陣列a[ ]排序之後 a[(n+1)/2] ; 若n為偶數,中位數是(a[n/2] + a[n/2+1])/2

如: 5 5 5 6 7 8 9 中位數是6

題目:只有2g記憶體的pc機,在乙個存有10g個整數的檔案,從中找到中位數,寫乙個演算法

對於海量資料求中位數,在網上看到兩種方法。

1)分區間堆排序:

在現有m大小記憶體情況下若最多能夠造出包含p個資料的堆,則先掃瞄一次這n個資料找到最小的p個數,耗時o(nlog(p)),設這p個數中最大的數是a,將堆清空,在第二輪掃瞄出比a大的中最小的p個數,然後在把a改為記錄這p個數中最大的數,依次類推,直到計算到某一輪p個數和之前夠造出的數的個數大於n/2,在這p個數中找到所有數中的中位數,耗時的地方是每輪掃瞄構建堆都要用了o(nlog(p)),構造的次數為n/(2*p),所以它的時間複雜度是o(n*n*log(p)/(2*p)).

2)基於段的計數

基於段的計數指的的是對乙個區間範圍的計數,與計數排序不同的是後者對每乙個數出現次數的計數,而前者是對出現在某一區間範圍內的數計數,段的大小取決於記憶體大小和每段計數器所佔的位元組數,而計數器大小又受總資料量有關,需滿足計數器的最大計數能夠大於最大個數n,

比如本題中記憶體大小是m個位元組,而n的大小至少需要用logn位來表示,設k個位元組表示的無符號整數可以最大值大於n,則放在記憶體中計數器個數是m/k,設q=m/k,即這n個數分為q個段,每一段的大小是n=n/q,第一段數的範圍是0~n-1,第二段是n~2*n-1,依此類推。現在我們可以從硬碟中逐個掃面這n個數,根據每個數的大小來修改他們對應範圍的計數器,需要用o(n)時間完成對這q個段的計數。然後從第一段開始往後掃瞄累加每個段的計數器,直到累加到某一段的計數器使得它和這之前的個數大於n/2,假設這個段所表示的範圍是q~q+n-1,那麼這n個數的中位數就在q~q+n-1這個範圍內,現在更改計數器的屬性不在基於段而是基於每個數,且只針對q~q+n-1這n個數計數,還需要一輪掃面n個數來完成對n個計數器的確定,在本段之前的段計數器計數之和是t,tn/2那乙個計數器,它所代表的數就是這n個數的中位數。

海量資料求中位數

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

大資料中位數怎麼運算 計算大資料的中位數

題目 在乙個大檔案中有10g個整數,亂序排列,要求找出中位數 記憶體有2g限制,不能一次全部加裝 請寫出演算法設計思路。中位數的定義 對於乙個排序好的序列,如果資料有奇數個的話,中位數就取中間的乙個 如果有偶數個的話,中位數一般取中間兩個數的平均值。解題 思路一 堆排序 轉換為求前5g大的元素 堆排...

大資料處理

大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...