2012-01-11 7 views
5

私は、挿入時にオブジェクトを効率的に注文するデータ構造を探しています。私は、特定の変数(この場合はフィットネス)の値に基づいて、これらのオブジェクト(この場合は個人)を注文したいと思います。効率的に順序付けられたデータ構造が重複キーをサポートしています

特定の適応度値が異なる個人で発生する可能性があるため、データ構造は重複キーを許可する必要があります。たとえば、TreeMapデータ構造で重複キーが許可されないため、これは問題です。私はそれが効率O(log N)のために、このタイプの木のような構造を使うのが好きです。

個体を順序付きリストに挿入した場合、効率はO(n)に低下し、挿入後の個体のソートはそれほど効率的ではありません。

データ構造が効率的であり、個人を注文し続け、重複キーをサポートしていますか?

データ構造が作成された後に非常に頻繁に項目を追加したり削除したりして、構造が作成された後にオブジェクトをソートするのは非常に高価になります。

+0

構造が作成された後もエントリを追加/削除し続ける必要がありますか? – NPE

+0

遺伝子アルゴリズムコードですか? – Baatar

+0

はい、それは遺伝的アルゴリズムのコードです – Danielle

答えて

8

Apache CommonsGuavaはどちらも、あなたが探しているマルチマップをサポートしています。

また、あなたのユースケースに応じて、あなたはArrayList内の要素を収集でき、O(nは LG N)合計時間で、その後、それを並べ替えます。

または、適合度が同等である場合、アイテムの適合度と他の識別可能な特性をチェックする比較を定義することができます。

+1

最初にフィットネスをチェックし、次に他のいくつかのプロパティをチェックする独自のコンパレータを作成すると、この場合はおそらく良い解決策になります。 – Danielle

0

すべての個体が追加された後にのみ注意し、後で新しい個体を追加しない場合は、おそらくArrayListのソートが最も速いオプションです。

これ以外の場合は、TreeSetを使用し、適合度が最初に比較されるコンパレータを持ち、適合度が等しい場合は他の別のプロパティによって比較されます(identity hash code)。したがって、すべてのオブジェクトは異なるが、フィットネスによってソートされます。

+0

ハッシュコードは要素を区別しないことがあります。 –

+0

ここでアイデンティティハッシュコードについて話しています。ほとんどの場合、それらは一意でなければなりません。もちろん、一意の機能IDに頼る方が良いです。 –

3

古典的なコンピュータサイエンスでは、探しているデータ構造をPriority Queueといいます。

Java 1.5以来、標準のJavaクラスライブラリの実装はjava.util.PriorityQueueです。

私はそれを使用します。

+0

Iteratorは要素を優先順位順に返しませんが、poll()は返さないようにしてください。 – gerardw

1

通常のTreeMapを使用する場合は、値そのものの代わりに値ラッパーを格納できるようにすることができます。これらのラッパーは、同じキーで複数を保管します。

そうしないと、バイナリ検索ツリーに基づいてソートリスト構造を使用できます。私は少し前にこれを入手しました:http://www.scottlogic.co.uk/2010/12/sorted_lists_in_java/しかし、もっと標準的な実装が存在すると確信しています。この種の構造の利点は、contains(Object)メソッドが線形時間ではなく時間対数で実行されることです。

関連する問題