左神基礎班 資料流一直來 判斷所有資料的中位數

2021-09-13 09:09:21 字數 961 閱讀 7467

生成兩個堆:大根堆 和小根堆。

第乙個數 預設放入大根堆。

然後一直有數進來,按照以下邏輯放入兩個堆中:

把進來的數和大根堆的堆頂比較,如果比堆頂小(=),則放進大根堆中。

如果比堆頂大,則放入小根堆。

每次放入都要檢查 當前兩個堆得 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 鏈結資料流 向資料流塊傳...