《集合与查找》PPT课件.ppt
《《集合与查找》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《集合与查找》PPT课件.ppt(176页珍藏版)》请在三一办公上搜索。
1、集合静态查找哈希表 二叉查找树B树和B树,第5章 集合与查找,1,集合基本概念,集合及其表示,集合是成员(对象或元素)的一个群集。集合中的成员可以是原子(单元素),也可以是集合。集合的成员必须互不相同。在算法与数据结构中所遇到的集合,其单元素通常是整数、字符、字符串或指针,且同一集合中所有成员具有相同的数据类型。,2,colour=red,orange,yellow,green,black,blue,purple,white name=“An”,“Cao”,“Liu”,“Ma”,“Peng”,“Wang”,“zhang”集合中的成员一般是无序的,但在表示它时,常写在一个序列里。常设定集合中的单
2、元素具有线性有序关系,此关系可记作“”,表示“优先于”。整数、字符和字符串都有一个自然线性顺序。指针也可依据其在序列中安排的位置给予一个线性顺序。,3,集合运算,4,用位向量实现集合抽象数据类型,当集合是全集合 0,1,2,n 的一个子集,且 n是不大的整数时,可用位(0,1)向量来实现集合。当全集合是由有限的可枚举的成员组成的集合时,可建立全集合成员与整数 0,1,2,的一一对应关系,用位向量来表示该集合的子集。,5,集合的位向量(bit Vector)类的定义#include const int DefaultSize=100;class Set private:int*bitVector
3、;/集合的位向量数组 int MaxSize;/最大元素个数public:Set(int MaxSetSize=DefaultSize);Set()delete bitVector;,6,void MakeEmpty()/置空 for(int i=0;i MaxSize;i+)bitVectori=0;int AddMember(const int x);/加 int DelMember(const int x);/删 Set,7,用位向量实现集合时部分操作的实现Set:Set(int MaxSetSize):MaxSize(MaxSetSize)assert(MaxSize 0);/判参数合
4、理否 bitVector=new int MaxSize;/分配空间 assert(bitVector!=NULL);for(int i=0;i MaxSize;i+)/置空集合 bitVectori=0;,0 0 0 0 0 0 0 0 0 0,0 9,8,int Set:Addmember(const int x)if(x=0,0 0 0 0 0 0 0 0 0 0,0 9,1,9,0 1 0 0 0 0 0 0 0 0,0 9,int Set:DelMember(const int x)if(x=0,0,10,void Set:operator=(Set,this,0 1 1 1 0 0
5、 0 0 0 0 0,right,0 1 1 1 0 0 0 0 1 1 0,11,Set,this,right,this,0 1 1 1 0 0 0 0 1 1 0,0 0 1 0 0 1 0 1 0 1 0,0 1 1 1 0 1 0 1 1 1 0,12,Set,this,right,this,0 1 1 1 0 0 0 0 1 1 0,0 0 1 0 0 1 0 1 0 1 0,0 0 1 0 0 0 0 0 0 1 0,13,Set,this,right,this,0 1 1 1 0 0 0 0 1 1 0,0 0 1 0 0 1 0 1 0 1 0,0 1 0 1 0 0 0 0
6、1 0 0,14,int Set:Contains(const int x)/判存在 assert(x=0,0 1 0 0 1 0 0 1 0 0,0 9,3,15,int Set:operator=(Set,this,right,0 0 1 1 0 0 0 0 1 1 0,0 0 1 0 0 1 0 1 0 1 0,i,16,int Set:SubSet(Set,this,right,0 0 1 1 0 0 0 0 1 1 0,0 0 1 0 0 1 0 1 0 1 0,0 0 0 1,i,17,若表中存在特定元素,称查找成功,应输出该元素。-否则,称查找不成功(也应输出失败标志或失败位置)
7、,查找表查 找查找成功查找不成功静态查找动态查找关键字主关键字次关键字,由同一类型的数据元素(或记录)构成的集合。,查询(Searching)特定元素是否在表中。,只查找,不改变集合内的数据元素。既查找,又改变(增减)集合内的数据元素。元素中某个数据项的值,可用来识别一个元素 可以唯一标识一个元素的关键字,例如“学号”,例如“性别”,识别若干元素的关键字,基本概念,18,对查找表常用的操作有哪些?查询某个“特定的”数据元素是否在表中;在查找表中插入一元素;从查找表中删除一元素。,查找的过程是怎样的?给定一个值K,在含有n个元素的查找表中寻找一个关键字值等于K的元素,可给出该元素在查找表中的位置
8、,还可给出该元素中的具体信息;如找到则输出该元素,否则输出查找不成功的信息。,19,如何评估查找算法的优劣?,查找的过程就是将给定的K值与查找表中各元素的关键字进行比较的过程。所以用比较次数的平均值来评估算法的优劣,称为平均查找长度(ASL:average search length)。,显然,ASL值越小,时间效率越高。,设查找第 i 个元素的概率为 pi,查找到第 i 个元素所需比较次数为 ci,则查找成功的平均查找长度:,20,顺序搜索(Sequential Search),所谓顺序搜索,又称线性搜索,主要用于在线性结构中进行搜索。顺序搜索从表的先端开始,顺序用各对象的关键码与给定值x进
9、行比较,直到找到与其值相等的对象,则搜索成功;给出该对象在表中的位置。若整个表都已检测完仍未找到关键码与x相等的对象,则搜索失败。给出失败信息。,21,template int searchList:Search(const Type,22,顺序搜索的平均搜索长度,设搜索第 i 个元素的概率为 pi,搜索到第 i 个元素所需比较次数为 ci,则搜索成功的平均搜索长度:,在顺序搜索并设置“监视哨”情形:ci=i+1,i=0,1,n-1,因此,23,在等概率情形,pi=1/n,i=1,2,n。,在搜索不成功情形,ASLunsucc=n+1.,顺序查找的优缺点:优点:对表中元素没有要求 缺点:平均查
10、找长度较大,24,基于有序顺序表的折半搜索,设n个对象存放在一个有序顺序表中,并按其关键码从小到大排好了序。折半搜索时,先求位于搜索区间正中的对象的下标mid,用其关键码与给定值x比较:Elementmid.key=x,搜索成功;Elementmid.key x,把搜索区间缩小 到表的前半部分,继续折半搜索;Elementmid.key x,把搜索区间缩小 到表的后半部分,继续折半搜索。如果搜索区间已缩小到一个对象,仍未找到想要搜索的对象,则搜索失败。,25,-1 0 1 3 4 6 8 10 12,6,0 1 2 3 4 5 6 7 8,搜索,low,mid,high,6,26,-1 0 1
11、 3 4 6 8 10 12,5,0 1 2 3 4 5 6 7 8,搜索,low,mid,high,5,27,BinarySearch(const Type,28,template int orderedList:BinarySearch(const Type/搜索失败,29,算法分析:orderT:0 1 2 3 4 5 6 7 8 9 10 11 12 13,2 4 6 8 10 13 15 18 20 22 24 25 27 30,15,6,2,4,10,8,13,24,20,27,18,22,25,30,折半查找的判定树:比较次数不超过完全二叉树高度。,30,最多的比较次数不超过二叉
12、树的高度:所以最坏情况下的查找长度是:折半查找成功的平均查找长度:设查找任一元素的概率都相等,即:pi=1/n 在第k层上最多有2k-1 个结点,在第k层上的结点需比较k次。所以:,31,可以用归纳法证明,这样,32,有序顺序表的折半搜索的判定树(10,20,30,40,50,60),10,50,=,=,=,=,=,=,30,20,40,60,ASLunsucc=(2*1+3*6)/7=20/7,ASLsucc=(1+2*2+3*3)/6=14/6,33,索引顺序表的查找(分块查找)1.概念:是顺序查找的一种改进。索引项:(key,addr),key 是关键字,addr是地址。索引表:由索引项
13、构成的顺序表。,如何查找关键字为60的元素?,34,分块查找的算法思想:D=d1,d2,.,dn1)将数据集分为s个块 B1,B2,Bs;2)块间有序:当ij时,Bi中的任一元素小于Bj中的任 一元素;3)为每个Bi块设一索引项(keyi,addri);4)s个索引项构成索引表;5)块内可有序可无序;,35,查找过程:(1)首先在索引表中查找,确定在哪个块中。可以是折半查找,也可以是顺序查找。(2)在块中查找。在块中查找只能是顺序查找。,36,4.算法分析:设在索引表中和块内都是顺序查找。(s是索引项的数目)索引表中查找:ALSindex=(s+1)/2块中查找:ALSlock=(n/s+1)
14、/2所以:ALSbs=(s+1)/2+(n/s+1)/2显然它与s 的取值有关。当 时,ASL有最小值,例如 当n=28,s=24时,ASLbs=17,而折半法为8,顺序表为(28+1)/2=128.5,37,倒排表(Inverted Index List),对包含有大量数据对象的数据表或文件进行搜索时,最常用的是针对对象的主关键码建立索引。主关键码可以唯一地标识该对象。用主关键码建立的索引叫做主索引。主索引的每个索引项给出对象的关键码和对象在表或文件中的存放地址。但在实际应用中有时需要针对其它属性进行搜索。例如,查询如下的职工信息:(1)列出所有教师的名单;,对象关键码 key 对象存放地址
15、 addr,38,(2)已婚的女性职工有哪些人?这些信息在数据表或文件中都存在,但都不是关键码,为回答以上问题,只能到表或文件中去顺序搜索,搜索效率极低。因此,除主关键码外,可以把一些经常搜索的属性设定为次关键码,并针对每一个作为次关键码的属性,建立次索引。在次索引中,列出该属性的所有取值,并对每一个取值建立有序链表,把所有具有相同属性值的对象按存放地址递增的顺序或按主关键码递增的顺序链接在一起。,39,次索引的索引项由次关键码、链表长度和链表本身等三部分组成。例如,为了回答上述的查询,我们可以分别建立“性别”、“婚否”和“职务”次索引。,40,婚否次索引,次关键码 已婚 未婚 计 数 5 3
16、 地址指针,指针 03 08 24 47 83 17 51 95,职务次索引,次关键码 教师 教务员 实验员 计 数 5 1 2 地址指针,指针 08 24 47 51 83 03 17 95,41,(1)列出所有教师的名单;(2)已婚的女性职工有哪些人?通过顺序访问“职务”次索引中的“教师”链,可以回答上面的查询(1)。通过对“性别”和“婚否”次索引中的“女性”链和“已婚”链进行求“交集”运算,就能够找到所有既是女性又已婚的职工对象,从而回答上面的查询(2)。,42,倒排表是次索引的一种实现。在表中所有次关键码的链都保存在次索引中,仅通过搜索次索引就能找到所有具有相同属性值的对象。在次索引中
17、记录对象存放位置的指针可以用主关键码表示:可通过搜索次索引确定该对象的主关键码,再通过搜索主索引确定对象的存放地址。,43,在倒排表中各个属性链表的长度大小不一,管理比较困难。为此引入单元式倒排表。在单元式倒排表中,索引项中不存放对象的存储地址,存放该对象所在硬件区域的标识。硬件区域可以是磁盘柱面、磁道或一个页块,以一次 I/O 操作能存取的存储空间作为硬件区域为最好。,44,为使索引空间最小,在索引中标识这个硬件区域时可以使用一个能转换成地址的二进制数,整个次索引形成一个(二进制数的)位矩阵。例如,45,散列(Hashing),在现实中经常遇到按给定的值进行查询的事例。为此,必须考虑在记录的
18、存放位置和用以标识它的数据项(称为关键码)之间的对应关系,选择适当的数据结构,很方便地根据记录的关键码检索到对应记录的信息。词典:查找、插入、删除表项的存放位置及其关键码之间的对应关系可以用一个二元组表示:(关键码key,表项位置指针addr)这个二元组构成搜索某一指定表项的索引项。,46,静态散列方法,散列方法在表项存储位置与其关键码之间建立一个确定的对应函数关系Hash(),使每个关键码与结构中一个唯一存储位置相对应:Address Hash(Rec.key)在搜索时,先对表项的关键码进行函数计算,把函数值当做表项的存储位置,在结构中按此位置取表项比较。若关键码相等,则搜索成功。在存放表项
19、时,依相同函数计算存储位置,并按此位置存放。此方法称为散列方法。,47,直接定址法 此类函数取关键码的某个线性函数值作为散列地址:Hash(key)a*key+b a,b为常数 这类散列函数是一对一的映射,一般不会产生冲突。但是,它要求散列地址空间的大小与关键码集合的大小相同。,48,示例:有一组关键码如下:942148,941269,940527,941630,941805,941558,942047,940001。散列函数为 Hash(key)=key-940000 Hash(942148)=2148 Hash(941269)=1269 Hash(940527)=527 Hash(9416
20、30)=1630 Hash(941805)=1805 Hash(941558)=1558 Hash(942047)=2047 Hash(940001)=1 可以按计算出的地址存放记录。,49,数字分析法 设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同符号在各位上出现的频率不一定相同。可根据散列表的大小,选取其中各种符号分布均匀的若干位作为散列地址。计算各位数字中符号分布均匀度 k 的公式:其中,表示第 i 个符号在第 k 位上出现的次数,n/r 表示各种符号在 n 个数中均匀出现的期望值。计算出的 k 值越小,表明在该位(第 k 位)各种符号分布得越均匀。,50,9 4
21、 2 1 4 8位,1=57.60 9 4 1 2 6 9位,2=57.60 9 4 0 5 2 7位,3=17.60 9 4 1 6 3 0位,4=5.60 9 4 1 8 0 5位,5=5.60 9 4 1 5 5 8位,6=5.60 9 4 2 0 4 7 9 4 0 0 0 1,若散列表地址范围有 3 位数字,取各关键码的 位做为记录的散列地址。,51,除留余数法设散列表中允许地址数为 m,取一个不大于 m,但最接近于或等于 m 的质数 p 作为除数,或不含有小于20的质因数的合数作为除数,利用以下函数把关键码转换成散列地址:hash(key)=key%p p m,52,示例:有一个关
22、键码 key=962148,散列表大小 m=25,即 HT25。取质数 p=23。散列函数 hash(key)=key%p。则散列地址为 hash(962148)=962148%23=12。可以按计算出的地址存放记录。需要注意的是,使用上面的散列函数计算出来的地址范围是 0到 22,因此,从23到24这几个散列地址实际上在一开始是不可能用散列函数计算出来的,只可能在处理冲突时达到这些地址。,53,平方取中法它先计算构成关键码的标识符的内码的平方,然后按照散列表的大小取中间的若干位作为散列地址。在平方取中法中,一般取散列地址为2的某次幂。例如,若散列地址总数取为 m=2r,则对内码的平方数取中间
23、的 r 位。r=3,所取得的散列地址参看图的最右一列。,54,标识符 内码 内码的平方 散列地址A 01 01 001A1 0134 20420 042A9 0144 23420 342 B 02 4 004 DMAX 04150130 21526443617100 443DMAX1 0415013034 5264473522151420 352 AMAX 01150130 135423617100 236AMAX1 01150130343454246522151420 652,标识符的八进制内码表示及其平方值,55,基数转换法将关键字看作另一个基数制上的表示,然后把它转换成原来基数制的数,再
24、用数字分析法取其中的几位作为地址。如:key236075(236075)13 213531346133 7135(841547)10 再选2、3、4、5位,h(236075)=4154,56,折叠法把关键码自左到右分成位数相等的几部分,每一部分的位数应与散列表地址位数相同,只有最后一部分的位数可以短一些。把这些部分的数据叠加起来,就可以得到具有该关键码的记录的散列地址。有两种叠加方法:移位法 把各部分的最后一位对齐相加;分界法 各部分不折断,沿各部分的分界来回折叠,然后对齐相加。,57,示例:设给定的关键码为 key=23938587841,若存储空间限定 3 位,则划分结果为每段 3 位。上
25、述关键码可划分为 4段:239 385 878 41把超出地址位数的最高位删去,仅保留最低的3位,做为可用的散列地址。,移位法,385,878,41,1543,41,239,239,385,878,1714,分界法,58,一般当关键码的位数很多,而且关键码每一位上数字的分布大致比较均匀时,可用这种方法得到散列地址。小结:以上介绍了几种常用的散列函数。在实际工作中应根据关键码的特点,选用适当的方法。有人曾用“轮盘赌”的统计分析方法对它们进行了模拟分析,结论是平方取中法最接近于“随机化”。,59,处理冲突的闭散列方法,为了减少冲突,改造散列表:若设散列表 HT 有 m 个地址,将其改为 m 个桶。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合与查找 集合 查找 PPT 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5618454.html