隨時找到資料流的中位數

2021-10-12 19:51:20 字數 1572 閱讀 1884

隨時找到資料流的中位數

有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。

[要求]

如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder的過程,其時間複雜度是o(l

ogn)

o(logn)

o(logn

)。取得已經吐出的n個數整體的中位數的過程,時間複雜度為o(1

)o(1)

o(1)

輸入描述:

第一行乙個整數q,表示有q次詢問。

接下來q行,每行有乙個整數opt表示操作型別

若opt=1,則接下來有乙個整數n表示將n加入到結構中。

若opt=2,則表示詢問當前所有數的中位數

輸出描述:

輸出若干行,每行乙個浮點數數表示該次詢問的答案(保留至小數點後一位)

若詢問時資料流中沒有數輸出-1(不需要輸出小數點後的數字)

具體輸出要求請看樣例

示例1輸入

8

1 52

1 32

1 62

1 72

輸出
5.0

4.05.0

5.5

說明
第一次查詢時結構內的數為:5

第二次查詢時結構內的數為:3 5

第二次查詢時結構內的數為:3 5 6

第二次查詢時結構內的數為:3 5 6 7

示例2

輸入

3

21 1

2

輸出
-1

1.0

備註:

1 ⩽q

⩽105

1 \leqslant q \leqslant 10^5

1⩽q⩽1050⩽

ai⩽1

09

0 \leqslant a_i \leqslant 10^9

0⩽ai​⩽

109題解:

對頂堆,乙個大根堆,乙個小根堆。大根堆儲存較小的一半元素,小根堆儲存較大的一半元素,任何時候,乙個堆的元素相比較另乙個堆元素個數,最多大於1。這樣,在求中位數時,根據元素個數奇偶性選擇堆頂即可。

**:

#include

#include

using

namespace std;

intmain

(void

)else qmax.

push

( x );if

( qmax.

size()

> qmin.

size()

+1)else

if( qmin.

size()

> qmax.

size()

+1)}

else

else}}

return0;

}

隨時找到資料流的中位數

題目 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 1 如果medianholder已經儲存了吐出的n個數,那麼任意時刻將乙個新數加入到medianholder的過程...

隨時找到資料流的中位數

題目描述 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 方法方法1 我們收集到資料之後排序,這樣的時間複雜度就是排序的時間複雜度最好也是o nlogn 無法滿足要求 ...

隨時找到資料流的中位數

有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 1.如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder的過程,其時間複雜度...