web-dev-qa-db-ja.com

ArrayListまたはHashMapを使用して速度を向上させる

オブジェクトAの 'List'または 'Map'、...が必要です。このリストは別のArrayListから追加されます。 Aのidパラメーターが等しい場合、オブジェクトAは別のオブジェクトと等しいと見なされます。

私の問題は、リストに存在しないオブジェクトのみを追加することです。実装の2つの選択肢の間で疑問に思います。 ArrayListまたはHashMapの使用

1. ArrayList:

for (A a: source) {if (! (a in ArrayList)) addToArrayList();}

2. HashMap <id, A>

for (A a: source) {hasmap.put (a.id, a)}

多数のオブジェクト(1000個以上のオブジェクト、またはより多くのオブジェクト)を追加する速度が向上します。私の問題により良いパターンはありますか?

14
hieuxit

まず、四肢に出て、これらが2つの完全に異なるデータ構造であると述べます。Listは要素の線形表現、およびMapはキーペア値を扱います。

私の直感では、ListSetのどちらかを選択しようとしています。

unique要素のみを入力する場合、またはより簡潔に配置する場合、一意の値のみを考慮する場合は、何らかの種類のSetが最適ですベット-注文を気にしない場合はおそらくHashSet追加、削除、包含、サイズなどの基本操作に対してO(1)時間 を提供します。

(興味深いことに、HashSetHashMapによって支えられていますが、ArrayListと同様のインターフェースを提供します。)

19
Makoto

ArrayListには、すべての検索でO(n)パフォーマンスがあるため、n回の検索のパフォーマンスはO(n ^ 2)です。

HashMapは、すべての検索で(平均で)O(1))パフォーマンスがあるため、n回の検索のパフォーマンスはO(n)になります。

HashMapは最初は遅くなり、より多くのメモリを使用しますが、nの値が大きい場合は高速になります。

ArrayListがO(n)パフォーマンスを持っている理由は、すべての項目がリストにないことを確認するために挿入ごとにチェックする必要があるためです。n回の挿入を行います、したがって、操作全体ではO(n ^ 2)です。

HashMapのパフォーマンスがO(1))である理由は、ハッシュアルゴリズムがすべてのキーに対して同じ時間を要し、キーを見つけるためのルックアップにも一定の時間がかかるためです。ハッシュテーブルがその負荷係数を超えて再割り当てする必要がある場合、およびそれが一定である理由on avarage

最後に、あなたの質問に答えるために、私のアドバイスはHashMapを使用することです。

51
andy256