数据结构课件chp.ppt
《数据结构课件chp.ppt》由会员分享,可在线阅读,更多相关《数据结构课件chp.ppt(50页珍藏版)》请在三一办公上搜索。
1、散列(Hash)静态散列,第八章 散列,散列(Hashing),在计算机科学中把字典当作一种抽象数据类型。在讨论字典抽象数据类型时,把字典定义为 对的集合。根据问题的不同,可以为名字和属性赋予不同的含义。,在现实中,经常遇到按给定的值进行查询的事例。为此,必须在开发相应软件时考虑在记录的存放位置和用以标识它的数据项(称为关键字)之间的对应关系,从而选择适当的数据结构,很方便地根据记录的关键字检索到对应记录的信息。,字典(Dictionary)的抽象数据类型,例如,在图书馆检索目录中,名字是书名,属性是索书号及作者等信息;在计算机活动文件表中,名字是文件名,属性是文件地址、大小等信息;而在编译程
2、序建立的变量表中,名字是变量标识符,属性是变量的属性、存放地址等信息。,字典的抽象数据类型const int DefaultSize=26;templateclass HashTable public:Dictionary(int size=DefaultSize);int IsIn(Name name);,Attribute*Find(Name name);void Insert(Name name,Attribute attr);void Remove(Name name);,在字典的所有操作中,最基本的只有3种:Find(搜索)Insert(插入)Remove(删除)在选择字典的表示时,
3、必须确保这几个操作的实现。,通常,用文件(表格)来表示实际的对象集合,用文件记录(表格的表项)来表示单个对象。这样,字典中的对将被存于记录(表项)中,通过表项的关键字(即对的名字)来标识该表项。表项的存放位置及其关键字之间的对应关系可以用一个二元组表示:(关键字key,表项位置指针addr)这个二元组构成搜索某一指定表项的索引项。考虑到搜索效率,可以用顺序表的方式组织字典,也可以用二叉搜索树或多路搜索树的方式组织字典,本章讨论一种搜索效率很高的组织字典的方法,即散列结构。,静态散列方法,散列方法在表项的存储位置与它的关键字之间建立一个确定的对应函数关系Hash(),使每个关键字与结构中一个唯一
4、存储位置相对应:Address Hash(Rec.key)在搜索时,首先对表项的关键字进行函数计算,把函数值当做表项的存储位置,在结构中按此位置取表项比较。若关键字相等,则搜索成功。在存放表项时,依相同函数计算存储位置,并按此位置存放。这种方法就是散列方法。在散列方法中使用的转换函数叫做散列函数。而按此种想法构造出来的表或结构就叫做散列表。,使用散列方法进行搜索不必进行多次关键字的比较,搜索速度比较快,可以直接到达或逼近具有此关键字的表项的实际存放地址。散列函数是一个压缩映象函数。关键字集合比散列表地址集合大得多。因此有可能经过散列函数的计算,把不同的关键字映射到同一个散列地址上,这就产生了冲
5、突(Collision)。示例:有一组表项,其关键字分别是 12361,07251,03309,30976 采用的散列函数是 hash(x)=x%73+13420 其中,“%”是除法取余操作。,则有:hash(12361)=hash(07250)=hash(03309)=hash(30976)=13444。就是说,对不同的关键字,通过散列函数的计算,得到了同一散列地址。我们称这些产生冲突的散列地址相同的不同关键字为同义词。由于关键字集合比地址集合大得多,冲突很难避免。所以对于散列方法,需要讨论以下两个问题:对于给定的一个关键字集合,选择一个计算简单且地址分布比较均匀的散列函数,避免或尽量减少冲
6、突;拟订解决冲突的方案。,构造散列函数时的几点要求:散列函数的定义域必须包括需要存储的全部关 键码,如果散列表允许有 m 个地址时,其值域 必须在 0 到 m-1 之间。散列函数计算出来的地址应能均匀分布在整个 地址空间中:若 key 是从关键字集合中随机抽 取的一个关键字,散列函数应能以同等概率取 0 到 m-1 中的每一个值。散列函数应是简单的,能在较短的时间内计算 出结果。,散列函数,直接定址法 此类函数取关键字的某个线性函数值作为散列地址:Hash(key)a*key+b a,b为常数 这类散列函数是一对一的映射,一般不会产生冲突。但是,它要求散列地址空间的大小与关键字集合的大小相同。
7、示例:有一组关键字如下:942148,941269,940527,941630,941805,941558,942047,940001。散列函数为 Hash(key)=key-940000 则有,Hash(942148)=2148 Hash(941269)=1269 Hash(940527)=527 Hash(941630)=1630 Hash(941805)=1805 Hash(941558)=1558 Hash(942047)=2047 Hash(940001)=1 可以按计算出的地址存放记录。数字分析法 设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同的符号在各位上
8、出现的频率不一定相同,可能在某些位上分布均匀些;在某些位上分布不均匀,只有某几种符号经常出现。可根据散列表的大小,选取其中各种符号分布均匀的若干位作为散列地址。,计算各位数字中符号分布的均匀度 k 的公式:其中,表示第 i 个符号在第 k 位上出现的次数,n/r 表示各种符号在 n 个数中均匀出现的期望值。计算出的 k 值越小,表明在该位(第k 位)各种符号分布得越均匀。若散列表地址范围有 3 位数字,取各关键字的位做为记录的散列地址。也可以把第,和第位相加,舍去进位位,变成一位数,与第,位合起来作为散列地址。还有其它方法。,9 4 2 1 4 8位,1=510.60 9 4 1 2 6 9位
9、,2=510.60 9 4 0 5 2 7位,3=110.60 9 4 1 6 3 0位,4=110.60 9 4 1 8 0 5位,5=110.60 9 4 1 5 5 8位,6=110.60 9 4 2 0 4 7 9 4 0 0 0 1,数字分析法仅适用于事先明确知道表中所有关键字每一位数值的分布情况,它完全依赖于关键字集合。如果换一个关键字集合,选择哪几位要重新决定。,除留余数法设散列表中允许的地址数为 m,取一个不大于 m,但最接近于或等于 m 的质数 p,或选取一 个不小于 20 的质因数的合数作为除数,利用以下公式把关键字转换成散列地址。散列函数为:hash(key)=key%p
10、 p m其中,“%”是整数除法取余的运算,要求这时的质数 p 不是接近2的幂。示例:有一个关键字 key=962148,散列表大小 m=25,即 HT25。取质数 p=23。散列函数 hash(key)=key%p。则散列地址为,hash(962148)=962148%23=12。可以按计算出的地址存放记录。需要注意的是,使用上面的散列函数计算出来的地址范围是 0到 22,因此,从23到24这几个散列地址实际上在一开始是不可能用散列函数计算出来的,只可能在处理溢出时达到这些地址。乘余取整法使用此方法时,先让关键字 key 乘上一个常数 A(0 A 1),提取乘积的小数部分。然后,再用整数 n
11、乘以这个值,对结果向下取整,把它做为散列的地址。散列函数为:hash(key)=n*(A*key%1),其中,“A*key%1”表示取 A*key 小数部分:A*key%1=A*key-A*key 示例:设关键字 key=123456,n=10000,且 取 A=0.6180339,则hash(key)=10000*(0.6180339*key%1)因此有 hash(123456)=10000*(0.6180339*123456%1)=10000*(76300.0041151%1)=10000*0041151=41 此方法的优点是对 n 的选择不很关键。,平方取中法此方法在字典处理中使用十分广
12、泛。它先计算构成关键字的标识符的内码的平方,然后按照散列表的大小取中间的若干位作为散列地址。设标识符可以用一个计算机字长的内码表示。因为内码平方数的中间几位一般是由标识符所有字符决定,所以对不同的标识符计算出的散列地址大多不相同,即使其中有些字符相同。在平方取中法中,一般取散列地址为 2 的某次幂。例如,若散列地址总数取为 m=2r,则对内码的平方数取中间的 r 位。如果 r=3,所取得的散列地址参看图的最右一列。,标识符 内码 内码的平方 散列地址A 01 01 001A1 0134 20420 042A9 0144 23420 342 B 02 4 004 DMAX 04150130 21
13、526443617100 443DMAX1 0415013034 5264473522151420 352 AMAX 01150130 135423617100 236AMAX1 0115013034 3454246522151420 652,标识符的八进制内码表示及其平方值,折叠法此方法把关键字自左到右分成位数相等的几部分,每一部分的位数应与散列表地址位数相同,只有最后一部分的位数可以短一些。把这些部分的数据叠加起来,就可以得到具有该关键字的记录的散列地址。有两种叠加方法:移位法 把各部分的最后一位对齐相加;分界法 各部分不折断,沿各部分的分界来回折叠,然后对齐相加,将相加的结果当做散列地址
14、。,示例:设给定的关键字为 key=23938587841,若存储空间限定 3 位,则划分结果为每段 3 位.上述关键字可划分为 4段:239 385 878 41把超出地址位数的最高位删去,仅保留最低的3位,做为可用的散列地址。,一般当关键字的位数很多,而且关键字每一位上数字的分布大致比较均匀时,可用这种方法得到散列地址。以上介绍了几种常用的散列函数。在实际工作中应根据关键字的特点,选用适当的方法。有人曾用“轮盘赌”的统计分析方法对它们进行了模拟分析,结论是平方取中法最接近于“随机化”。在应用平方取中法时,若关键字不是整数而是字符串时,可以把每个字符串转换成整数。,处理冲突-溢出的方法,解决
15、冲突的方法又称为溢出处理技术。因为任一种散列函数也不能避免产生冲突,因此选择好的解决冲突溢出的方法十分重要。,为了减少冲突,对散列表加以改造。若设散列表 HT 有 m 个地址,将其改为 m 个桶。其桶号与散列地址一一对应,第 i(0 i m)个桶的桶号即为第 i 个散列地址。每个桶可存放 s 个表项,这些表项的关键字互为同义词。如果对两个不同表项的关键字用散列函数计算得到同一个散列地址,就产生了冲突,它们可以放在同一个桶内的不同位置。只有当桶内所有 s 个表项位置都放满表项后再加入表项才会产生溢出。通常桶的大小 s 取的比较小,因此在桶内大多采用顺序搜索。,闭散列是处理溢出的一种常用的方法,也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 chp
链接地址:https://www.31ppt.com/p-5065361.html