2011-07-18 5 views
0

レコードのリストが与えられているので、各著者が書き込んだレコードの数を取得しようとしています。明白な方法は、キーを作者の名前にして値を増やすことで、マップを使うことです。しかし、これを行うためのより効率的な方法があります。すべての繰り返しをルックアップする必要はありませんか?レコードのリスト内のアイテムを効率的にカウントする

私が著者を事前に知っていれば、各著者の変数を作成し、検索せずに変数を増やしてから、入力を読み終えたら最後にマップを作成することができます。しかし、私はデータの著者のほんの一部を知っています。

ありがとうございます。

答えて

2

著者名の数に基づくマップに基づく解決法は、かなり良いものです(HashMapを使用する場合、全体の平均時間複雑度はO(n)になります)。

私があなたの場合は、不適切である(遅すぎる、あまりにも多くのメモリを使用するなど)ことが実証できるまで、このアプローチを使用して、問題の発生に対処するものに置き換えようとします。おそらく、その日は決して来ないでしょう。

0

Java HashMapのルックアップの平均的なケースは、O(1)になります。つまり、実行時間が大幅に増加することはありません。

が本当にである場合を除き、すべてのものを絞り込むことをお勧めします。

0

著者の数がレコードの総数に比べて比較的少ない場合、ハッシュ検索はこのような状況で最も効果的なテクニックになります。

レコードが既にソートされている(またはソートされた構造体であるbtreeインデックスもある)場合は、さらに効果的なアルゴリズムが可能です。

0

TObjectIntHashMapがHashMapより効率的ですが、両方ともかなり効率的です。数ミリ秒で100Kレコードをスキャンできるはずです。それが十分に速くない場合は、レコードを追加/更新/削除するときにマップを維持して、これを調べるだけで済みます。