在结构中查找数据的时候需要进行一系列和关键字作比较的动作,这种查找建立在比较的基础上。查找的效率和比较的次数密切相关,我们希望能直接找到我们想要的数据。因此必须在数据的存储位置和关键字之间建立一个确定的对应关系,使得每一个关键字和结构中的唯一储存的位置对应,这个对应关系称为哈希函数,这个思想建立的表称为哈希表。
1.哈希表
哈希表(hash table)也叫散列表,是根据关键码值(key value)而直接进行访问的数据结构
哈希表将所有的数据元素放在一串被称作桶的线性表中(一个顺序存储的线性表,底层数组),如图中的T,散列分布的关键字集合如图中的U,以关键字K为自变量通过一个确定的方法哈希方法来计算返回对应的值hashkey(也可以理解为数组的下标),这个值是一个存储单位的地址,指向线性表T的索引从而可以确定一个数据元素
现在的问题就是这个计hashkey或者计算数组下边的哈希方法怎么来确定???
原则:一个好的哈希方法映射到存储单元的地址应该是随机的,以便使一组哈希地址的关键字均匀分布,从而减少冲突,所以哈希表的选择标准是简单,均匀。
2.哈希表常用的方法
- 直接寻址法
- 数字分析法
- 平方取中法
- 折叠法
- 除留余数法
1.直接寻址法
h(k)=key*a+b
Key为集合U中关键字,a,b为常数,h(k)就是我们的哈希地址
2.数字分析法:是取关键字中取值比较分散的数字作为哈希地址,比如下面这串key,前面两位分布比较集中,不适合做哈希地址,所以取后面两位作为哈希地址
3.平方取中法 :当关键字的位数比较多,每位关键字分散比较集中,哈希地址的位数比较少的时候用此方法,他是取关键字的平方的中间几位作为哈希地址。
4.叠加法:叠加法是将哈希表中的关键字分割成位数相等的几段,然后将他们叠加求和作为哈希地址的方法。
5.除留余数法:p小于哈希表的长度并接近哈希表的长度
h(k)=key%p
3.冲突
即便有这么多的哈希方法,也难免会不同的key会算出相同用的hashkey,不同的key就被映射到表的同一位置了。
解决冲突的办法有三种
- 开放寻址法
-
再哈希法
-
链地址法
1.开放寻址法:
线性寻址法的优点:只要哈希表未满,就一定能找到一个不冲突的哈希的地址,缺点:容易产生数据元素聚集的现象
2.再哈希法 :虽然没有产生聚集,但是增加了计算时间
3.链地址法:
当key为16或27时,查找就会遇到下面的问题
循环历遍链表找到与关键字匹配即可
4.练习:
错误,因为哈希表的节点中,key会通过指针指向数据元素