2012-07-09 61 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

相關問題