生成兩個堆:大根堆 和小根堆。
第乙個數 預設放入大根堆。
然後一直有數進來,按照以下邏輯放入兩個堆中:
把進來的數和大根堆的堆頂比較,如果比堆頂小(=),則放進大根堆中。
如果比堆頂大,則放入小根堆。
每次放入都要檢查 當前兩個堆得 size的絕對值是否小於等於1, 如果大於一,則把size較大的堆彈出乙個元素加入到另外乙個堆中。
#include#include#includeusing namespace std;
int main()
}else
} if(s.size() == big.size()){
cout << "now ,the medium is: " << (s.top() + big.top()) /2.0cout << "now ,the medium is: " << s.top() 《為什麼要這樣做呢?
我們解析一下:
我們每次進來乙個數 都要和大根堆的堆頂比較,比他大的放另乙個小根堆裡,比他小的放大根堆裡,
這樣的結果是,小根堆裡存的都是比大根堆大的值。
ok,繼續:
當我們連續進來都是比大根堆頂大的值,則資料一直加入小根堆,沒幾次小根堆的元素個數就超過了大根堆,這是出現問題了啊,生病了啊,得治,醫生一看發現 : 哦,你大根堆的堆頂元素選的值太小的,需要更新乙個更大的值了, 剛好旁邊的小根堆裡存的都是比 大根堆的堆頂大的值, 取小根堆的堆頂就更棒了,取所有比它大的值中最小的取更新。
另外啊,還順便調整了雙方堆內元素的個數,不是很棒嗎。
對於一直進來的都是比大根堆頂小的元素。也是乙個意思,說明大根堆的堆頂選的元素太大了,需要換乙個更小的,且比他小的都在自己這個堆內,所以把堆頂拿走後,重新得到的堆頂就是比原來剛好小一號的值了,也是很棒的。
這樣調整的後果:類似於中位數partition,比它小的都在大根堆裡,比他大的都在小根堆裡。
算中位數還很方便。
ok 88~~
TCP互動資料流 成塊資料流
tcp資料流分類 基於tcp的各類解決方案,可以根據資料吞吐量來大致分成兩大類 1 互動資料型別,例如telnet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。2 資料成塊型別,例如ftp,這種型別的協議要求tcp能盡量的運載資料,把資料的吞吐量做...
C 資料流基礎 建立自定義的資料流塊
建立自己的資料流塊 static ipropagatorblockcreatemycustomblock multiplyblock.linkto addblock,flowcompletion addblock.linkto divideblock,flowcompletion return da...
C 資料流基礎 小例子
需要安裝乙個nuget包 microsoft.tpl.dataflow 建立減2資料流 var subtractblock new transformblock item idisposable link multiplyblock.linkto subtractblock 鏈結資料流 向資料流塊傳...