具有两种 O(1) 查找的数据结构。哈希表?
Posted
技术标签:
【中文标题】具有两种 O(1) 查找的数据结构。哈希表?【英文标题】:Data structure with two way O(1) lookup. Hashtable? 【发布时间】:2012-11-09 19:45:38 【问题描述】:我正在实施一个系统,其中有一个姓名列表,每个人都有 1 个电话号码。我需要能够获取姓名并查找电话号码,或者获取电话号码并查找姓名。
我知道我可以通过两个哈希表来做到这一点——一个从名字到电话号码,一个从电话号码到名字。然后我可以在 O(1) 时间内朝任一方向查找。但是,这似乎是我存储了太多数据 - 每个姓名和每个电话号码都存储了两次。
有什么方法可以更有效地做到这一点吗?我应该使用什么数据结构来存储姓名和电话号码?
如果相关的话,我正在用 Java 编码。
非常感谢!
【问题讨论】:
【参考方案1】:Java 不提供开箱即用的双向哈希表。依赖于两个哈希表的解决方案已经足够好了,除非您愿意使用第三方库(这会为您隐藏两个哈希表)或重新实现 HashMap<K,V>
的很大一部分。
然后我可以在 O(1) 时间内向任一方向查找。但是,这似乎是我存储了太多数据 - 每个姓名和每个电话号码都存储了两次。
不一定:您可以使用表示电话号码的相同对象,在这种情况下,电话号码将只有一个对象,并从两个哈希表中存储对它的两个引用。
【讨论】:
+1 用于解决“存储”方面的问题 - 这只是参考。【参考方案2】:考虑使用 Guava 的 HashBiMap
,它基本上是两个 HashMap
s 在幕后链接在一起。另请参阅BiMap
接口及其related article。
【讨论】:
请记住,哈希表提供 O(1) 摊销。目前尚不清楚要求是 O(1) 最坏情况还是摊销。通常情况下,这是最坏的情况,除非另有说明。【参考方案3】:-
请记住,对象本身只存储一次,而不是在两个映射中。您只需要双倍的引用 - 所以它可能没那么糟糕。
您可以使用提供该功能的 Gauva BiMap(及其界面 HashBiMap)
【讨论】:
以上是关于具有两种 O(1) 查找的数据结构。哈希表?的主要内容,如果未能解决你的问题,请参考以下文章