劍指offer 41 資料流中的中位數

2021-10-12 10:18:50 字數 1091 閱讀 6478

這道題涉及到對堆這個資料結構的使用,落實到**上實際使用的是優先佇列(優先佇列底層可以通過堆來實現)。

題目描述

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數

值排序之後中間兩個數的平均值。

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

void addnum(int num) - 從資料流中新增乙個整數到資料結構中。

double findmedian() - 返回目前所有元素的中位數。

示例:輸入:

[「medianfinder」,「addnum」,「addnum」,「findmedian」,「addnum」,「findmedian」]

[,[1],[2],,[3],]

輸出:[null,null,null,1.50000,null,2.00000]

解析

這道題需要設計乙個資料結構來完成快速的中位數的獲取。

當然了,乙個最基礎的想法就是每次插入新資料之後都對資料進行排序,然後獲取中位數。但這樣的代價太大了,明顯不可取。

為此,使用兩個堆來儲存不斷流入的資料流,乙個大根堆和乙個小根堆。

其中,大根堆中的資料要始終小於小根堆中的資料,大根堆的堆頂資料是該堆中資料的最大值,小根堆的堆頂是該堆中資料的最小值。當資料總數為奇數時,小根堆資料數量比大根堆數量多1,當總數為偶數時,兩個堆資料量一致。

當要獲取資料中位數時:

code

class

medianfinder);

count =0;

}public

void

addnum

(int num)

else

}public

double

findmedian()

}

劍指 Offer 41 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例...

《劍指offer》 41 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...

劍指Offer41 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 輸入...