c++与数据结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《c++与数据结构课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 数据结构 课件
- 资源描述:
-
1、本章课件制作:吴虎统第三部分第三部分 数据结构基础数据结构基础本章内容本章内容 查找查找 排序排序14.1 查找查找1. 查找的基本概念查找的基本概念 查找:查找:在数据元素集合在数据元素集合(查找表查找表)中查找关键字与中查找关键字与给定值相等的数据元素。给定值相等的数据元素。 关键字关键字:数据元素中的一个或多个数据项值,它数据元素中的一个或多个数据项值,它可以惟一标识一个数据元素。可以惟一标识一个数据元素。 平均查找长度平均查找长度(ASL):iniiCPASL1式中,式中,n为查找表的长度;为查找表的长度;pi为查找第为查找第i个元素的概个元素的概率,在等概率情况下率,在等概率情况下p
2、i等于等于1/n; Ci为找到第为找到第i个元个元素时的比较次数素时的比较次数2. 顺序查找顺序查找 基本思想:基本思想:用给定值依次与线性表中每个元素的用给定值依次与线性表中每个元素的关键字进行比较。如果某个元素的关键字与给定值关键字进行比较。如果某个元素的关键字与给定值相同,则查找成功;如果找遍全表也没有发现满足相同,则查找成功;如果找遍全表也没有发现满足条件的元素,则查找失败。条件的元素,则查找失败。 要求:要求: 查找表必须采用线性表。查找表必须采用线性表。 实现一:顺序表类中实现顺序查找的成员函数实现一:顺序表类中实现顺序查找的成员函数/找到值为找到值为item的元素并返回其下标,若
3、元素不存在,的元素并返回其下标,若元素不存在,/则返回则返回-1int Seqlist:Find(int item) int i=0; if(ListEmpty() return -1; while(isize & item != listi) i+; if(inext; while(p != NULL) if(p-data = item) break; p=p-next; return p; 顺序查找的平均查找长度顺序查找的平均查找长度)(21111nOninCPASLniinii 评价:评价:在用顺序查找方法完成查找时,每进行一在用顺序查找方法完成查找时,每进行一次成功查找需要的平均比较次
4、数约为表长度的一半,次成功查找需要的平均比较次数约为表长度的一半,因此,它的效率较低。适用于在查找表较小的情况因此,它的效率较低。适用于在查找表较小的情况下进行查找。下进行查找。3. 二分查找二分查找要求:要求: u查找表必须采用线性表;查找表必须采用线性表;u必须以顺序方式存储线性表;必须以顺序方式存储线性表;u线性表中所有数据元素必须按照关键字有序排列线性表中所有数据元素必须按照关键字有序排列 基本思想:基本思想:将给定值与处于顺序表将给定值与处于顺序表“中间位置中间位置”上的元素的关键字进行比较,若相等则查找成功,上的元素的关键字进行比较,若相等则查找成功,若给定值大于关键字则在表的后半
5、部分继续进行二若给定值大于关键字则在表的后半部分继续进行二分查找,否则在表的前半部分继续进行二分查找。分查找,否则在表的前半部分继续进行二分查找。如此进行下去直至找到满足条件的元素,或当前查如此进行下去直至找到满足条件的元素,或当前查找区为空,此时查找失败。找区为空,此时查找失败。演示:演示: 例子:例子:二分查找函数模板及其测试程序二分查找函数模板及其测试程序#include template int BinSearch(T A,int low,int high,T key)int mid;while(low=high)mid=(low+high)/2;if(key=Amid) return
6、 mid;/查找查找if(keyAmid)high=mid-1;/到表的前到表的前else low=mid+1;/到表的后半部到表的后半部return -1;/查找失败,返查找失败,返void main()int a=1,2,3,4,5,6,7,8,k=7,i;i=BinSearch(a,0,7,k);if(i=-1)cout”没找到!没找到!n”;else coutiendl;优点:优点: u查找效率高查找效率高u平均查找长度平均查找长度)(log1) 1(log12122111nOnnnjnCPASLjkjinii缺点:缺点: u查找前要将表中元素按关键字有序排列查找前要将表中元素按关键字
7、有序排列u只适用于线性表的顺序存储。适用于那种一经建只适用于线性表的顺序存储。适用于那种一经建立就很少改动而又经常需要查找的线性表。立就很少改动而又经常需要查找的线性表。4. 分块查找分块查找要求:要求: u查找表必须采用线性表;查找表必须采用线性表;u待查找的线性表分成若干块。在每一块内,元素待查找的线性表分成若干块。在每一块内,元素的存放是任意的,但在块与块之间元素的存放是有的存放是任意的,但在块与块之间元素的存放是有序的,即前一块中任意一个元素的关键字值都必须序的,即前一块中任意一个元素的关键字值都必须小于(或大于)后一块中所有元素的关键字值;小于(或大于)后一块中所有元素的关键字值;u
8、建立一个索引表,索引表中的每个索引项对应于建立一个索引表,索引表中的每个索引项对应于一块。一个索引项至少应含有两部分信息:一是对一块。一个索引项至少应含有两部分信息:一是对应块中最大的关键字值;二是指向对应块中第一个应块中最大的关键字值;二是指向对应块中第一个元素的指针元素的指针 基本思想:基本思想:首先在索引表中查找,确定出要查找首先在索引表中查找,确定出要查找的元素应该在哪一块中;然后在已确定的那一块内的元素应该在哪一块中;然后在已确定的那一块内进行顺序查找。进行顺序查找。 演示:演示: 优点:优点:块内元素是任意存放的,插入或删除运算块内元素是任意存放的,插入或删除运算不会造成元素的大量
9、移动。不会造成元素的大量移动。 缺点:缺点:u增加了存放索引表的辅助空间及初始时对线性表增加了存放索引表的辅助空间及初始时对线性表分块排序的运算分块排序的运算u大量的插入和删除运算可能会导致各块中元素的大量的插入和删除运算可能会导致各块中元素的数目很不均匀,这会降低查找速度数目很不均匀,这会降低查找速度 平均查找长度:平均查找长度:将长度为将长度为n的线性表均匀地划分的线性表均匀地划分成块,每块中有个结点,即。假定成块,每块中有个结点,即。假定对表中每个元素的查找概率相等,则查找某一块的对表中每个元素的查找概率相等,则查找某一块的概率为,查找块中某个结点的概率为概率为,查找块中某个结点的概率为
10、12212111211ssnsbisjbASLsibj 索引表使用顺序查找:索引表使用顺序查找: 索引表使用二分查找:索引表使用二分查找:2) 1(log2ssnASL5. 二叉排序树查找二叉排序树查找 二叉排序树的定义:二叉排序树的定义:二叉排序树或者是一棵空二叉树,或者是具有以下二叉排序树或者是一棵空二叉树,或者是具有以下性质的二叉树:性质的二叉树:1、若它的、若它的左子树左子树非空,则左子树上所有结点的值非空,则左子树上所有结点的值均均小于小于根结点的值;根结点的值;2、若它的、若它的右子树右子树非空,则右子树上所有结点的值非空,则右子树上所有结点的值均均不小于不小于根结点的值;根结点的
11、值;3、左、右子树本身又各是一棵二叉排序树。、左、右子树本身又各是一棵二叉排序树。 插入操作:插入操作:若二叉排序树为空,则新结点为二叉排序树的根若二叉排序树为空,则新结点为二叉排序树的根结点;否则将新结点的关键字值和根结点的关键结点;否则将新结点的关键字值和根结点的关键字值进行比较,若小于根结点的值,则将新结点字值进行比较,若小于根结点的值,则将新结点插入到左子树中去,否则,插入到右子树中去。插入到左子树中去,否则,插入到右子树中去。此插入过程是递归进行的。此插入过程是递归进行的。 设有整数序列设有整数序列47,23,56,15,26,89,将其中的值依次将其中的值依次插入二叉排序树插入二叉
12、排序树568947231526 删除操作:删除操作:一个结点被删除后,必须保证余下的结点仍然构成一一个结点被删除后,必须保证余下的结点仍然构成一棵二叉排序树。下面分两种情况讨论:棵二叉排序树。下面分两种情况讨论:u 情况一:被删除的结点至少有一棵空子树情况一:被删除的结点至少有一棵空子树方法:使被删结点的那棵非空子树的根成为其双方法:使被删结点的那棵非空子树的根成为其双亲结点的相应子女亲结点的相应子女50302510153533375362605553625550301015353337u 情况二:被删除的结点有两棵非空的子树情况二:被删除的结点有两棵非空的子树方法一:找到被删除结点在中序遍历
13、序列中的直方法一:找到被删除结点在中序遍历序列中的直接后继结点(它一定在被删除结点的右子树中)接后继结点(它一定在被删除结点的右子树中),用此后继结点的值取代被删除结点的值,然后,用此后继结点的值取代被删除结点的值,然后删除此后继结点,由于被删除的后继结点的左子删除此后继结点,由于被删除的后继结点的左子树一定是空子树,所以删除后继结点的过程同情树一定是空子树,所以删除后继结点的过程同情况一。况一。方法二:用被删除结点在中序遍历序列中的直接方法二:用被删除结点在中序遍历序列中的直接前驱结点(该结点的右子树也一定为空)代替被前驱结点(该结点的右子树也一定为空)代替被删除的结点,然后删除这个前驱结点
14、。删除的结点,然后删除这个前驱结点。 50301015353337536255533010153533376255373010153533536255后继结点后继结点前驱结点前驱结点 将结点将结点50删除删除 中序遍历:中序遍历:5030101535333753625510153033353750535562 查找操作:查找操作:对二叉排序树进行中序遍历可以得到一个数据元素由小对二叉排序树进行中序遍历可以得到一个数据元素由小到大的有序序列。构造二叉排序树的过程即为对无序序到大的有序序列。构造二叉排序树的过程即为对无序序列进行排序的过程。列进行排序的过程。u 查找查找思路:思路:当二叉排序树不为
15、空时,将给定值与根结点的值进行当二叉排序树不为空时,将给定值与根结点的值进行比较,若相等则查找成功。如果给定值小于根结点的比较,若相等则查找成功。如果给定值小于根结点的值,则在根结点的左子树中继续查找,否则在根结点值,则在根结点的左子树中继续查找,否则在根结点的右子树中继续查找。当待查找的二叉排序树为空时的右子树中继续查找。当待查找的二叉排序树为空时,查找失败。,查找失败。u 平均查找长度:平均查找长度:)(log2nOASL 在二叉排序树中查找成功时走过的是一条从根结点到所寻找结点的一条路径,因此,二叉排序树查找的平均查找长度取决于二叉排序树的深度。 二叉排序树的蜕变:二叉排序树的蜕变:二叉
16、排序树是动态生成的,它的形态与各结点插入二叉二叉排序树是动态生成的,它的形态与各结点插入二叉排序树时的先后顺序有关。当把一组有序值依次插入到排序树时的先后顺序有关。当把一组有序值依次插入到一棵二叉排序树时,生成的二叉排序树将蜕变成一棵单一棵二叉排序树时,生成的二叉排序树将蜕变成一棵单支树。例如,由整数序列支树。例如,由整数序列15,23,26,47,56,89 生成的二生成的二叉排序树就是一棵单支树。在单支树中查找时,平均查叉排序树就是一棵单支树。在单支树中查找时,平均查找长度与顺序查找相同。找长度与顺序查找相同。6. 哈希查找哈希查找 哈希存储哈希存储(哈希表哈希表):以数据元素的关键字以数
17、据元素的关键字k为自变量,通过一定的函数关系为自变量,通过一定的函数关系h(称为哈希函数或散列函数称为哈希函数或散列函数)计算出对应的函数值计算出对应的函数值h(k),把这个值解释为数据元素的存储地址并把数据元素存储把这个值解释为数据元素的存储地址并把数据元素存储到相应的存储单元内。到相应的存储单元内。h(k)称为哈希地址。称为哈希地址。 冲突:冲突:若有两个不同的关键字若有两个不同的关键字ki和和kj,即,即ki kj(i j)。但。但h(ki)=h(kj),这种情况称为冲突。如上例的关键字,这种情况称为冲突。如上例的关键字85和和49,其对应的哈希地址都为,其对应的哈希地址都为1,即产生冲
18、突。,即产生冲突。例:设有一组关键字值例:设有一组关键字值85,72,49,58,15,70,90,38,哈,哈希函数希函数h(k) = k mod 12。则对应的哈希地址为。则对应的哈希地址为1,0,1,10,3,10,6,2 采用哈希技术要解决的两个主要问题:采用哈希技术要解决的两个主要问题:u 构造一个好的哈希函数,使出现冲突的机会尽可能构造一个好的哈希函数,使出现冲突的机会尽可能少些;少些;u 设计一个有效的解决冲突的办法设计一个有效的解决冲突的办法 哈希函数的构造方法哈希函数的构造方法u 构造哈希函数要考虑以下几点构造哈希函数要考虑以下几点1) 哈希函数的哈希函数的定义域定义域必须包
19、括要存储的数据元素必须包括要存储的数据元素的全部关键字的全部关键字; 而如果散列表允许有而如果散列表允许有 m 个地址,个地址,则哈希函数的则哈希函数的值域值域必须在必须在 0 到到 m-1 之间之间2)由哈希函数计算出的地址应由哈希函数计算出的地址应均匀分布均匀分布在散列地在散列地址空间内址空间内3)哈希函数应该是简单的,能在哈希函数应该是简单的,能在较短时间较短时间内计算内计算出结果出结果p 直接定位法直接定位法取关键字的某个线性函数作为哈希函数,即取关键字的某个线性函数作为哈希函数,即h(k)=ak+b。其中,。其中,k为关键字,为关键字,a、b为常数。为常数。u 常用哈希函数常用哈希函
20、数p 数学分析法数学分析法当关键字的位数比存储区域地址码的位数多时,可以当关键字的位数比存储区域地址码的位数多时,可以取关键字中位值分布比较均匀的若干位作为哈希函数取关键字中位值分布比较均匀的若干位作为哈希函数的值。这种方法适合于所有关键字为已知的情况。的值。这种方法适合于所有关键字为已知的情况。p 除留余数法除留余数法选择一个适当的正整数选择一个适当的正整数p (p通常选为不大于哈希表长通常选为不大于哈希表长度度 m 的最大素数),用的最大素数),用p去除关键字,取其余数作为去除关键字,取其余数作为哈希地址,即哈希地址,即h(k)=k%p (pm)。 解决冲突的方法:开放地址法和链地址法解决
21、冲突的方法:开放地址法和链地址法u 开放地址法开放地址法当冲突发生时形成一个地址序列,按序列顺序逐个当冲突发生时形成一个地址序列,按序列顺序逐个检查各地址单元,直至找到一个未被占用的单元为检查各地址单元,直至找到一个未被占用的单元为止,将发生冲突的数据元素存入该地址单元中。止,将发生冲突的数据元素存入该地址单元中。 线性探查序列线性探查序列 平方探查序列平方探查序列设哈希表的长度是设哈希表的长度是m,发生冲突的地址是,发生冲突的地址是dd+1, d+2, , m-1, 0, 1, , d-1(d+12)%m, (d-12)%m, (d+22)%m, (d-22)%m, p 例例1线性探查法建立
22、哈希表线性探查法建立哈希表设哈希表的长度设哈希表的长度11,哈希函数是,哈希函数是h(k) = k % 11,将,将整数序列整数序列54,77,94,89,14,45,76存入哈希表。按平存入哈希表。按平方探查法处理冲突方探查法处理冲突p 例例20123456789105477948954 % 11 = 1077 % 11 = 094 % 11 = 689 % 11 = 114 % 11 = 345 % 11 = 1 (冲突冲突)76 % 11 = 10 (冲突冲突)144576u 链地址法链地址法将哈希地址相同的数据元素存储到同一个单链表中,将哈希地址相同的数据元素存储到同一个单链表中,哈希
展开阅读全文