1、hash法
1、1 哈希函数的常用构造方法
a、 直接寻址法
直接寻址法,就是将关键字和关键字的线性表达作为哈希值。h(key) = key 或 h(key) = a x key + b.
b、取模法
选取一个p,h(key) = key mod p,p一般取哈希长度
c、折叠法
例如:key=12360324711202065,哈希表长度为1000,则应把关键字分成3位一段,在此舍去最低的两位65,分别进行移位叠加和折叠叠加,求得哈希地址为105和907,如图8.24所示。
1 2 3 1 2 3
6 0 3 3 0 6
2 4 7 2 4 7
1 1 2 2 1 1
+) 0 2 0 +) 0 2 0
———————— —————————
1 1 0 5 9 0 7
(a)移位叠加 (b) 折叠叠加
d、除留余数法h(key) = key %p,p一般选取小于和等于表长的质数。
1、2 解决冲突方法
a、开放地址法
意思就是,当哈希值产生冲突的时候,会继续向其他空的地址进行探索。例如,我们算出哈希值为2,但是2已经存在,那么,我们就加1(加其他也可以)也就是3,判断3是否已经存在,如存在则继续探索,否则,就将其存储。
b、再哈希法
意思就是,我们可能有多个哈希函数h1、h2、h3等,当我们通过h1得到的哈希值冲突时,则继续通过h2计算直到不再冲突位置。
c、链地址法(适合冲突比较严重的情况下)
比如,我们有元素{a,b,c,d,e,f,g,h},通过某种哈希函数我们得到哈希值 {0,2,4,1,0,8,7,2}。我们通过链表的形式,将冲突的地方用链表来存储。
d、建立一个公共溢出区