劍指offer63 資料流中的中位數

2021-09-11 08:29:14 字數 2542 閱讀 2812

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。

先排序後求解這樣能過:

# -*- coding:utf-8 -*-

class

solution

:def

__init__

(self)

: self.data =

definsert

(self, num)

:# write code here

self.data.sort(

)def

getmedian

(self, data)

:# write code here

length =

len(self.data)

return self.data[length//2]

if length%2==

1else\

(self.data[

(length//2)

-1]+self.data[

(length//2)

])/2.0

可以建立乙個大頂堆加乙個小頂堆,分別存放較小和較大資料:

當兩個堆資料個數為偶數的時候,把數存入最大堆,然後重排最大堆,如果最大堆的堆頂數字大於最小堆堆頂數字,則把兩個堆頂數字交換,重排兩堆,此時兩堆數字總數為奇數,直接輸出最大堆堆頂數字即為中位數;

當兩堆資料總數為奇數的時候,把數存入最小堆,重排最小堆,如果最大堆的堆頂數字大於最小堆堆頂數字,則把兩個堆頂數字交換,重排兩堆,此時兩堆數字總數為偶數,取兩堆堆頂數字做平均即為中位數。

在這裡大小堆不必分別構造,構造乙個另外乙個變換符號即可用:

# -*- coding:utf-8 -*-

class

solution

:def

__init__

(self)

: self.small =

# 小的數,大頂堆

self.big =

# 大的數,小頂堆

self.count =

0# 計數

definsert

(self, num)

:# write code here

if self.count%2==

0:else

:-num)

self.count +=

1def

getmedian

(self, a)

:# write code here

if self.count ==1:

return self.small[0]

self.maxheap(self.small)

self.maxheap(self.big)

# 用大頂堆構建小頂堆,變符號就行

if self.small[0]

>

-self.big[0]

: self.small[0]

, self.big[0]

=-self.big[0]

,-self.small[0]

self.maxheap(self.small)

self.maxheap(self.big)

if self.count%2==

1:return self.small[0]

else

:return

(self.small[0]

-self.big[0]

)/2.0def

maxheap

(self, data)

:# 構建最大堆

for start in

range

(len

(data)//2

-1,-

1,-1

):root = start

while

true

: child =

2*root +

1if child >=

len(data)

:# 無子節點

break

if child+

1<

len(data)

and data[child+1]

> data[child]

: child +=

1# 找較大子節點

if data[root]

< data[child]

: data[root]

, data[child]

= data[child]

, data[root]

root = child

else

:break

return data

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

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。為了保證插入新資料和取...

劍指offer63 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。首先要理解題目,對於乙...

劍指offer 63 樹 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。理解了上面所述的主體思...