この質問を解決する1つの方法は、単語とそれに対応する単語数をハッシュすることです。次に、ハッシュマップをトラバースして、上位3つを見つけます。
これを解決するためのより良い方法はありますか?HashMapの代わりにBSTを使用した方が良いでしょうか?
Trieは、このための優れたデータ構造です。ハッシュ計算の必要はなく、挿入と更新の時間計算量O(1)
は辞書のサイズにあります。
HashMapまたはBSTのいずれかが妥当な選択です。それぞれのパフォーマンスは、カウントする必要のある単語の数によって異なります。これらのインスタンスでは、プロファイラーが友だちです(VisualVMから始めるのが妥当です)。
この場合、多くの異なる単語が存在する可能性があるため、ハッシュテーブルのパフォーマンスが向上することを賭けます。ルックアップがO(1)
引き継ぎO(log N)
ます。
基本的に、ヒストグラムはそのための標準的な方法です。ヒストグラムインターフェイスに使用する実装を選択してください。それらの違いは、実際にはインスタンス固有です。それぞれに長所と短所があります。
単語数を取得するために、 map-reduceデザインを検討することもできます。
map(doc):
for each word:
emitIntermediate(word,"1")
reduce(word,list<string>):
emit(word,size(list))
このアプローチにより、ドキュメントが多数ある場合は優れたスケーラビリティが得られます。map-reduceインターフェースを使用するか、関数型プログラミングが好きな場合は洗練されたソリューションを使用します。
(key,values)
注:マッパーはハッシュを使用してタプルを渡すため、このアプローチは基本的にハッシュソリューションと同じです。