一、基本概念
散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。
f:散列函数/哈希函数;
采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表。
关键字对应的记录存储位置称为散列地址。
散列技术既是一种存储方法,也是一种查找方法。
散列技术适合求解问题是查找与给定值相等的记录。查找速度快。
散列技术不适合范围查找,不适合查找同样关键字的记录,不适合获取记录的排序,最值。
冲突:关键字key1不等于key2,但f(key1)=f(key2)。
把key1和key2称为散列函数的同义词。
二、散列函数构造
两个原则:
- 计算简单
- 散列地址分布均匀
1. 直接定址发
f(key)=a x key+b(a、b为常数)
简单,均匀,不会冲突,但是事先知道关键字的分布情况,适合查找表小且连续。
2. 数字分析法
关键字位数多,比如手机号,可能前几位一样,只是后几位不同,抽取关键字的一部分计算散列存储位置。事先知道关键字分布且若干位分布均匀。
3. 平方取中法
不知道关键字分布,且位数不是很大。1234,平方1522756,抽取中间227作为散列地址。
4. 折叠法
不知道关键字分布,位数多。
从左到右分割成位数相等的几部分,这几部分叠加求和,并按散列表表长,取后几位作为散列地址。
5. 除留余数法
散列表长m
f(key)=key mod p(p<=m)
p选取不好,产生冲突。
通常p为<=m(最好接近m)的最小质数或者不包含小于20质因子的合数。
6. 随机数法
关键字长度不等。
f(key)=random(key),random随机函数
当关键字为字符串,转化为某种数字来对待,比如ASCLL码或者Unicode码等。