一、哈希表的基本常识
一般的查找技术例如顺序查找、折半查找、二叉排序树查找都依赖于查找过程中进行的给定值与关键码的比较次数,而哈希表最大的不同则是可以不通过比较,而是通过关键码直接确定存储位置。
哈希函数:
用来定义记录的关键字与记录存储位置的对应关系的函数。其自变量是记录的关键字,函数值是记录存储位置
哈希地址:
由哈希函数求出的记录存储位置称为哈希地址。
哈希表:
也叫散列表,是将记录按哈希函数确定的位置存放而构成的表。
注:
1、散列既是一种查找技术,也是一种存储技术。
2、散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,所以,散列主要是面向查找的存储结构。
冲突:
对不同的关键字可能得到同一哈希地址的现象叫做冲突。
同义词:
具有相同函数值的关键字对该哈希函数来说称作同义词。
二、哈希函数的构造方法
应解决两个问题:
1.哈希函数应是一个压缩映像函数,应具有较大的压缩性以节省存储空间;
2.哈希函数应具有较好的散列性,以尽量减少冲突的出现。
一)直接定址法
适应情况:事先知道关键码,关键码集合不是很大且连续性较好。
优点:不会产生冲突 缺点:占用连续空间,空间效率低
二)平方取中法
适应情况:事先不知道关键码的分布,且关键码的位数不是很大。
三)折叠法
适应情况:事先不知道关键码的分布,且关键码的位数很多。
四)除留余数法
技巧:一般情况下,选p为小于或等于表长(最好接近表长)的素数。
缺点:连续的关键码映射成连续的散列值,虽然能保证连续的关键码不发生冲突,但也意味着要占据连续的数组单元,可能导致散列性能的降低
五)数字分析法
六)随机数法
处理冲突的方法
开放定址法:线性探查法、平方探查法、双散列函数探查法
链地址法
同义词:关键字不同而散列函数值相同的关键字
冲突:待插入元素的散列地址单元已被占用,该元素无法直接存入到此单元中。
冲突原因:散列地址区间小于关键字的取值区间
装填因子α:
α是已存入元素与散列空间大小的比例
一般取值为0.6-0.9时产生冲突的可能性较小
例如,若有元素600个,则选取表长为667~1000较为合适。
开放定址法
链接法
散列表上的查找
线性探测法的实际操作
链地址法的实际操作