通常,您需要两个哈希表来完成此任务。如您所知,哈希表可让您在预期的恒定时间内进行关键查找。搜索一个值需要遍历整个数据结构,因为有关这些值的信息没有编码在哈希查找表中。
使用两个哈希表:一个用于键值,一个(反向)用于值键查找。在您的特定情况下,只要您的键是“顺序的”,就可以使用向量来完成前向搜索。但这并没有改变对支持快速反向查找的数据结构的要求。
关于哈希表实现:在 C++11 中,您可以使用新的标准容器std::unordererd_map
。
一个实现可能看起来像这样(当然这是可以调整的,比如引入 const 正确性,通过引用调用等):
std::unordered_map<K,T> kvMap; // hash table for forward search
std::unordered_map<T,K> vkMap; // hash table for backward search
void insert(std::pair<K,T> item) {
kvMap.insert(item);
vkMap.insert(std::make_pair(item.second, item.first));
}
// expected O(1)
T valueForKey(K key) {
return kvMap[key];
}
// expected O(1)
K keyForValue(T value) {
return vkMap[value];
}
一个干净的 C++11 实现应该“包装”键值哈希映射,因此您的包装类中有“标准”接口。始终保持反向地图与您的正向地图同步。
关于创建性能:在大多数实现中,有一种方法可以告诉数据结构要插入多少元素,称为“保留”。对于哈希表,这是一个巨大的性能优势,因为动态调整数据结构的大小(在插入期间不时发生)完全重新构建了整个哈希表,因为它改变了哈希函数本身。