是否存在基于散列的数据结构,我可以在O(1)时间内在键和值上搜索项目。
这可以通过在列表中为每个键值par添加重复条目来实现,方法是通过反转键和值,但它将占用两倍的空间。
这种数据结构在某些情况下可能很有用:比如我想在地图中存储开括号和右括号,在解析字符串时,我可以检查映射是否存在键而不用担心它是否存在是打开 - 关闭地图或关闭 - 打开地图或不存储副本。
我希望我足够清楚!!
答案 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 map。 Here是一篇描述c ++实现的文章。请注意,双向映射基本上是两个映射合并为单个对象的映射。然而,没有比这更有效的解决方案,原因很简单:
地图基本上是(关键,值)对的未连接有向图。每对由边缘表示。如果你想让地图是双向的,那么边缘会有两倍,从而使所需的内存量增加一倍。
但是,C ++和Java STL并没有为此提供任何类。在Java中,您可以使用Googles Guava库,在C ++中,boost-library提供双向映射。