題目描述
有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫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...