web-dev-qa-db-ja.com

最速の検索を実行する-どのコレクションを使用すればよいですか?

知っている:

  • インデックスを使用して要素に高速にアクセスする必要がある場合は、ArrayListを選択する必要があります。
  • キーを使用して要素に高速にアクセスする必要がある場合は、HashMapを使用します。
  • 要素の迅速な追加と削除が必要な場合は、LinkedListを使用してください(ただし、シークのパフォーマンスは非常に低くなります)。

コレクションオブジェクトに格納されているデータに基づいて最速の検索を実行するには、どのコレクションを使用すればよいですか?

以下は私のコードです:

    public void fillAndSearch(Collection<Student> collection) {
      if(collection!=null){
        for (int i=0; i<=10; i++) {
            Student student = new Student("name" + i, "id" + i);
            collection.add(student);
        }
      }
        //here We have to perform searching for "name7" or "id5",
        //then which implementation of collection will be fastest?
    }

class Student {
    String name;
    String id;

    Student(String name, String id) {
        this.name = name;
        this.id = id;
    }
} 
11
user4768611

特定の制限がある場合は、HashMapを使用する必要があります。それはあなたが望むように、あなたに迅速な検索を提供します。

要素を特定の順序でトラバースする必要がある場合は、TreeMap(自然順序)またはLinkedHashMap(挿入順序)を選択する必要があります。

コレクションが不変であることが保証されている場合は、ソートされたArrayListをバイナリ検索で使用できます。これにより、メモリを節約できます。この場合、検索できるのは1つの特定のキーのみです。これは、多くの実際のアプリケーションでは望ましくありません。

とにかく、O(logN)ソリューションとO(1)ソリューションの違いを感じるには、本当にhuge要素数(数百万/十億)が必要です。 。

データ構造について詳しく知りたい場合は、コースラドットコムでプリンストン大学のアルゴリズムコースを復習することをお勧めします。

2
AdamSkywalker

データに高速にアクセスするために複数のコレクションを保持することに問題はありません。

この状況では、2 HashMap<String, Student>さん。検索キーごとに1つ。

(PS:または検索に使用するキーワードの種類がわからない場合は、同じマップに両方を保存できます)

0
bvdb