2012-07-09 60 views
1

首先,这个问题不是Most efficient method to get key for a value in a dict的重复,询问者询问了python,也因为我想讨论下面给出的解决方案是否合理,如果可以的话这样的问题。从javascript中获取关键值的有效方法

所以,让我们假设,我有以下一个下列数据结构:

{ 
    "one" : "1", 
    "two" : "2", 
    . 
    . 
    "hundred thousand" : "100000" 
} 

现在,我希望能够得到针对特定值键(假设我不会有不同的密钥相同的值)。一种解决方案是通过遍历数据,但如何高效能成为我们的代码,如果我们构建我们的数据,以获得关键:

data = [ 
    { 
     "one" : "1", 
     "two" : "2", 
     . 
     . 
     "hundred thousand" : "100000" 
    }, 
    { 
     "1" : "one", 
     "2" : "two", 
     . 
     . 
     "100000" : "hundred thousand" 
    } 
    ] 

所以,现在data[0]."two"可以用来获得两个值。但是,假设有一种情况我知道这个值是999,我想知道它是关键,所以为了得到它的密钥我会做data[1]."999",即我将使用data [1]中的反转数据。

该解决方案可能比迭代数据找到正确的密钥更快。你怎么看?

+2

我没有办法在标准的Javascript中做到这一点,不涉及迭代整套元素。另外,重要的是要指出,如果你在这个问题上谈论Javascript,那么你上面的是不是一个字典,而是一个_objects_数组。看看这个问题:http://stackoverflow.com/questions/9907419/javascript-object-get-key-by-value – 2012-07-09 12:35:45

+0

字典总是排序,如你的例子所示? – 2012-07-09 12:37:11

+0

不,不一定。 – baltoro 2012-07-09 12:40:30

回答

0

由于多个键可以具有相同的值,因此您的问题没有通用的解决方案。对于您的具体示例,如果您在速度方面谈论效率,那么是的,您目前使用反向地图的解决方案是最快的方法(以牺牲存储反向地图的额外空间为代价)。

+0

感谢@casablanca,我提到过我不会有多个具有相同值的键。 – baltoro 2012-07-09 12:51:34

2

对于遍历所有键的效率不高,您提出的保留反向查找散列的方法是我见过的解决此问题的最常见方法。当然,最好的解决方案是设计一个不需要执行反向查找的设计。

如果你存储少量的密钥,并且不经常执行这种查询,那么你可能用O(n)的代价很好(当然,在这种情况下,保持反向查找哈希不会要么伤害很多)。另一方面,如果您拥有数百万个密钥并且无法获得反向查找哈希的内存命中,则可以使用类似Bloom Filters的内容来帮助降低查找成本。

+0

布卢姆过滤器只能帮助找到一个特定的值是否存在于一个集合中。 – baltoro 2012-07-09 13:06:48

+0

@baltusaj好,他们告诉你,如果特定值_probably_存在于集合中,那么特定的优化是在你有一个巨集的情况下,并且你想查找的大多数值不存在于集合中,所以你可以先检查布隆过滤器,只有在获得肯定的时候才进行查找。这可能与此无关,但我想听起来很聪明:/ – 2012-07-09 15:12:46

相关问题