2016-09-21 1 views
1

私は一般的な必要があると思うデータ構造が必要です
重複する値を許可するマップが必要です、しかし)ポイントになって...待つ...
重複した値を許可し、キーのある値のリストを返す双方向マップが必要です

k1 -> v1 
k2 -> v1 
k3 -> v1 
k4 -> v2 
k5 -> v2 

このサンプルを参照してください、私はmap.getByValue(V1)を行う場合は今、私はセット(K1、K2、K3)を取得する必要があります。さもなければ、それは '普通の'地図のように振る舞います。それは高性能を持っているはずですので、forループのような提案はお願いしません。
また、(ノートは、k1が両方のリストにある)私が今までこのような状況をたくないので、次のことが...私

v1 -> (k1, k2, k3) 
v2 -> (k4, k5) 

のために行うことはありませんのでご注意...

v1 -> (k1, k2, k3) 
v2 -> (k4, k5, k1) 

Iドン2つのマップソリューションを使いたい。私はgetByValue(value)がまだ実行可能になるようにソートされた値を保持する何らかの方法を考えています。

+0

なぜ、 'vi - >(k1、k2、...、kn)'があなたのために働いていないのですか?あなたのキーは実際には値であり、その逆もそうです。 'hashCode'(と' equals')を正しくオーバーライドすると、 "キー"は決して複数のリストの一部になることはありません。 – beatngu13

+0

2つのマップソリューションは実装が簡単で、キーによるO(1)ルックアップと値によるO(1)ルックアップを提供します。値でソートされたセカンダリインデックスを維持することができます。それはいくらかのスペースを節約しますが、維持することは難しく、値による検索はO(log n)になります。さらに、値の変更、追加、削除(つまりmap [k] = value')はO(log n)となりますが、2マップ解ではO(1)となります。 –

答えて

0

高いパフォーマンスとは、キーを検索するために何らかのインデックスが必要なことを意味します。両方向で動作するインデックスはないため、実際には2つのインデックスが必要です。したがって、方向ごとに1つと、一貫性のある状態でそれらを維持するラッパーの2つのマルチマップを使用する必要があります。

+0

一方、アレクセイ私は値がソートされていれば2つのマップを避けることができると感じています(!)それは挑戦です。 –

+0

値で並べ替えると、キーで並べ替えることはできません(またはハッシュテーブルの場合はキーでバケットの値を配置することができません)ので、キーによる高速検索が緩くなります。もちろん、マップキー - >ポインタ_to_a_valueを持つことができ、ソートされた配列に値を格納することができます。実際には2つのマップがありますが、1つはマップ(RBツリー、ハッシュマップ)として実装され、もう1つはソートベクター(検索には適していますが挿入には悪い)です。 –

+0

1マップ(値をキーにする)と1マルチマップ(値をキーにする)で、2マルチマップではありません。 –

関連する問題