散列表特点 :
数据元素的关键字与存储地址直接相关
通过哈希函数建立“关键字”与“存储地址”的联系
若不同的关键字通过散列函数映射到同一个值,则称它们为 “同义词”
通过散列函数确定的位置已经存放了其他元素,则称这种情况为 “冲突”
表长为m,取不大于m但最接近或等于m的质数
适合 关键字分布基本连续 的情况
散列查找是典型的 “用空间换时间” 的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低。
空地址既对同义词开放,又向非同义词开放。其数学递推公式为
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m
其中 i ∈ [ 0 , m − 1 ] i\in[0,m-1] i∈[0,m−1],m表示散列表表长, d i d_i di为增量序列;H(key)表示初始地址;i理解为“第i次发生冲突”
d i = 0 , 1 , 2 , . . . , m − 1 d_i=0,1,2,...,m-1 di=0,1,2,...,m−1
1存储操作
即发生冲突时,每次往后探测一个单元(向后挪1单元)。若为空,放入,若发生冲突,则接着挪
【易错点】
H ( k e y ) = k e y % p H(key)=key\%p H(key)=key%p
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m
m和p不一定相等
例如:
n=13;p为不大于n且与n互质的数,为13
m为表长为16
H ( 25 ) = 25 % 13 = 12 H(25)=25\%13=12 H(25)=25%13=12
H 1 = ( 12 + 1 ) % 16 = 13 H_1=(12+1)\%16=13 H1=(12+1)%16=13
查找操作与存储操作类同。当查找到第一个空位,仍未找到,则查找失败。(例如查找21,从位置8开始查找,直到位置13,仍未找到。查找失败)
缺点:
d i = 0 , 1 , − 1 , 2 2 , − 2 2 , 3 2 , − 3 2 . . . . d_i=0,1,-1,2^2,-2^2,3^2,-3^2.... di=0,1,−1,22,−22,32,−32....
存储操作
即发生冲突时,以H(key)为,向右向左探索。若为空,放入;若左右都冲突,探测下一个平方值,直至找到空位(eg. H(key)=9, 若10和8都冲突,探测13和5,以此类推)
【注意】:
d i = 0 , 5 , 24 , 11 , . . d_i=0,5,24,11,.. di=0,5,24,11,..或其他给出的伪随机序列
与以上两种操作类同,不再赘述