2014-05-10 55 views
0

我有一個散列表,字符串鍵和值。減少查找數量的有效方法?

鑰匙必須根據某些參數構造。 例如,param1:param2:param3:param4:param5:param6。如果整個鍵的值(最優先的值)在散列中不可用,我將通過構造鍵「:param2:param3:param4:param5:param6」來查找下一個首選值。

如果沒有它的價值,我會通過刪除一個或多個參數來構造具有特定組合參數的鍵。所以,基本上有一個基於某種偏好的關鍵查找層次結構。

我目前的做法是構造一個鍵,查找,然後是如果在哈希中沒有找到它,在層次結構中構造下一個鍵,等等......但是這可能導致許多查找,然後我找到一些或沒有值。請注意,可能有多個鍵返回值,例如「參數1:參數2:參數3:參數4:參數5:參數6」和「:參數2:參數3:參數4:參數5:參數6」可能具有該值,但我更喜歡第一個鍵的值,甚至不會查找第二個鍵。

我懷疑可能有更有效的方法來解決這個問題。做這種查找最有效的方法是什麼?

+0

你可以自定義你自己的散列函數嗎? –

+0

我不希望自定義哈希函數,因爲我正在使用現有的庫。我只能自定義鍵和值。但是,如果我可以定製,它會如何幫助? – Nura

+0

另外,你是否喜歡用解決這個問題的語言? –

回答

0

這不是生成好的散列鍵的最好方法。但這是主意。

假設您有n個可供選擇的字符串。您可以爲每個字符串生成哈希。所以,你會有h1,h2,h3,... hn。

然後,當您生成密鑰時,密鑰可能是hi^hj^... hk的組合,其中k將是密鑰中的參數個數。

現在,查找p1p2p3 ... pk,你可以做H = h(p1)^ h(p2)....^h(pk)。如果查找失敗,只需做H = H^h(p1)^ h(p_k + 1)。

我不確定在執行此類自定義時,如果性能碰到散列衝突,則通過連接字符串並散列它們來覆蓋密鑰生成。

另一種方法:

創建一個字符數組,其中所有的PARAMS連接成一個字符串。您可以有另一個數組,用於跟蹤每個參數結束的位置。然後,它很容易從param1提取數組到param_k來爲每次迭代生成哈希。這樣你就可以避免創建連接字符串,如果有性能影響的地方。