這裏總結一下Hash散列當出現不能插入位置的幾種位移和計算方式,以避免遺忘和出現不知道都在講些神馬;索引
當咱們key1和key2衝突的時候,主要有三種方式進行衝突解決;hash
先來講兩種開放定址法,所謂開放定址法就是從新計算了hash值;遍歷
1.線性探查法:
當咱們插入key的位置,產生衝突以後,加1,查看該位置是否可使用。若是不可使用,再次+1,重複到找到位置,或者查完沒有知足的位置,而且在這個途中,能夠越過尾部,從hash序列頭部進行枚舉。
可是該方法有一個缺點,就是容易形成元素扎堆;方法
2.平方探查法:
插入時,當H(key)的位置被佔時,將檢查下列位置:H(key)+1^2,H(key)-1^2,H(key)+2^2,H(key)-2^2...。若是在這個途中H(key)+k^2超過了表長,則進行取模操做;若是H(key)-k^2<0時,則進行((H(key)-k^2)%Tsize+Tsize)%Tsize,從而保證索引爲正;
這兩個方向的操做稱爲正向和負向操做,爲了不計算麻煩,每每能夠採用正向操做;注意一點,尋找的次數k在[0,Tsize]內,當k超過這個範圍,必不可能插入,中止計算;鏈表
第三中時拉鍊法則:
3.拉鍊法:
拉鍊法不計算新的hash值,而是在重複Hash值的地方構建一個單鏈表,從而將全部重複的節點鏈接起來,查詢的時候遍歷該鏈表中的全部元素;總結