我可以使用什么结构将唯一键映射到唯一值?

时间:2013-03-01 14:20:11

标签: algorithm data-structures collections

当密钥唯一时,Map可以解决O(1)搜索解决方案。

但是有一种结构,其中按键搜索和按值搜索都采用顺序O(1)?

给定结构:

Put(key,value)
GetValueOf(Key) in O(1)
GetKeyOf(Value) in O(1)

有没有一种方法可以在不使用2张地图的情况下按顺序完成两次搜索?

我对java实现特别感兴趣。

提前致谢!!

5 个答案:

答案 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是一种旨在满足此类要求的数据结构。它非常灵活,查找的复杂性取决于您告诉它用于存储基础值的数据结构。

More details here

答案 4 :(得分:1)

Apache commons集合有一个BidiMap。或者去Google的BiMap