私は質問を読み、それを解決する方法についての入力を探しています。
数値はランダムに生成され、(拡張)配列に格納されます。中央値をどのように追跡しますか?
問題を解決できる2つのデータ構造があります。1つはバランスのとれたバイナリツリーで、もう1つは2つのヒープで、要素の最大の半分と最小の半分を追跡します。これら2つのソリューションの実行時間はと同じだと思いますO(n lg n)
が、自分の判断はわかりません。
中央値を追跡する最良の方法は何ですか?
私の試み:
この質問では、中央値を追跡するにはヒープが最良の方法だと思います。大きなヒープと小さなヒープの2つのヒープがあり、これらは順次である必要はありません。まず、配列の要素の平均値を計算します。要素が平均値より小さい場合は、numを小さなヒープに入れます。逆に、numを大きなヒープに入れました。大きいヒープの数が小さいヒープの数と等しい場合、小さいヒープの最大のヒープと大きいヒープの最小のヒープが中央値になります。2つのヒープのサイズが異なる場合は、大きいサイズのヒープからルート要素をポップし、小さいサイズのヒープのルートにプッシュします。大きなヒープの場合、ルート要素は最小の要素であり、小さなヒープの場合、ルート要素は最大の要素です。このようにして、2つのヒープのサイズが同じであるか、デジタル差がある場合、
このソリューションの実行時間はO(m * n)であると思います。mは、アンバランスヒープを調整する時間を意味します。
これは中央値を追跡する最良の方法ですか?
std::nth_element
誰か?