雜湊表
雜湊表是乙個包含關鍵字的具有固定大小的陣列,表的大小記為 tablesize 。每個關鍵字被對映到0到 tablesize 中的某個數,並被放到適當的單元中,這個對映稱為雜湊函式
。雜湊函式應盡可能地在單元之間均勻分配關鍵字。最後還需要解決關鍵字衝突的情況,即對映到同乙個值。
通常需要均勻的分布關鍵字,需要我們選擇乙個適合的雜湊函式。
雜湊表的負載因子為雜湊表中的元素個數和雜湊表大小的比值。
一般選擇表的大小為素數,以避免一些特殊性質造成的衝突。
如果關鍵字為字串,最簡單的辦法是把字串中的字元的值加起來,但是這種方法在表很大時不能很好地分配關鍵字。另一種方法是把字串看作有某個基數的整數,求整數的十進位制值再以表的大小取模,基數取32,它包含了可能的字元個數並可以快速計算。可以在後一種方法上再做一些調整,如使用部分字元來提高速度和避免前面字元左移出結果。
雜湊衝突的解決策略
以下列舉幾種:
分離鏈結法
做法是將雜湊到同乙個值的所有元素儲存到乙個鍊錶中.
定義雜湊表的裝填因子(load factor) λ 為雜湊表中的元素個數與雜湊表的大小的比值;
雜湊表的大小實際上並不重要, 而裝填因子才是重要的.
分離鏈結雜湊法的一般法則是使得表的大小盡量與預料的元素個數差不多(即λ=1).
使表的大小是乙個素數以保證乙個好的分布, 這也是乙個好的想法.
開放定址法
不同於分離鏈結法, 開放定址法是當衝突發生時, 就嘗試選擇另外乙個單元, 直到找到空單元.
更正式的, 單元h0(x), h1(x), h2(x), ...依次進行試選, 其中hi(x)=(hash(x)+f(i)) mod tablesize, 且f(0) = 0. 函式f是解決衝突函式.
因為所有資料都要置入表內, 所以使用這個方案所需要的表要比分離鏈結雜湊需要的表達.
一般來說, 對不使用分離鏈結法的雜湊表來說, 其裝填因子應該低於λ=0.5. 這樣的表叫做探測雜湊表. 下面是三種常見的解決衝突的方法.
1.線性探測
這種方法會使一些佔據的單元形成區塊, 其結果成為一次聚集(primary clustering),
這種方法對於插入和不成功的查詢來說大約為1/2(1 + 1 / (1 - λ)^2),而對於成功的查詢來說則是1/2(1 + 1/(1-λ))
2.平方探測
平方探測就是衝突函式為二次函式的探測方法.流行的選擇是f(i)=i^2.
對於這種解決辦法, 如果發生衝突時, 首先考慮i=1, 此時i^2=1, 即衝突位置的下乙個位置, 如果該位置為空, 則插入, 如果不為空,
則下乙個探測單元在距衝突位置為i^2即2^2=4遠處, 如果為空則插入, 否則繼續探測距衝突位置9, 16, 25...遠處
乙個重要的定理:
如果使用平方探測, 且表的大小是素數,那麼當表至少有一般是空的時候, 總能夠插入乙個新的元素
在探測雜湊表中標準的刪除操作不能執行, 因為相應單元可能已經引起衝突,元素繞過它儲存在別處. 如果刪除乙個, 那麼可能剩下的find操作都是失敗.
因此探測雜湊表需要懶惰刪除.
雖然平方探測排除了一次聚集, 但是雜湊到同一位置上的那些元素將探測相同的裝置單元, 這稱為二次聚集(secondary clustering). 二次聚集理論上是小缺憾, 模擬結果
指出, 對每次查詢, 它一般要引起另外的少於一半的探測.
3.雙雜湊
對於雙雜湊, 一種流行的選擇是f(i)=i*hash2(x). 該公式是說, 將第二個雜湊函式應用到x並在距離hash2(x), 2hash2(x),......等處探測.hash2(x)選擇得不好將會很糟糕.
諸如hash2(x)=r-(x mod r)這樣的函式將起到良好的作用,其中r為小於tablesize的素數.
在使用雙雜湊時, 保證表的大小為素數是非常重要的.
如果雙雜湊正確實現, 模擬表明, 預期的探測次數幾乎和隨機衝突解決方法的情形相同.這使得雙雜湊理論上很有吸引力.
不過平方探測不需要使用第二個雜湊函式, 從在實踐中可能更簡單並且快.當鍵為字串時,尤其如此, 因為其雜湊函式計算很耗時.
再雜湊當表中的元素達到一定條件後(通常為效能下降), 新建乙個表, 將原表遷移過去的操作
再雜湊可以用平方探測以多種方法實現.
1.只要表填到一般就再雜湊
2.只有當插入失敗時才雜湊, 這是一種極端的做法.
3.途中(middle-of-road)策略: 當表達到某乙個裝填因子時進行再雜湊.
由於隨著裝填因子的增加,標的效能的確在下降, 因此以好的截止點實現的第三種策略, 可能是最好的策略.
對於平方探測法:
建立另外乙個大約兩倍大的表(原表大小兩倍後的第乙個素數), 而且使用乙個相關的新雜湊函式, 掃瞄整個原始雜湊表, 計算每個(未刪除的)元素的新增雜湊值並將其插入到新錶中
資料結構 雜湊表
1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...
資料結構 雜湊表
雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...
資料結構 雜湊表
3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...