淺談雜湊法及其解決衝突的方法
雜湊法又稱雜湊法,相應的表稱為雜湊表。
基本思想:首先在元素的關鍵字k和元素的儲存位置p之間建立一個對應關係f,使得p=f(k),f稱為雜湊函式。建立雜湊表時,把關鍵字為k的元素直接存入地址為f(k)的單元;以後當查詢關鍵字為k的元素時,再利用雜湊函式計算出該元素的儲存位置p=f(k),從而達到按關鍵字直接存取元素的目的。
衝突:當關鍵字集合很大時,關鍵字值不同的元素可能會映象到雜湊表的同一地址上,即 k1≠k2 ,但 f(k1) =f(k2),此時稱k1和k2為同義詞。實際中,衝突是不可避免的,只能通過改進雜湊函式的效能來減少衝突。
因此雜湊法需要注意兩個問題:
① 如何構造雜湊函式
② 如何處理衝突
構造雜湊函式的原則主要有兩個:
③ 函式本身便於計算;
④ 計算出來的地址分佈均勻,即對任一關鍵字k,f(k) 對應不同地址的概率相等,目的是儘可能減少衝突。
通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。常用的解決衝突方法主要有三種:
① 開放定址法(再雜湊法):
基本思想:當關鍵字k的雜湊地址p=f(k) 出現衝突時,以p為基礎,產生另一個雜湊地址p1,如果p1仍然衝突,再以p為基礎,產生另一個雜湊地址p2,…,直到找出一個不衝突的雜湊地址pi ,將相應元素存入其中。
這種方法有一個通用的再雜湊函式形式:fi = (f(k) + di) % m,i = 1, 2, …, n,其中f(k)為雜湊函式,m 為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同,主要有以下3種:
a. 線性探測再雜湊:di = 1, 2, …, m - 1,衝突發生時,順序檢視錶中下一單元,直到找出一個空單元或查遍全表。
b. 二次探測再雜湊:di = 12, -12, 22, -22, …, k2, -k2(k <= m / 2),衝突發生時,在表的左右進行跳躍式探測,比較靈活。
c. 偽隨機探測再雜湊:di = 偽隨機數序列,建立一個偽隨機數發生器,如i = (i + p) % m,並給定一個隨機數做起點。
② 再雜湊法
同時構造多個不同的雜湊函式,當雜湊地址f1(k) 發生衝突時,再計算f2(k),…,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。
③ 鏈地址法
基本思想:將所有雜湊地址為i的元素構成一個稱為同義詞鏈的單連結串列,並將單連結串列的頭指標存在雜湊表的第i個單元中,因而查詢、插入和刪除主要在同義詞鏈中進行。鏈地址法適用於經常進行插入和刪除的情況。
相關文章
- 雜湊衝突詳解
- 雜湊衝突
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- 你還應該知道的雜湊衝突解決策略
- 在Java中,HashMap中是用哪些方法來解決雜湊衝突的?JavaHashMap
- 程式衝突及其解決
- 實戰資料結構(10)_雜湊表的使用--開地址法解決衝突資料結構
- 淺談雜湊表
- 關於Hash 函式 雜湊索引表 解決位置衝突的問題函式索引
- hash衝突解決方法
- 【面試普通人VS高手系列】HashMap是怎麼解決雜湊衝突的?面試HashMap
- 聊天室原始碼開發中應對雜湊衝突的解決方案原始碼
- css命名衝突解決方法CSS
- 依賴衝突時的解決方法
- 演算法與資料結構——雜湊衝突演算法資料結構
- 解決預設方法衝突的規則
- hash解決衝突的方法優缺點
- linux下SVN衝突的解決方法Linux
- PPT中聲音“衝突”的解決方法
- 使用SUI與JQuery衝突的解決方法UIjQuery
- maven依賴衝突以及解決方法Maven
- 雜湊表 ADT 開放地址法解決衝突【資料結構與演算法分析 c 語言描述】資料結構演算法
- Git 解決衝突Git
- git 解決衝突Git
- Android Studio 包衝突的解決方法Android
- com.android.support衝突的解決辦法Android
- Android Studio 包衝突解決方法Android
- Git:程式碼衝突常見解決方法Git
- webshere6.0 jdom包衝突解決辦法Web
- git pull 衝突解決Git
- windows解決埠衝突Windows
- IP衝突解決方案
- SVN 版本衝突解決
- Git衝突解決技巧Git
- 常用的幾種專案衝突管理的解決方法
- 卡巴斯基和金山詞霸衝突的解決辦法(兩種方法)
- 雙擊和單擊事件衝突解決方法事件
- git pull衝突的解決方案Git