Hashtable将两个值都作为键

时间:2015-10-02 09:44:43

标签: algorithm dictionary data-structures hash hashtable

是否存在基于散列的数据结构,我可以在O(1)时间内在键和值上搜索项目。

这可以通过在列表中为每个键值par添加重复条目来实现,方法是通过反转键和值,但它将占用两倍的空间。

这种数据结构在某些情况下可能很有用:比如我想在地图中存储开括号和右括号,在解析字符串时,我可以检查映射是否存在键而不用担心它是否存在是打开 - 关闭地图或关闭 - 打开地图或不存储副本。

我希望我足够清楚!!

2 个答案:

答案 0 :(得分:1)

满足您需求的数据结构称为双向映射。

我想你正在寻找现有的实现,而不是指针如何实现它:)由于你没有指定编程语言,这是Java的当前情况 - 在Java中没有这样的数据结构API。但是,谷歌Guava的bi-directional map界面有几个实现。来自文档:

  

bimap(或“双向地图”)是保留地图的地图   其价值的独特性以及其价值的独特性。这个约束   使bimaps支持“逆视图”,这是另一个bimap   包含与此bimap相同的条目,但使用反向键和   值。

或者,Apache Collections有BidiMap

对于C ++,请查看Boost.Bimap

对于Python,请查看bidict

在C#以及其他语言中,没有官方实施,但那就是Jon Skeet comes in

答案 1 :(得分:0)

您正在搜索bidirectional mapHere是一篇描述c ++实现的文章。请注意,双向映射基本上是两个映射合并为单个对象的映射。然而,没有比这更有效的解决方案,原因很简单:

  

地图基本上是(关键,值)对的未连接有向图。每对由边缘表示。如果你想让地图是双向的,那么边缘会有两倍,从而使所需的内存量增加一倍。

但是,C ++和Java STL并没有为此提供任何类。在Java中,您可以使用Googles Guava库,在C ++中,boost-library提供双向映射。