[解決済み] 優先キューを用いた中央値の算出
2022-02-17 23:53:13
質問
中央値の計算を要求されています。この特定のアプリケーションでこれを行うには、優先キューを使用するのが最良の方法であると言われました。どのように進めればいいのか、まったくわかりません。何か手助けがあれば本当に感謝します。
解決方法を教えてください。
これでいいのです。中央値より大きい番号と小さい番号の2つの優先キューを維持する。2つのキュー間の値をバランスするか、バランスに近い状態になるようにシフトし、優先キューの上位の値に基づいて中央値を定義する。
#include <queue>
#include <vector>
#include <functional>
#include <limits>
#include <iostream>
template<class T>
class RunningMedian {
private:
//Values greater than the median sorted so that smallest is on top
std::priority_queue<T, std::vector<T>, std::greater<T> > upper;
//Values smaller than the median sorted so that greatest is on top
std::priority_queue<T, std::vector<T>, std::less<T> > lower;
public:
RunningMedian(){
//Seed the queues
upper.push(std::numeric_limits<T>::max());
lower.push (std::numeric_limits<T>::min());
}
void push(T val){
//Add number to the property queue
//If number is greater than the least upper number, it is an upper number
if(val>=upper.top())
upper.push(val);
else //Otherwise it is a lower number
lower.push(val);
//Rebalance
//If the queues sizes differ by 2, they need to be rebalanced so that they
//differ by 1.
if(upper.size()-lower.size()==2){ //Upper queue is larger
lower.push(upper.top()); //Move value from upper to lower
upper.pop(); //Remove same value from upper
} else if(lower.size()-upper.size()==2){ //Lower queue is larger
upper.push(lower.top()); //Move value from lower to upper
lower.pop(); //Remove same value
}
}
T getMedian() const {
if(upper.size()==lower.size()) //Upper and lower are same size
return(upper.top()+lower.top())/((T)2.0); //so median is average of least upper and greatest lower
else if(upper.size()>lower.size()) //Upper size greater
return upper.top();
else //Lower size greater
return lower.top();
}
};
int main(){
RunningMedian<int> rm;
rm.push(10);
rm.push(3);
rm.push(1);
rm.push(20);
rm.push(5);
rm.push(8);
rm.push(-1);
std::cout<<rm.getMedian()<<std::endl; //Gives 5
}
関連
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】C++ シングルトンデザインパターン
-
[解決済み】MySQLで中央値を計算する簡単な方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む