日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hash算法的介绍 【清晰易懂】

發(fā)布時(shí)間:2024/6/5 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hash算法的介绍 【清晰易懂】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?

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)生的索引位置是123123被占據(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。