哈希表
根据之前学的内容,查找一个关键字需要对待查序列的值一一进行比较;那在查找时能不能使用一种方式减少值的比较?
所以就有了哈希表的概念,根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表,通过将待查记录的关键字值和它存储位置之间建立一个确定的对应关系,则查找时不再进行关键字值间的比较,从而提高查找时的效率。
哈希函数:也叫做散列函数,根据关键字值而计算出存储地址,也就是将地址和值建立一种关系。
哈希表:存放存储地址与对应的关键字值。
举个列子:根据下图的电话号码建立哈希表;分为两步
1)建立哈希函数,求出关键字值在哈希函数中的值
2)将第一步的数对输出长度取余,得到关键字值所要存储的位置,即哈希值。
那么就存在一个问题,hash值与关键字值是一一对应的吗?
根据上面所述,到杨小强时本应放在4号位置上,但是4号位置已经有值,这时就发生了冲突。
构造哈希函数的基本方法
1、直接定址法:也就是直接确定地址
2、数字分析法:若关键字是r进制数,且可预知全部可能出现的关键字值,则可取关键字中若干为构成哈希地址。例如:有下列十个数字。我们可以选择4、5位构造哈希函数(key/1000%100);
3、平方取中法:若关键字较短,则可先对关键字值求平方,然后取运算结果的中间几位为哈希地址。
4、折叠法:将关键字分割成位数相同的几个部分,然后取这几部分的叠加和(舍去进位)作为哈希地址。
例如图书馆编号0-442-20586-4,即0442205864,由低位向高位,每四位一折,可得三段,再将各部分按最低位对齐后相加,并舍去进位,得到对应的哈希地址。
5、除留余数法(经常使用)
这里要注意p要为质数,如果p = 9,则对应的哈希函数的值为:3,3,0,6,6,3;这样会增加“冲突的可能”
处理冲突的方法
处理冲突是指对于一个待插入哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按一定规则求下一哈希地址,如此重复,直至找到一个可用的地址以保存该元素。
1、开放地址法:对发生冲突的函数地址做一个增量。若增量d = 1,2,3,4...则称线性探测再散列;若d = 1^2,-1^2,2^2,-2^2...则称为二次探测再散列。使用线性探测再散列的例子:
2、链地址法:将所有按给定的哈希函数求得哈希地址相同的关键字存储在同一线性链表中,且使链表按关键字有序
在哈希表中查找元素
在哈希表中查找数据元素的过程与将数据元素插入哈希表的过程基本一致。
- 根据待查关键字值,按给定的哈希函数,求哈希地址;
- 若该地址上无数据元素,则查找失败;
- 若该地址上有数据元素,则进行关键字值间的比较;若相等,则查找成功;若不等,则按冲突处理方法求下一个可能的存储地址
哈希表的应用
1、海量数据的处理:详见https://blog.csdn.net/QX_a11/article/details/88967462
2、使用哈希的加密算法:详见https://blog.csdn.net/zongyue_wang/article/details/81947142