当密钥唯一时,Map可以解决O(1)搜索解决方案。
但是有一种结构,其中按键搜索和按值搜索都采用顺序O(1)?
给定结构:
Put(key,value)
GetValueOf(Key) in O(1)
GetKeyOf(Value) in O(1)
有没有一种方法可以在不使用2张地图的情况下按顺序完成两次搜索?
我对java实现特别感兴趣。
提前致谢!!
答案 0 :(得分:3)
您注意到,当密钥是唯一的时,地图可以解决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);
}
}
这种 时间记忆权衡 方法牺牲了空间效率,以换取运行时效率。
答案 1 :(得分:1)
在提升中有boost::bimap。它基于两个映射来完成两个映射,我相信没有更好的解决方案来解决你的问题。
答案 2 :(得分:1)
如果你知道如何正确地“散列”这个值(正确的意思是两个不同的值会给你两个不同的哈希值很高)你可以使用2个哈希表,(一个从键到值,另一个从另一个哈希表)从价值到关键)
答案 3 :(得分:1)
boost bimap是一种旨在满足此类要求的数据结构。它非常灵活,查找的复杂性取决于您告诉它用于存储基础值的数据结构。
答案 4 :(得分:1)