動的に変化する単語の大きなファイルがあります。いくつかの単語を継続的に追加しています。それぞれの瞬間に流行語のトップ 10 を追跡するにはどうすればよいでしょうか?
ブログでこの質問を見つけましたが、答えがわかりませんでした。答えは: ハッシュ テーブル + 最小ヒープ
最小ヒープ部分ではなくハッシュテーブルの理由を理解しています。誰かが私を助けることができますか?
動的に変化する単語の大きなファイルがあります。いくつかの単語を継続的に追加しています。それぞれの瞬間に流行語のトップ 10 を追跡するにはどうすればよいでしょうか?
ブログでこの質問を見つけましたが、答えがわかりませんでした。答えは: ハッシュ テーブル + 最小ヒープ
最小ヒープ部分ではなくハッシュテーブルの理由を理解しています。誰かが私を助けることができますか?
その場合は、 aとともに atop 10 trending words
を使用する必要があります。max-heap
hash-table
新しい単語がファイルに追加されると、次のようになります。
Create
とx
を持つ新しい要素。x.key=word
x.count=1
Add
x
にhash-table
。O(1)
.Add
x
にmax-heap
。O(lgn)
.既存の単語がファイルに追加されると、次のようになります。
Find
x
でhash-table
。O(1)
.Update
x.count
にx.count++
。次に取得する必要がある場合top 10 trending words
:
Extract
から10回max-heap
。10*O(lgn)=O(10*lgn)=O(lgn)
.ご覧のとおり、必要なすべての操作はせいぜい で行われO(lgn)
ます。
トップ10だけを維持したい場合は、最大ヒープを使用するのはやり過ぎです。ソートされた配列に10個のエントリを保持することは、より簡単で高速になります。
並べ替えには、配列の下から挿入ソートを使用します。候補者がすでにトップ10に入っているかどうかを確認し、必要に応じてその位置を更新する必要があります。