数据结构散列表课件

上传人:94****0 文档编号:241743625 上传时间:2024-07-20 格式:PPT 页数:33 大小:207.65KB
返回 下载 相关 举报
数据结构散列表课件_第1页
第1页 / 共33页
数据结构散列表课件_第2页
第2页 / 共33页
数据结构散列表课件_第3页
第3页 / 共33页
点击查看更多>>
资源描述
7.3 散列表的查找技术散列表的查找技术顺序查找、折半查找等。顺序查找、折半查找等。这些查找技术都是通过一系列的给定值与关键码的这些查找技术都是通过一系列的给定值与关键码的比较,查找效率依赖于查找过程中进行的给定值与比较,查找效率依赖于查找过程中进行的给定值与关键码的比较次数。关键码的比较次数。查找操作要完成什么任务?查找操作要完成什么任务?待查值待查值k确定确定k在存储结构中的位置在存储结构中的位置我们学过哪些查找技术?这些查找技术的共性?我们学过哪些查找技术?这些查找技术的共性?在存储位置和关键码之间建立一个确定的对应关系在存储位置和关键码之间建立一个确定的对应关系能否不用比较,通过关键码直接确定存储位置?能否不用比较,通过关键码直接确定存储位置?7.3 散列表的查找技术顺序查找、折半查找等。查找操作要1概概概概 述述述述散列的基本思想:散列的基本思想:散列的基本思想:散列的基本思想:在记录的存储地址和它的关键码之在记录的存储地址和它的关键码之在记录的存储地址和它的关键码之在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一间建立一个确定的对应关系。这样,不经过比较,一间建立一个确定的对应关系。这样,不经过比较,一间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。次读取就能得到所查元素的查找方法。次读取就能得到所查元素的查找方法。次读取就能得到所查元素的查找方法。7.3 散列表的查找技术散列表的查找技术关键码集合ki riH(ki)H概 述散列的基本思想:在记录的存储地址和它的关键码之间建立一2散列表:散列表:散列表:散列表:采用散列技术将记录存储在一块采用散列技术将记录存储在一块采用散列技术将记录存储在一块采用散列技术将记录存储在一块连续连续连续连续的存储的存储的存储的存储空间中,空间中,空间中,空间中,这块连续的存储空间这块连续的存储空间这块连续的存储空间这块连续的存储空间称为散列表。称为散列表。称为散列表。称为散列表。概概概概 述述述述7.3 散列表的查找技术散列表的查找技术关键码集合ki riH(ki)H散列表散列表数组数组散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连3散列函数:散列函数:散列函数:散列函数:将关键码映射为散列表中适当存将关键码映射为散列表中适当存将关键码映射为散列表中适当存将关键码映射为散列表中适当存储位置的储位置的储位置的储位置的函数。函数。函数。函数。概概概概 述述述述7.3 散列表的查找技术散列表的查找技术散列表散列表关键码集合ki riH(ki)H散列函数散列函数数组数组散列函数:将关键码映射为散列表中适当存储位置的函数。概 述74散列地址:散列地址:散列地址:散列地址:由散列函数由散列函数由散列函数由散列函数所得的存储位置所得的存储位置所得的存储位置所得的存储位置 。概概概概 述述述述7.3 散列表的查找技术散列表的查找技术散列表散列表关键码集合ki riH(ki)H散列函数散列函数散列地址散列地址下标下标数组数组散列地址:由散列函数所得的存储位置。概 述7.3 散列5例子例子l一组数:12,37,52,43,84,99l散列函数为:H(k)=k%11l散列表:长度为11012345678910123752438499例子一组数:12,37,52,43,84,9901234566概概概概 述述述述7.3 散列表的查找技术散列表的查找技术散列技术仅仅是一种查找技术吗?散列技术仅仅是一种查找技术吗?散列既是一种查找技术,也是一种存储技术。散列既是一种查找技术,也是一种存储技术。散列只是通过记录的关键码定位该记录,没有完散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,所以,散列主要整地表达记录之间的逻辑关系,所以,散列主要是是面向查找面向查找的存储结构。的存储结构。散列是一种散列是一种完整的存储结构完整的存储结构吗?吗?概 述7.3 散列表的查找技术散列技术仅仅是一种查找技术7散列技术的关键问题:散列技术的关键问题:散列技术的关键问题:散列技术的关键问题:散列函数的设计。如何设计一个简单、均匀、存储散列函数的设计。如何设计一个简单、均匀、存储散列函数的设计。如何设计一个简单、均匀、存储散列函数的设计。如何设计一个简单、均匀、存储利用率高的散列函数。利用率高的散列函数。利用率高的散列函数。利用率高的散列函数。冲突的处理。如何采取合适的处理冲突方法来解决冲突的处理。如何采取合适的处理冲突方法来解决冲突的处理。如何采取合适的处理冲突方法来解决冲突的处理。如何采取合适的处理冲突方法来解决冲突。冲突。冲突。冲突。7.3 散列表的查找技术散列表的查找技术概概概概 述述述述散列技术的关键问题:7.3 散列表的查找技术概 述8冲突:冲突:冲突:冲突:对于两个不同关键码对于两个不同关键码对于两个不同关键码对于两个不同关键码k ki i k kj j,有,有,有,有HH(k ki i)HH(k kj j),即两个不同的记录即两个不同的记录即两个不同的记录即两个不同的记录需要存放在同一个存储位置需要存放在同一个存储位置需要存放在同一个存储位置需要存放在同一个存储位置,k ki i和和和和k kj j相对于相对于相对于相对于HH称做称做称做称做同义词同义词同义词同义词。7.3 散列表的查找技术散列表的查找技术概概概概 述述述述 ri关键码集合kiH(ki)kjH(kj)冲突:对于两个不同关键码kikj,有H(ki)H(kj)9散列函数散列函数散列函数散列函数7.3 散列表的查找技术散列表的查找技术设计散列函数一般应遵循以下原则:设计散列函数一般应遵循以下原则:设计散列函数一般应遵循以下原则:设计散列函数一般应遵循以下原则:计算计算计算计算简单简单简单简单。散列函数不应该有很大的计算量,否。散列函数不应该有很大的计算量,否。散列函数不应该有很大的计算量,否。散列函数不应该有很大的计算量,否则会降低查找效率。则会降低查找效率。则会降低查找效率。则会降低查找效率。函数值即散列地址分布函数值即散列地址分布函数值即散列地址分布函数值即散列地址分布均匀均匀均匀均匀。函数值要尽量均匀。函数值要尽量均匀。函数值要尽量均匀。函数值要尽量均匀散布在地址空间,这样才能保证存储空间的有效利散布在地址空间,这样才能保证存储空间的有效利散布在地址空间,这样才能保证存储空间的有效利散布在地址空间,这样才能保证存储空间的有效利用并减少冲突。用并减少冲突。用并减少冲突。用并减少冲突。散列函数7.3 散列表的查找技术设计散列函数一般应遵循以101 1 1 1、散列函数、散列函数、散列函数、散列函数直接定址法直接定址法直接定址法直接定址法散列函数是关键码的线性函数散列函数是关键码的线性函数,即:即:H(key)=a key+b (a,b为常数)为常数)例:关键码集合为例:关键码集合为10,30,50,70,80,90,选取的散,选取的散列函数为列函数为H(key)=key/10,则散列表则散列表为:为:0 1 2 3 4 5 6 7 8 9103050708090适用情况?适用情况?事先知道关键码,关键码集合不是很大且连续性较好。事先知道关键码,关键码集合不是很大且连续性较好。7.3 散列表的查找技术散列表的查找技术1、散列函数直接定址法散列函数是关键码的线性函数,即:H11散列函数为:散列函数为:H(key)=key mod p 7.3 散列表的查找技术散列表的查找技术2 2 2 2、散列函数、散列函数、散列函数、散列函数除留余数法除留余数法除留余数法除留余数法如何选取合适的如何选取合适的 p,产生较少同义词?,产生较少同义词?一般情况下,选一般情况下,选p为小于或等于表长(最好接近表长)为小于或等于表长(最好接近表长)的最小素数。的最小素数。适用情况?适用情况?除留余数法是一种最简单、也是最常用的构造散列除留余数法是一种最简单、也是最常用的构造散列除留余数法是一种最简单、也是最常用的构造散列除留余数法是一种最简单、也是最常用的构造散列函数的方法,并且不要求事先知道关键码的分布。函数的方法,并且不要求事先知道关键码的分布。函数的方法,并且不要求事先知道关键码的分布。函数的方法,并且不要求事先知道关键码的分布。散列函数为:H(key)=key mod p 7.3 12根据关键码在各个位上的分布情况,选取分布比较根据关键码在各个位上的分布情况,选取分布比较均匀均匀的若干位组的若干位组成散列地址。成散列地址。例:关键码为例:关键码为8位十进制数,散列地址为位十进制数,散列地址为2位十进制数位十进制数8 1 3 4 6 5 3 28 1 3 7 2 2 4 28 1 3 8 7 4 2 28 1 3 0 1 3 6 78 1 3 2 2 8 1 7 8 1 3 3 8 9 6 7 7.3 散列表的查找技术散列表的查找技术3 3 3 3、散列函数、散列函数、散列函数、散列函数数字分析法数字分析法数字分析法数字分析法根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成13适用情况适用情况:能预先估计出全部关键码的每一位上各种数字出现能预先估计出全部关键码的每一位上各种数字出现的频度,不同的关键码集合需要重新分析。的频度,不同的关键码集合需要重新分析。7.3 散列表的查找技术散列表的查找技术3 3 3 3、散列函数、散列函数、散列函数、散列函数数字分析法数字分析法数字分析法数字分析法适用情况:能预先估计出全部关键码的每一位上各种数字出现的频度14对关键码平方后,按散列表大小,取中间的若干位作对关键码平方后,按散列表大小,取中间的若干位作为散列地址(为散列地址(平方平方后后截取截取)。)。7.3 散列表的查找技术散列表的查找技术4 4 4 4、散列函数、散列函数、散列函数、散列函数平方取中法平方取中法平方取中法平方取中法事先不知道关键码的分布且关键码的位数不是很大。事先不知道关键码的分布且关键码的位数不是很大。适用情况适用情况:例:散列地址为例:散列地址为2位,则关键码位,则关键码123的散列地址为:的散列地址为:(1234)21522756对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平15将关键码从左到右分割成位数相等的几部分,将这几将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,取后几位作为散列地址。部分叠加求和,取后几位作为散列地址。7.3 散列表的查找技术散列表的查找技术5 5 5 5、散列函数、散列函数、散列函数、散列函数折叠法折叠法折叠法折叠法例:设关键码为例:设关键码为2 5 3 4 6 3 5 8 7 0 5,散列地址为三位。,散列地址为三位。2 5 3 4 6 3 5 8 7 +0 5 1 3 0 8 移位叠加 2 5 3 3 6 4 5 8 7 +5 0 1 2 5 4 间界叠加适用情况适用情况:关键码位数很多,事先关键码位数很多,事先不知道关键码的分布。不知道关键码的分布。将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,161 1 1 1、处理冲突的方法、处理冲突的方法、处理冲突的方法、处理冲突的方法开放定址法开放定址法开放定址法开放定址法由关键码得到的散列地址一旦产生了冲突,就去寻找由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空下一个空的散列地址,并将记录存入。的散列地址,并将记录存入。如何寻找下一个空的散列地址如何寻找下一个空的散列地址?7.3 散列表的查找技术散列表的查找技术(1)线性探测法)线性探测法(2)二次探测法)二次探测法(3)随机探测法)随机探测法1、处理冲突的方法开放定址法由关键码得到的散列地址一旦产17(1)线性探测法)线性探测法当发生冲突时,从冲突位置的下一个位置起,依次当发生冲突时,从冲突位置的下一个位置起,依次寻找空的散列地寻找空的散列地址。址。对对于于键键值值key,设设H(key)=d,闭闭散散列列表表的的长长度度为为m,则发生冲突时,寻找下一个散列地址的公式为:则发生冲突时,寻找下一个散列地址的公式为:Hi=(H(key)di)%m (di=1,2,m-1)7.3 散列表的查找技术散列表的查找技术用开放定址法处理冲突得到的散列表叫用开放定址法处理冲突得到的散列表叫闭散列表闭散列表。(1)线性探测法当发生冲突时,从冲突位置的下一个位置起,依次18例例:关关键键码码集集合合为为 47,7,29,11,16,92,22,8,3,散散列列表表表表长长为为11,散散列列函函数数为为H(key)=key mod 11,用用线线性探测法处理冲突,则构造的散列表为:性探测法处理冲突,则构造的散列表为:0 1 2 3 4 5 6 7 8 947729111692292222883333堆积:堆积:在处理冲突的过程中出现的在处理冲突的过程中出现的非同义词非同义词之间对之间对同一个散列地址争夺的现象同一个散列地址争夺的现象。7.3 散列表的查找技术散列表的查找技术(1)线性探测法)线性探测法例:关键码集合为 47,7,29,11,16,919用线性探测法构造的散列表中查找算法用线性探测法构造的散列表中查找算法伪代码伪代码1.计算散列地址计算散列地址j;2.若若htj=k,则查找成功,返回记录在散列表中的下标;,则查找成功,返回记录在散列表中的下标;否则否则3.若若htj为空或将散列表探测一遍,则查找失败,转为空或将散列表探测一遍,则查找失败,转4;否则,否则,j指向下一单元,转指向下一单元,转2;4.若整个散列表探测一遍,则表满,抛出溢出异常;若整个散列表探测一遍,则表满,抛出溢出异常;否则,将待查值插入;否则,将待查值插入;7.3 散列表的查找技术散列表的查找技术用线性探测法构造的散列表中查找算法伪代码1.计算散列地20int HashSearch1(int ht,int m,int k)int j=k%m;if(htj=k)return j;/没有发生冲突,比较一次查找成功没有发生冲突,比较一次查找成功 int i=(j+1)%m;while(i!=j)if(hti=k)return i;/发生冲突发生冲突 if(hti=0)break;i=(i+1)%m;/向后探测一个位置向后探测一个位置 if(i=j)throw 溢出溢出;else hti=k;return i;7.3 散列表的查找技术散列表的查找技术在线性探测法构造的散列表中查找算法在线性探测法构造的散列表中查找算法C+描述描述int HashSearch1(int ht,in21(2)二次探测法)二次探测法当发生冲突时,寻找下一个散列地址的公式为:当发生冲突时,寻找下一个散列地址的公式为:Hi=(H(key)di)%m(di=12,12,22,22,q2,q2且且qm/2)7.3 散列表的查找技术散列表的查找技术(2)二次探测法当发生冲突时,寻找下一个散列地址的公式为:722 0 1 2 3 4 5 6 7 8 94772911169229222288333例例:关关键键码码集集合合为为 47,7,29,11,16,92,22,8,3,散散列列表表表表长长为为11,散散列列函函数数为为H(key)=key mod 11,用用二次探测法处理冲突,则散列表为:二次探测法处理冲突,则散列表为:(2)二次探测法)二次探测法7.3 散列表的查找技术散列表的查找技术 0 1 2 3 423(3)随机探测法)随机探测法当发生冲突时,下一个散列地址的位移量是一个随当发生冲突时,下一个散列地址的位移量是一个随机数列,即机数列,即寻找下一个散列地址的公式寻找下一个散列地址的公式为:为:Hi=(H(key)+di)%m (di是一个随机数列,是一个随机数列,i=1,2,m-1)7.3 散列表的查找技术散列表的查找技术计算机中产生随机数的方法通常采用线性同余法,计算机中产生随机数的方法通常采用线性同余法,其其中中,d称称为为随随机机种种子子。当当b、c和和m的的值值确确定定后后,给定一个随机种子,产生确定的随机数序列。给定一个随机种子,产生确定的随机数序列。0=da=+=-1,2,LLmod)(1nmcbaann(3)随机探测法当发生冲突时,下一个散列地址的位移量是一个随24基本思想基本思想:将所有散列地址相同的记录,即所有同义:将所有散列地址相同的记录,即所有同义词的记录存储在一个单链表中(称为同义词子表),词的记录存储在一个单链表中(称为同义词子表),在散列表中存储的是所有同义词子在散列表中存储的是所有同义词子表的头指针。表的头指针。用拉链法处理冲突构造的散列表叫做用拉链法处理冲突构造的散列表叫做开散列表开散列表。设设n个记录存储在长度为个记录存储在长度为m的散列表中,则同义词子的散列表中,则同义词子表的平均长度为表的平均长度为n/m。7.3 散列表的查找技术散列表的查找技术2 2 2 2、处理冲突的方法、处理冲突的方法、处理冲突的方法、处理冲突的方法拉链法(链地址法)拉链法(链地址法)拉链法(链地址法)拉链法(链地址法)基本思想:将所有散列地址相同的记录,即所有同义词的记录存储在25例:关键码集合例:关键码集合 47,7,29,11,16,92,22,8,3,散列,散列函数为函数为H(key)=key mod 11,用拉链法处理冲突,构造,用拉链法处理冲突,构造的开散列表为:的开散列表为:7.3 散列表的查找技术散列表的查找技术 0 1 2 3 4 5 6 7 8 910 11 22 47 3 92 16 7 29 8 例:关键码集合 47,7,29,11,16,9226在拉链法构造的散列表查找算法在拉链法构造的散列表查找算法伪代码伪代码1.计算散列地址计算散列地址j;2.在第在第j个同义词子表中顺序查找;个同义词子表中顺序查找;3.若查找成功,则返回结点的地址;若查找成功,则返回结点的地址;否则,将待查记录插在第否则,将待查记录插在第j个同义词子表的表头。个同义词子表的表头。7.3 散列表的查找技术散列表的查找技术在拉链法构造的散列表查找算法伪代码1.计算散列地址j;27Node*HashSearch2(Node*ht,int m,int k)j=H(k);p=htj;while(p&p-data!=k)p=p-next;if(p-data=k)return p;else q=new Node;q-data=k;q-next=htj;htj=q;7.3 散列表的查找技术散列表的查找技术在拉链法构造的散列表查找算法在拉链法构造的散列表查找算法C+描述描述Node*HashSearch2(Nodein28基本思想基本思想:散列表包含:散列表包含基本表基本表和和溢出表溢出表两部分(通常两部分(通常溢出表和基本表的大小相同),将发生冲突的记录存溢出表和基本表的大小相同),将发生冲突的记录存储在溢出表中。查找时,对给定值通过散列函数计算储在溢出表中。查找时,对给定值通过散列函数计算散列地址,先与散列地址,先与基本表基本表的相应单元进的相应单元进行比较,若相等,行比较,若相等,则查找成功;否则,再到则查找成功;否则,再到溢出表溢出表中进行顺序查找。中进行顺序查找。7.3 散列表的查找技术散列表的查找技术3 3 3 3、处理冲突的方法、处理冲突的方法、处理冲突的方法、处理冲突的方法公共溢出区公共溢出区公共溢出区公共溢出区基本思想:散列表包含基本表和溢出表两部分(通常溢出表和基本表29例:关键码集合例:关键码集合 47,7,29,11,16,92,22,8,3,散列,散列函数为函数为H(key)=key mod 11,用公共溢出区法处理冲突,用公共溢出区法处理冲突,构造的散列表为:构造的散列表为:7.3 散列表的查找技术散列表的查找技术 0 1 2 3 4 5 6 7 8 910 基本表 溢出表 11 47 92 16 7 8 0 1 2 3 4 5 6 7 8 910 29 22 3 例:关键码集合 47,7,29,11,16,9230散列查找的性能分析散列查找的性能分析散列查找的性能分析散列查找的性能分析 由于冲突的存在,产生冲突后的查找仍然是给定值与由于冲突的存在,产生冲突后的查找仍然是给定值与关键码进行比较的过程。关键码进行比较的过程。在查找过程中,关键码的比较次数取决于产生冲突的在查找过程中,关键码的比较次数取决于产生冲突的概率。概率。而影响冲突产生的因素有:而影响冲突产生的因素有:(1 1)散列函数是否均匀)散列函数是否均匀(2 2)处理冲突的方法)处理冲突的方法(3 3)散列表的装载因子)散列表的装载因子 =表中填入的记录数表中填入的记录数/表的长度表的长度7.3 散列表的查找技术散列表的查找技术散列查找的性能分析 由于冲突的存在,产生冲突后的查找仍然是给31查找成功时查找成功时查找不成功时查找不成功时线性探测法线性探测法二次探测法二次探测法拉链法拉链法ASL处理冲突方法处理冲突方法几种不同处理冲突方法的平均查找长度几种不同处理冲突方法的平均查找长度7.3 散列表的查找技术散列表的查找技术查找成功时查找不成功时线性探测法二次探测法拉链法ASL处理冲32开散列表与闭散列表的比较开散列表与闭散列表的比较开散列表与闭散列表的比较开散列表与闭散列表的比较7.3 散列表的查找技术散列表的查找技术不产生不产生产生产生有有没有没有堆积现象堆积现象结构开销结构开销插入插入/删除删除 查找效率查找效率开开散散列列表表闭闭散散列列表表效率高效率高效率低效率低效率高效率高效率低效率低估计容量估计容量不需要不需要需要需要开散列表与闭散列表的比较7.3 散列表的查找技术不产生产33
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!