我希望从只有一个相应键的Java Key / Value对(具有一对多映射的Map)中检索值,而不会遍历Map中的所有值并将其转换为O(n)
复杂度。
键/值数据结构如下:
K1 - > V1,V2
K2 - > V1,V2,V3
K3 - > V1
K4 - >
K5 - > V4,V2
如果有人提出任何相同的建议,或者如果能够更好地实现时间复杂性,那将会很感激。
答案 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)时间一些东西。另一方面,您可以使用二叉树或红黑树(或其他东西)作为您的值,从而更有效地搜索它们(正如我所说,这取决于您的值的属性)。