散列查找法(杂凑法或散列法)
在元素的存储位置和其关键字(key)之间建立某种直接关系,在进行查找时,就无需作比较或只需做很少的比较,依据这种关系直接由关键字(key)找到相应的记录。
散列地址:记录的存储位置 p 散列函数:p=H(key)
散列表:通常散列表的存储空间是一个一维数组,散列地址是数组的下标。如 char HT[26][8]表示长度为26,关键字集合为9.
构造散列函数(除留余数法) mod表示对数求余数
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
关键字 | 18 | 33 | 12 | 39 | 21 | 24 | |
比较次数 | 1 | 3 | 1 | 2 | 3 | 1 |
处理冲突的方法:开放地址法、链地址法
探测:寻找下一个“空位”的过程
线性探测法:从冲突地址的下一单元顺序寻找空位,若到最后一个位置也没有找到则从表头开始重新寻找,找不到空位,散列表已满,作溢出处理。
二次探测法:二次探测法是在线性探测法的基础上进行了改进,当发生哈希冲突时,它会按照一定的规律(通常是在冲突位置上加上一个固定的偏移量)遍历哈希表,直到找到一个空闲位置插入新的元素。这个偏移量可以是 1、-1、2、-2 等,具体的偏移量可以根据哈希表的大小和负载因子来确定。[di=1^2,-1^2,2^2,-2^2.....,k^2,-k^2(k<=m/2)]
例题实例: