キーが一意の場合、マップは O(1) 検索ソリューションを解決できます。
しかし、キーによる検索と値による検索の両方が O(1) の順序になる構造はありますか?
与えられた構造:
Put(key,value)
GetValueOf(Key) in O(1)
GetKeyOf(Value) in O(1)
2 つのマップを使用せずに、両方の検索を 1 回ずつ順番に実行できる方法はありますか?
特に Java の実装に興味があります。
前もって感謝します !!
キーが一意の場合、マップは O(1) 検索ソリューションを解決できます。
しかし、キーによる検索と値による検索の両方が O(1) の順序になる構造はありますか?
与えられた構造:
Put(key,value)
GetValueOf(Key) in O(1)
GetKeyOf(Value) in O(1)
2 つのマップを使用せずに、両方の検索を 1 回ずつ順番に実行できる方法はありますか?
特に Java の実装に興味があります。
前もって感謝します !!
キーが一意である場合、マップはO(1)検索ソリューションを解くことができることに注意してください。両方が一意である場合は、両方のキーの任意の値に対してO(1)検索ソリューションが必要です。したがって、このデータ構造で十分です。
class YourDoubleHashMap<K,V>() {
private HashMap<K,V> keyMap;
private HashMap<V,K> valMap;
YourDoubleHashMap<K,V>() {
keyMap = new HashMap<K,V>();
valMap = new HashMap<V,K>();
}
public boolean put(K key,V val) {
return keyMap.put(key,val) && valMap.put(val,key);
}
public V getValueOfKey(K key) {
return keyMap.get(key);
}
public K getKeyOfValue(V val) {
return valMap.get(val);
}
}
この時間とメモリのトレードオフアプローチは、実行時の効率と引き換えにスペースの効率を犠牲にします。
値を適切に「ハッシュ」する方法を知っている場合 (正確には、2 つの異なる値が高い確率で 2 つの異なるハッシュを与えることを意味します)、2 つのハッシュ テーブルを使用できます (1 つはキーから値へ、もう 1 つは値から値へ)。鍵)
ブーストにはboost::bimapがあります。これは、2 つのマッピングを行う 2 つのマップに基づいており、問題に対するより良い解決策はないと思います。
ブースト Bimap は、このような要件を考慮して設計されたデータ構造です。その柔軟性は非常に高く、ルックアップの複雑さは、基になる値を格納するために使用するように指示するデータ構造によって異なります。