一連のデータを(重複して)与え、データ・シーケンスに沿ってフィックス・サイズのウィンドウを移動し、各iteraionのウィンドウでモードを検索します。データが削除され、新しいデータがウィンドウに挿入されます。重複したデータの長いシーケンスのローリング・ウィンドウでモードを見つける
私はここでより良い解決策を見つけることができません。
私の考え: ハッシュテーブルを使用してください、キーはデータです、キーのデータは、ウィンドウで発生しているデータの頻度です。
最初の反復では、ウィンドウ内の各データを繰り返し、ハッシュテーブルに格納し、各データの頻度を計算します。その後、ハッシュテーブルをトラバースし、最も頻度の高いデータを返します。 ハッシュテーブル内の最も古いデータを検索し、ハッシュテーブル内にあればその頻度を1減らします。0の場合は新しいデータを使用して古いデータを置き換えます。さもなければ、新しいデータをhahstableに挿入するだけです。テーブルを走査してモードを戻します。
O(n * m)ここで、nはデータのseqサイズ、mはウィンドウサイズです。 欠点は次のとおりです。ハッシュテーブルのサイズが固定されていない、オーバーヘッドのサイズが変更されている可能性があります。各反復、テーブルは横断されなければならない、それはエフェクトではない。
O(n lg m)またはO(n)で行うのは可能でしょうか?
何か助けていただければ幸いです。
おかげ
別の解決策:最初の反復で 、キーに関連付けられた値として、キーとその頻度などのデータとハッシュテーブルを構築します。ハッシュテーブルの基底で、キーとしての周波数と関連データを値として持つマルチマップを構築します。
その後、各繰り返しで、ウィンドウ内で最も古いデータを削除してハッシュテーブルを更新し、マルチマップを最新のハッシュテーブルで更新します。マップキーに複数のデータがある場合は、新しいものを周波数が変更されていないデータのみで置き換えます。しかし、新しい周波数とデータで新しいペアを追加します。
ウィンドウ内で新しいデータを取得し、ハッシュテーブルを更新し、マルチマップをハッシュテーブルで最新のものに更新します。
マルチマップ(バイナリ検索ツリー)の最も右側にあるエントリは、その値が現在のウィンドウの最高頻度であるため、モードです。
n >> m、O(n lg m)の場合、時間O(m + m * lg m + n * lg m) スペース:O(m)
もっと良いアイデアはありますか?
[前の質問](http://stackoverflow.com/questions/9841416/find-median-in-a-fixed-size-moving-window-along-a-long-sequence-of-データ) –