在键/值对中仅使用一个键查找值有效时间复杂度:Java

时间:2011-06-30 00:00:40

标签: java algorithm data-structures map time-complexity

我希望从只有一个相应键的Java Key / Value对(具有一对多映射的Map)中检索值,而不会遍历Map中的所有值并将其转换为O(n)复杂度。 键/值数据结构如下:

  

K1 - > V1,V2
  K2 - > V1,V2,V3
  K3 - > V1
  K4 - >
  K5 - > V4,V2

如果有人提出任何相同的建议,或者如果能够更好地实现时间复杂性,那将会很感激。

3 个答案:

答案 0 :(得分:1)

在Google的番石榴中有一个非常好的BiMap类,您可以在其中查找键和值(它由两个地图支持)。

http://code.google.com/p/guava-libraries/

编辑:澄清之后。我认为我的答案没有太大变化。 Guava还有非常好的MultiMap界面(以及它的几个实现),你最有可能将它用于你的目的。

答案 1 :(得分:1)

鉴于我在评论中的上述假设,快速想到的最直接的方法是拥有两个结构。两个映射,其中一个中的键是另一个中的值,反之亦然,或者有两个排序列表,您可以对其中的任何一个执行二进制搜索,并且您找到的结果具有对姐妹元素的引用另一个清单;这会给你o(log(n))。

如果您使用上面提到的两个镜像地图,如果它们都是HashMap,则可以有o(1)。你可以有一个HashMap和一个HashMap,然后有一个封装它们保持同步的结构。

答案 2 :(得分:1)

你能更具体一点吗?
什么属性描述你的键和价值观? 假设您的密钥是唯一的,您可以使用LinkedList或ArrayList将多个值映射到密钥。要检索所有值,您只需要引用特定的数据结构,但在某个时刻,您将需要遍历列表,因此,是的,如果要检查每个元素,则需要O(n)时间一些东西。另一方面,您可以使用二叉树或红黑树(或其他东西)作为您的值,从而更有效地搜索它们(正如我所说,这取决于您的值的属性)。