隨時找到資料流的中位數

2021-10-01 11:22:27 字數 1486 閱讀 4115

題目描述

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

方法方法1:我們收集到資料之後排序,這樣的時間複雜度就是排序的時間複雜度最好也是o(nlogn),無法滿足要求

方法2:使用兩個堆,保證假設排序之後前一半在大跟堆,後一半在小根堆。如果兩個堆的大小相差兩個及以上,將數量較大的那個堆中的堆頂元素放入到另乙個堆中。調整堆結構的代價是log(n)級別的。得到中位數的代價是o(1)。符合要求

示例**

#include

#include

#include

using

namespace std;

class

medianholderif(

this

->maxheap.

top(

)>= num)

elseif(

this

->minheap.

top(

)> num)

else

}modifytwoheapsize()

;}intgetmedian()

throw

(char*)

int maxheaphead =

this

->maxheap.

top();

int minheaphead =

this

->minheap.

top();

if(((maxheapsize + minheapsize)&1

)==0)

return maxheapsize > minheapsize ? maxheaphead : minheaphead;

}private

:void

modifytwoheapsize()

if(this

->maxheap.

size()

+2==this

->minheap.

size()

)}priority_queue<

int, vector<

int>

, less<

int>

> maxheap;

priority_queue<

int, vector<

int>

, greater<

int>

> minheap;};

intmain

(int argc,

char

** ar**)

catch

(char

*errmsg)

system

("pause");

return exit_success;

}

隨時找到資料流的中位數

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

隨時找到資料流的中位數

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

隨時找到資料流的中位數

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