课堂笔记:散列表的查找技术

散列函数的构造:直接定址法、除留余数法、数字分析法、平方取中法、折叠法(分段叠加法)
冲突处理方法:开放定址法、链地址法、建立公共溢出区
概 述
散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。
散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
散列函数:将关键码映射为散列表中适当存储位置的函数。
散列地址:由散列函数所得的存储位置址 。
散列技术仅仅是一种查找技术吗?
散列既是一种查找技术,也是一种存储技术。
散列是一种完整的存储结构吗?
散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,所以,散列主要是面向查找的存储结构。
散列查找的限制
散列技术一般不适用于允许多个记录有同样关键码的情况:有冲突,降低了查找效率,体现不出计算式查找的优点
散列方法也不适用于范围查找:不能查找最大值、最小值,也不可能找到在某一范围内的记录。
散列技术的关键问题:
⑴ 散列函数的设计。如何设计一个简单、均匀、存储利用率高的散列函数。
⑵ 冲突的处理。如何采取合适的处理冲突方法来解决冲突。
冲突:对于两个不同关键码ki≠kj,有H(ki)=H(kj),即两个不同的记录需要存放在同一个存储位置,ki和kj相对于H称做同义词。
散列函数
设计散列函数一般应遵循以下原则
⑴ 计算简单。散列函数不应该有很大的计算量,否则会降低查找效率。 ⑵ 函数值即散列地址分布均匀。函数值要尽量均匀散布在地址空间,这样才能保证存储空间的有效利用并减少冲突。
散列函数——直接定址法
散列函数是关键码的线性函数,即:
H(key) = a  key + b (a,b为常数)
适用情况?
事先知道关键码,关键码集合不是很大且连续性较好。
散列函数——除留余数法
散列函数为:H(key)=key mod p
如何选取合适的 p,产生较少同义词?
一般情况下,选p为小于或等于表长(最好接近表长)的最大素数
适用情况?
除留余数法是一种最简单、也是最常用的构造散列函数的方法,并且不要求事先知道关键码的分布。
散列函数——数字分析法
根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成散列地址。
适用情况?
事先知道关键码的分布, 关键码的分布均匀
散列函数——平方取中法
对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平方后截取)。
适用情况?
事先不知道关键码的分布且关键码的位数不是很大。
散列函数——折叠法
将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,取后几位作为散列地址。
适用情况?
关键码位数很多,事先不知道关键码的分布。
冲突的处理
开散列方法( open hashing,也称为拉链法,separate chaining ,链地址法)
闭散列方法( closed hashing,也称为开地址方法,open addressing ,开放定址法)
建立公共溢出区
处理冲突的方法——开放定址法
由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空的散列地址,并将记录存入。
如何寻找下一个空的散列地址?
(1)线性探测法 (2)二次探测法 (3)随机探测法 (4)再hash法
用开放定址法处理冲突得到的散列表叫闭散列表
线性探测法
当发生冲突时,从冲突位置的下一个位置起,依次寻找空的散列地址。
对于键值key,设H(key)=d,闭散列表的长度为m,则发生冲突时,寻找下一个散列地址的公式为:
Hi=(H(key)+di) % m (di=1,2,…,m-1)
堆积:在处理冲突的过程中出现的非同义词之间对同一个散列地址争夺的现象。
二次探测法
当发生冲突时,寻找下一个散列地址的公式为:
Hi=(H(key)+di)% m (di=12,-12,22,-22,…,q2,-q2且q≤m/2)
随机探测法
当发生冲突时,下一个散列地址的位移量是一个随机数列,即寻找下一个散列地址的公式为:
Hi=(H(key)+di)% m (di是一个随机数列,i=1,2,……,m-1)
处理冲突的方法——拉链法(链地址法)
基本思想:将所有散列地址相同的记录,即所有同义词的记录存储在一个单链表中(称为同义词子表),在散列表中存储的是所有同义词子表的头指针。
用拉链法处理冲突构造的散列表叫做开散列表
设n个记录存储在长度为m的散列表中,则同义词子表的平均长度为n / m。
处理冲突的方法——公共溢出区
基本思想:散列表包含基本表和溢出表两部分(通常溢出表和基本表的大小相同), 将发生冲突的记录存储在溢出表中。 查找时,对给定值通过散列函数计算散列地址,先与基本表的相应单元进行比较,若相等,则查找成功;否则,再到溢出表中进行顺序查找。
散列查找的性能分析
由于冲突的存在,产生冲突后的查找仍然是给定值与关键码进行比较的过程。
在查找过程中,关键码的比较次数取决于产生冲突的概率。而影响冲突产生的因素有:
(1)散列函数是否均匀
(2)处理冲突的方法
(3)散列表的装载因子:α=表中填入的记录数/表的长度
几种不同处理冲突方法的平均查找长度
在这里插入图片描述
手工计算等概率情况下查找成功的平均查找长度规则如下:
在这里插入图片描述
其中Ci为置入每个元素时所需的比较次数。
手工计算等概率情况下查找不成功的平均查找长度规则如下
在这里插入图片描述
其中Ci为函数取值为i时确定查找不成功时的比较次数。
开散列表与闭散列表的比较
在这里插入图片描述

发布了48 篇原创文章 · 获赞 25 · 访问量 2453

猜你喜欢

转载自blog.csdn.net/qq_43628959/article/details/104328645