簡體   English   中英

為查找優化的哈希映射

[英]Hash map optimised for lookup

我正在尋找一些具有固定鍵(在初始化期間固定)並且查找速度更快的地圖。 它可能不支持以后添加/更新元素。 是否有一些算法可以查看鍵列表並制定一個函數,以便以后查找更快。 在我的例子中,鍵是字符串。

更新:

密鑰在編譯時是未知的。 但在應用程序的初始化時間。 以后不會再進行任何插入,但會有很多查找。 所以我想要優化查找。

CMPH可能是您正在尋找的。 基本上這是gperf 而不需要在編譯時設置。

雖然當然std::unordered_map就像C ++ 11一樣可能也會這樣做,盡管可能會發生一些沖突。

因為你查找字符串,對於字符串,trie(任何不同的trie風格,暴擊位或任何時髦的名字)也可能值得研究,特別是如果你有很多 有許多免費提供的免費trie實現。
嘗試的優點是它們可以索引壓縮字符串,因此它們使用更少的內存,這使得在緩存中具有數據的可能性更高。 訪問模式也隨機性較小,這也是緩存友好的。 哈希表必須存儲該值加上哈希值,並且或多或少隨機地(不是隨機地 ,但不可預測地)索引到內存中。 理想情況下,類似trie / trie的結構只需要一個額外的位來區分每個節點中的密鑰和它的公共前綴。

(注意,在這種情況下,O(log(N))可能比O(1)更快,因為big-O不會考慮這樣的事情。)

請注意,這些是不同的東西:你需要一個上限,你需要一個快速的典型速率,或者你是否需要最快的查找,沒有問題? 最后一個會花費你,前兩個可能是沖突的目標。


您可以嘗試基於輸入創建完美的哈希函數(即沒有輸入集沖突的哈希函數)。 這是一個不知何故,解決問題(例如, 這個這個 )。 但是,它們通常會生成源代碼,並且可能會花費大量時間生成散列函數。

對此的修改將使用通用散列函數(例如,shift-multiply-add)並對合適的參數進行強力搜索。

這必須以少量字符串比較的成本進行交易(如果你不需要整理,這不是非常昂貴的)。

另一個選擇是使用兩個不同的散列函數 - 這會增加單個查找的成本,但與外星人竊取你的時鍾周期相比,降級的可能性略小。 這不太可能是典型字符串和一個體面的散列函數的問題。

試試google-sparsehash: http//code.google.com/p/google-sparsehash/

An extremely memory-efficient hash_map implementation. 2 bits/entry overhead! 
The SparseHash library contains several hash-map implementations, including 
implementations that optimize for space or speed.

在類似的主題(編譯時已知的(項目數)項)中,我制作了這個: 查看已知的整數鍵集 開銷低,不需要完美的哈希。 幸運的是,它在C ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM