hash算法的介绍 【清晰易懂】
?
?
Hash表是一種數(shù)據(jù)結(jié)構(gòu) 提供快速的存取和查找,他是基于數(shù)組的,數(shù)組創(chuàng)建后大小是固定的難以拓展 ,當(dāng)然可以復(fù)制數(shù)據(jù)到更大的數(shù)組,但是非常消耗性能,如果數(shù)據(jù)量固定,需要快速查詢時(shí) hash表是一個(gè)不錯(cuò)的選擇
?
數(shù)組只能以數(shù)字作為下標(biāo) 而不能以字符串作為下標(biāo) 所以要考慮將字符串轉(zhuǎn)換為唯一的數(shù)字 這個(gè)過程叫做hash化 過程由hash函數(shù)完成,使用hash函數(shù)插入數(shù)據(jù)到數(shù)組后,數(shù)組被稱為hash表
?
Hash函數(shù)
1疊加法
假如給 字母編個(gè)號碼
空格0 a 1 ,b2 c 2,? 27 z
?
Hash函數(shù)采用加法運(yùn)算
?? 比如 abc = 1+2+3
?? 最大的字母是10位
?? zzzzzzzzzz=26*10=260
?
顯然 所有的字母可能只能組合出? 260個(gè)索引為 ,而實(shí)際上單詞有 50000
?
而每一個(gè)索引的位置 需要存放單詞 50000/260=192個(gè)單詞 顯然不行
?
2 冪的連續(xù)乘法
?
?? 參考數(shù)字的拆分
? ?234=2*100+3*10+4
?
?? 那么abc? 因?yàn)樽帜甘?/span>27個(gè)
?? 1*27*27+2*27+3= 786
?
如果是 zzzzzzzzzz=?? 不知道有多大? 可能會操過變量允許的最大位數(shù)
?
怎么解決了 可以對產(chǎn)生的數(shù)字進(jìn)行壓縮
?比如 數(shù)組的大小是1000?
那么獲取下標(biāo)可以用 要存放的字母冪的連乘獲取的結(jié)果 % 1000(也就是數(shù)組的大小)
就能獲取一個(gè)數(shù) <1000 的
?比如(1000+999)%1000 =999??
?
這樣仍然有一個(gè)問題
?
就是數(shù)組 可能壓縮產(chǎn)生的數(shù)字 已經(jīng)被其他的字母占據(jù)了 怎么辦了
?
有兩種解決方法 :開放地址法 和 鏈地址法
?
2.1開放地址法:
? 開放地址法就是發(fā)現(xiàn)如果被占據(jù),就需要利用方法去找尋空白的位置,三種方法:線性探測,二次探測,再hash法
?? 線性探測: 比如產(chǎn)生的索引位置是123,123被占據(jù)了? 找124 124被占用找125 一直到找到是空白的地址
?
?? 二次探測:已填充數(shù)據(jù)的個(gè)數(shù)/hash表的大小 就是裝填因子,聚集就是hash表某個(gè)部分的位置都被填充 而部分位置一個(gè)數(shù)據(jù)的都沒有 出現(xiàn)聚集時(shí) 可能到比較遠(yuǎn)一點(diǎn)的單元格去尋找空的位置 就叫二次探測
?
? 一次探測 比如 找到的位置是 123? 123+1 ,123+2? 一步一步探測
? 二次探測????? 找到的位置是 123? 123+1?? 123+4 123+9? 已 n的平方來探測
可以這么理解 首先查找臨邊 如果臨邊被占據(jù)了 懷疑可能旁邊也被占據(jù)了,跳到4的位置
有點(diǎn)憂慮可能有很大的聚集 結(jié)果跳到9的位置
?? 但是二次探測也會產(chǎn)生問題 :二次聚集 比如 n多個(gè)數(shù) 通過hash函數(shù)轉(zhuǎn)換的數(shù)字式一樣的 跳動的步驟也是一樣的 出現(xiàn)二次聚集
?
再哈希法:二次探測出現(xiàn)二次聚集的原因是因?yàn)?/span> 步長時(shí)相同的,現(xiàn)在需要創(chuàng)建一個(gè)布長不一樣的探測序列 這個(gè)序列可以在用一次hash化一便,布長不能為0 否則每次都在原地打轉(zhuǎn)
? stepSize=contant*(key%contant)
contant是介質(zhì) 小于數(shù)組容量,key是第一次hash的位置
?
?
2.2鏈地址法:
?這種方法比較容易理解
?Hash表中位置放置的是第一次插入的值,以后如果hash話出來的位置 已經(jīng)存在數(shù)據(jù)的話 就已鏈表的形式指向第一個(gè)位置 ,如果在來一個(gè)指向第二個(gè)位置
?
很明顯這樣做會出現(xiàn)重復(fù)值 ,當(dāng)然也允許出現(xiàn)重復(fù)值
鏈表就不用再擔(dān)心容量問題
?
轉(zhuǎn)載于:https://www.cnblogs.com/liaomin416100569/archive/2010/10/28/9331589.html
總結(jié)
以上是生活随笔為你收集整理的hash算法的介绍 【清晰易懂】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双子座|双子座性格分析
- 下一篇: MS-SQL中的事务