具有双向O(1)查找的数据结构。哈希表?

时间:2012-11-09 19:45:38

标签: java data-structures hashtable lookup

我正在实施一个系统,我有一个名单列表,每个人都有1个电话号码。我需要能够取一个名字并查找电话号码,或者拿一个电话号码并查找姓名。

我知道我可以通过两个哈希表来实现这一点 - 一个从名称到电话号码,一个从电话号码到名字。然后我可以在O(1)时间向任意方向查找。然而,这似乎是我存储了太多数据 - 每个名称和每个电话号码都存储了两次。

有没有办法更有效地做到这一点?我应该使用什么数据结构来存储姓名和电话号码?

如果相关,我用Java编码。

非常感谢!

3 个答案:

答案 0 :(得分:8)

Java不提供开箱即用的双向哈希表。您依赖于两个哈希表的解决方案是最好的,除非您愿意使用第三方库(这将为您隐藏两个哈希表)或重新实现HashMap<K,V>的重要部分

  

然后我可以在O(1)时间向任意方向查找。然而,这似乎是我存储了太多数据 - 每个名称和每个电话号码都存储了两次。

不一定:你可以使用代表电话号码的同一个对象,在这种情况下,电话号码会有一个对象,其中有两个对象存储在两个哈希表中。

答案 1 :(得分:5)

考虑使用Guava的HashBiMap,它基本上是两个HashMap在幕后连接在一起。另请参阅BiMap界面及其related article

答案 2 :(得分:1)

  1. 请记住,对象本身只存储一次,而不是两个映射中。您只需要双倍数量的引用 - 因此它可能不会那么糟糕。
  2. 您可以使用提供该功能的Gauva BiMap(及其界面HashBiMap