關於Hash 函式 雜湊索引表 解決位置衝突的問題
最近要用到關於hash表和hash函式,建立索引的方法
主要用於資料的查詢和資料的儲存 ,現在主要不太理解的地方在於如何解決位置衝突的問題。先把收集的資料貼在這裡
處理問題和解決問題的能力有待加強,主要是還不夠淡定,一遇到沒有解決過的問題就會很慌!不可以這樣,淡定和臨危不懼才能體現一個人的素質,要變得更加可靠!
給人自信淡定和從容!
1.Hash表
雜湊表(Hash table,也叫雜湊表),是根據key而直接進行訪問的資料結構。也就是說,它通過把key對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。
以資料中每個元素的關鍵字K為自變數,通過雜湊函式H(k)計算出函式值,以該函式值作為一塊連續儲存空間的的單元地址,將該元素儲存到函式值對應的單元中。
雜湊表儲存的是鍵值對,其查詢的時間複雜度與元素數量多少無關,雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此,雜湊表查詢的時間複雜度為O(1)。
2.雜湊表的構造方法
2.1直接定址法
取關鍵字或者關鍵字的某個線性函式值作為雜湊地址,即
H(Key)=Key或者H(Key)=a*Key+b(a,b為整數)
這種雜湊函式也叫做自身函式.如果H(Key)的雜湊地址上已經有值了,那麼就往下一個位置找,直到找到H(Key)的位置沒有值了就把元素放進去.
此法僅適合於:地址集合的大小 等於 關鍵字集合的大小
2.2 數字分析法
分析一組資料,比如一組員工的出生年月,這時我們發現出生年月的前幾位數字一般都相同,因此,出現衝突的概率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果利用後面的幾位數字來構造雜湊地址,則衝突的機率則會明顯降低.
因此數字分析法就是找出數字的規律,儘可能利用這些資料來構造衝突機率較低的雜湊地址.
此法適於:能預先估計出全體關鍵字的每一位上各種數字出現的頻度。
2.3 平方取中法
以關鍵字的平方值的中間幾位作為儲存地址(雜湊地址)。求“關鍵字的平方值” 的目的是“擴大差別” ,同時平方值的中間各位又能受到整個關鍵字中各位的影響。
此法適於:關鍵字中的每一位都有某些數字重複出現頻度很高的現象。
2.4 摺疊法
將關鍵字分割成若干部分,然後取它們的疊加和為雜湊地址。兩種疊加處理的方法:移位疊加:將分 割後的幾部分低位對齊相加;間界疊加:從一端沿分割界來回摺疊,然後對齊相加。
此法適於:關鍵字的數字位數特別多。
2.5隨機數法
設定雜湊函式為:H(key) = Random(key)其中,Random 為偽隨機函式
此法適於:對長度不等的關鍵字構造雜湊函式。
2.6除留餘數法
取關鍵字被某個不大於雜湊表表長m的數p除後所得的餘數為雜湊地址.即
雜湊函式為:H(key) = key MOD p ( p≤m ),其中, m為表長,p 為不大於 m 的素數。
3.雜湊表衝突解決方法
雜湊表處理衝突主要有開放定址法、再雜湊法、鏈地址法(拉鍊法)和建立一個公共溢位區四種方法。
通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。
“處理衝突” 的實際含義是:為產生衝突的關鍵字尋找下一個雜湊地址。
3.1開放定址法
一旦發生了衝突,就去尋找下一個空的雜湊地址,只要雜湊表足夠大,空的雜湊地址總能找到,並將記錄存入。
3.1.1線性探測
衝突發生時,順序檢視表中下一單元,直到找出一個空單元或查遍全表。
公式:
3.1.2二次探測法
衝突發生時,在表的左右進行跳躍式探測,雙向尋找到可能的空位置。
公式:
3.1.3隨機探測法
在衝突時,對於位移量 di 採用隨機函式計算得到,我們稱之為隨機探測法。
公式:
線性探測再雜湊容易產生“二次聚集”,即在處理同義詞的衝突時又導致非同義詞的衝突。
線性探測再雜湊的優點是:只要雜湊表不滿,就一定能找到一個不衝突的雜湊地址,而二次探測再雜湊和偽隨機探測再雜湊則不一定。
3.2鏈地址法
將所有雜湊地址相同的記錄都連結在同一連結串列中。各連結串列上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。
處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
3.3再雜湊法
這種方法是同時構造多個不同的雜湊函式:
當雜湊地址Hi=RH1(key)發生衝突時,再計算Hi=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。
3.4建立公共溢位區
這種方法的基本思想是:將雜湊表分為基本表和溢位表兩部分,凡是和基本表發生衝突的元素,一律填入溢位表.(注意:在這個方法裡面是把元素分開兩個表來儲存)
相關文章
- 關於hash衝突的解決
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- 雜湊衝突詳解
- 雜湊衝突
- 淺談雜湊法及其解決衝突的方法
- hash衝突解決方法
- 你還應該知道的雜湊衝突解決策略
- 關於函式索引的問題?函式索引
- 利用函式索引解決複雜的約束問題函式索引
- 關於 OkHttp 依賴衝突問題的解決過程HTTP
- JAR衝突問題的解決JAR
- 實戰資料結構(10)_雜湊表的使用--開地址法解決衝突資料結構
- 雜湊表(Hash)的應用
- hash解決衝突的方法優缺點
- git 解決版本衝突問題Git
- 在Java中,HashMap中是用哪些方法來解決雜湊衝突的?JavaHashMap
- 關於解決博弈論問題的SG函式函式
- 幾道和雜湊(雜湊)表有關的面試題面試題
- GO 問題之多版本衝突解決Go
- 雜湊表(雜湊表)詳解
- 【面試普通人VS高手系列】HashMap是怎麼解決雜湊衝突的?面試HashMap
- 聊天室原始碼開發中應對雜湊衝突的解決方案原始碼
- 雜湊函式函式
- Maven中解決依賴衝突的問題Maven
- 關於click事件與touch事件衝突的問題事件
- 雜湊表(雜湊表)原理詳解
- 雜湊函式(Hash Functions - 雜湊函式)的基本介紹(SHA-2,SHA-256,MD-5,Scrypt,BCrypt等)函式Function
- Day76.雜湊表、雜湊函式的構造 -資料結構函式資料結構
- 如解決jquery與原生js衝突的問題jQueryJS
- 關於SVN update之後,引起衝突的解決方法
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- ivew表格中render函式與tooltip:true衝突問題函式
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- Hash雜湊遊戲原始碼丨雜湊競猜遊戲系統技術開發丨Hash雜湊遊戲講解遊戲原始碼
- Git Worktree:解決分支依賴衝突的問題Git
- less中解決CSS3的calc衝突問題CSSS3
- 函式索引的問題函式索引
- Redis命令——雜湊(Hash)Redis