對集合S的完美散列函數是一個將S的每個元素映射到一系列無衝突的整數的雜湊函數。一個完美散列函數的應用與其他雜湊函數的應用基本一致,但不需要任何衝突解決方案。在數學術語中,這是一個完全單射函數.

特性及使用

對於特定集合S的完美散列函數能在常數時間中被計算出,其映射值在一個相對小的範圍內,能被一個隨機化算法發現,該算法的操作次數與S的大小成正比.[1]任何適合在雜湊表中使用的完美散列函數需要至少與S的大小成正比的位數。

一個值的位數被限定範圍的完美散列函數能應用於高效查找操作中:假定查找鍵(key)與集合S(或與集合S關聯的值)對應,然後將完美散列函數應用於查找鍵,得到雜湊值(一個整數),然後在尋找表中取出該整數對應的值。在集合S極少更新且查詢頻率非常多的情況下,使用完美hash函數是非常有效的。對集合S更新頻率的限定是由於對任何集合S的修改,都將導致該完美散列函數退化為非完美散列函數。每次集合S被修改後自動更新hash函數的解決方案被稱為dynamic perfect hashing,但這類方法非常複雜,難以實現。一個簡單的允許動態更新集合S的完美散列函數的替代品叫cuckoo hashing

最小完美散列函數

最小完美散列函數是一個能將n個鍵(key)映射到n個連續的整數的完美散列函數。 產生的值通常為 [0..n−1] 或 [1..n]。正式表述如下:設jk是有限集合K的兩個元素。F是一個最小完美散列函數iff F(j)=F(k)只在j=k的情況下成立(單射);並且存在整數a,使得F的範圍為a..a+|K|−1。已經在數學上證明,通用的完美hash函數至少需要每個鍵(key)1.44 比特(bit)[2] 。而當前已知的最小完美hash散列函數每個鍵需要2.6 比特[3]

對一個最小完美散列函數F,若鍵以a1, a2, ..., an次序給出,對任意鍵aj and ak, j<k,意味着F(aj)<F(ak).[4] Order-preserving minimal perfect hash functions require necessarily Ω(n log n) bits to be represented.[5],我們稱該最小完美散列函數F是保序的。

若對一個最小完美散列函數F,其應用變換後得到的值保持了鍵(key)的字典序,我們稱該最小完美散列函數F為單調的。在此情況下,函數產生的值就是輸入的鍵在所有可能的有序鍵序列中的位置。若被hash的鍵被存儲於有序數組中,已實現一種策略,對每個鍵存儲少量附加位(bits),以取得更快計算hash值的優勢。[6]


請參閱

  • Dynamic perfect hashing
  • Pearson hashing
  • Succinct data structure
  • Universal hashing

索引

延伸內容

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.