c++与数据结构幻灯片

上传人:F****n 文档编号:88134423 上传时间:2019-04-19 格式:PPT 页数:61 大小:596KB
返回 下载 相关 举报
c++与数据结构幻灯片_第1页
第1页 / 共61页
c++与数据结构幻灯片_第2页
第2页 / 共61页
c++与数据结构幻灯片_第3页
第3页 / 共61页
c++与数据结构幻灯片_第4页
第4页 / 共61页
c++与数据结构幻灯片_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《c++与数据结构幻灯片》由会员分享,可在线阅读,更多相关《c++与数据结构幻灯片(61页珍藏版)》请在金锄头文库上搜索。

1、,第十四章 查找和排序,本章课件制作:吴虎统,第三部分 数据结构基础,本章内容, 查找 排序,14.1 查找,1. 查找的基本概念, 查找:在数据元素集合(查找表)中查找关键字与给定值相等的数据元素。 关键字:数据元素中的一个或多个数据项值,它可以惟一标识一个数据元素。 平均查找长度(ASL):,式中,n为查找表的长度;pi为查找第i个元素的概率,在等概率情况下pi等于1/n; Ci为找到第i个元素时的比较次数,2. 顺序查找, 基本思想:用给定值依次与线性表中每个元素的关键字进行比较。如果某个元素的关键字与给定值相同,则查找成功;如果找遍全表也没有发现满足条件的元素,则查找失败。, 要求:

2、查找表必须采用线性表。, 实现一:顺序表类中实现顺序查找的成员函数, 实现二:单链表类中实现顺序查找的成员函数, 顺序查找的平均查找长度, 评价:在用顺序查找方法完成查找时,每进行一次成功查找需要的平均比较次数约为表长度的一半,因此,它的效率较低。适用于在查找表较小的情况下进行查找。,3. 二分查找,要求: 查找表必须采用线性表; 必须以顺序方式存储线性表; 线性表中所有数据元素必须按照关键字有序排列, 基本思想:将给定值与处于顺序表“中间位置”上的元素的关键字进行比较,若相等则查找成功,若给定值大于关键字则在表的后半部分继续进行二分查找,否则在表的前半部分继续进行二分查找。如此进行下去直至找

3、到满足条件的元素,或当前查找区为空,此时查找失败。,演示:,例子:二分查找函数模板及其测试程序,优点: 查找效率高 平均查找长度,缺点: 查找前要将表中元素按关键字有序排列 只适用于线性表的顺序存储。适用于那种一经建立就很少改动而又经常需要查找的线性表。,4. 分块查找,要求: 查找表必须采用线性表; 待查找的线性表分成若干块。在每一块内,元素的存放是任意的,但在块与块之间元素的存放是有序的,即前一块中任意一个元素的关键字值都必须小于(或大于)后一块中所有元素的关键字值; 建立一个索引表,索引表中的每个索引项对应于一块。一个索引项至少应含有两部分信息:一是对应块中最大的关键字值;二是指向对应块

4、中第一个元素的指针, 基本思想:首先在索引表中查找,确定出要查找的元素应该在哪一块中;然后在已确定的那一块内进行顺序查找。, 演示:, 优点:块内元素是任意存放的,插入或删除运算不会造成元素的大量移动。, 缺点: 增加了存放索引表的辅助空间及初始时对线性表分块排序的运算 大量的插入和删除运算可能会导致各块中元素的数目很不均匀,这会降低查找速度, 平均查找长度:将长度为n的线性表均匀地划分成块,每块中有个结点,即。假定对表中每个元素的查找概率相等,则查找某一块的概率为,查找块中某个结点的概率为, 索引表使用顺序查找:, 索引表使用二分查找:,5. 二叉排序树查找, 二叉排序树的定义: 二叉排序树

5、或者是一棵空二叉树,或者是具有以下性质的二叉树: 1、若它的左子树非空,则左子树上所有结点的值均小于根结点的值; 2、若它的右子树非空,则右子树上所有结点的值均不小于根结点的值; 3、左、右子树本身又各是一棵二叉排序树。, 插入操作:,若二叉排序树为空,则新结点为二叉排序树的根结点;否则将新结点的关键字值和根结点的关键字值进行比较,若小于根结点的值,则将新结点插入到左子树中去,否则,插入到右子树中去。此插入过程是递归进行的。, 设有整数序列47,23,56,15,26,89,将其中的值依次插入二叉排序树,56,89,47,23,15,26, 删除操作:,一个结点被删除后,必须保证余下的结点仍然

6、构成一棵二叉排序树。下面分两种情况讨论:,情况一:被删除的结点至少有一棵空子树,方法:使被删结点的那棵非空子树的根成为其双亲结点的相应子女,情况二:被删除的结点有两棵非空的子树,方法一:找到被删除结点在中序遍历序列中的直接后继结点(它一定在被删除结点的右子树中),用此后继结点的值取代被删除结点的值,然后删除此后继结点,由于被删除的后继结点的左子树一定是空子树,所以删除后继结点的过程同情况一。,方法二:用被删除结点在中序遍历序列中的直接前驱结点(该结点的右子树也一定为空)代替被删除的结点,然后删除这个前驱结点。,后继结点,前驱结点, 将结点50删除, 中序遍历:,10,15,30,33,35,3

7、7,50,53,55,62, 查找操作:,对二叉排序树进行中序遍历可以得到一个数据元素由小到大的有序序列。构造二叉排序树的过程即为对无序序列进行排序的过程。,查找思路:,当二叉排序树不为空时,将给定值与根结点的值进行比较,若相等则查找成功。如果给定值小于根结点的值,则在根结点的左子树中继续查找,否则在根结点的右子树中继续查找。当待查找的二叉排序树为空时,查找失败。,平均查找长度:,在二叉排序树中查找成功时走过的是一条从根结点到所寻找结点的一条路径,因此,二叉排序树查找的平均查找长度取决于二叉排序树的深度。, 二叉排序树的蜕变:,二叉排序树是动态生成的,它的形态与各结点插入二叉排序树时的先后顺序

8、有关。当把一组有序值依次插入到一棵二叉排序树时,生成的二叉排序树将蜕变成一棵单支树。例如,由整数序列15,23,26,47,56,89 生成的二叉排序树就是一棵单支树。在单支树中查找时,平均查找长度与顺序查找相同。,6. 哈希查找, 哈希存储(哈希表):,以数据元素的关键字k为自变量,通过一定的函数关系h(称为哈希函数或散列函数)计算出对应的函数值h(k),把这个值解释为数据元素的存储地址并把数据元素存储到相应的存储单元内。h(k)称为哈希地址。, 冲突:,若有两个不同的关键字ki和kj,即ki kj(i j)。但h(ki)=h(kj),这种情况称为冲突。如上例的关键字85和49,其对应的哈希

9、地址都为1,即产生冲突。,例:设有一组关键字值85,72,49,58,15,70,90,38,哈希函数h(k) = k mod 12。则对应的哈希地址为1,0,1,10,3,10,6,2, 采用哈希技术要解决的两个主要问题:,构造一个好的哈希函数,使出现冲突的机会尽可能少些;,设计一个有效的解决冲突的办法, 哈希函数的构造方法,构造哈希函数要考虑以下几点,1) 哈希函数的定义域必须包括要存储的数据元素的全部关键字; 而如果散列表允许有 m 个地址,则哈希函数的值域必须在 0 到 m-1 之间,2)由哈希函数计算出的地址应均匀分布在散列地址空间内,3)哈希函数应该是简单的,能在较短时间内计算出结

10、果,直接定位法,取关键字的某个线性函数作为哈希函数,即h(k)=ak+b。其中,k为关键字,a、b为常数。,常用哈希函数,数学分析法,当关键字的位数比存储区域地址码的位数多时,可以取关键字中位值分布比较均匀的若干位作为哈希函数的值。这种方法适合于所有关键字为已知的情况。,除留余数法,选择一个适当的正整数p (p通常选为不大于哈希表长度 m 的最大素数),用p去除关键字,取其余数作为哈希地址,即h(k)=k%p (pm)。, 解决冲突的方法:开放地址法和链地址法,开放地址法,当冲突发生时形成一个地址序列,按序列顺序逐个检查各地址单元,直至找到一个未被占用的单元为止,将发生冲突的数据元素存入该地址

11、单元中。,线性探查序列,平方探查序列,设哈希表的长度是m,发生冲突的地址是d,d+1, d+2, , m-1, 0, 1, , d-1,(d+12)%m, (d-12)%m, (d+22)%m, (d-22)%m, ,例1,线性探查法建立哈希表,设哈希表的长度11,哈希函数是h(k) = k % 11,将整数序列54,77,94,89,14,45,76存入哈希表。按平方探查法处理冲突,例2,0,1,2,3,4,5,6,7,8,9,10,54,77,94,89,54 % 11 = 10,77 % 11 = 0,94 % 11 = 6,89 % 11 = 1,14 % 11 = 3,45 % 11

12、 = 1 (冲突),76 % 11 = 10 (冲突),14,45,76,链地址法,将哈希地址相同的数据元素存储到同一个单链表中,哈希表中的每个存储单元中不再存放数据元素而是存放相应单链表的头指针,14.2 排序,1. 排序的基本概念, 排序:将文件中的记录按排序码非递减(或非递增)的顺序重新排列, 排序码:数据元素中的一个或多个数据项。排序码可以是关键字,也可以是其他若干数据项的组合。, 排序算法的稳定性:如果在待排序的元素序列中,存在着多个排序码相同的元素,按照某种排序算法排序后,这些元素的相对位置仍保持不变,则称该排序算法是稳定的,否则就是不稳定的。,2. 插入排序, 基本思想:把元素e

13、i(0in) 依次插入到由S中前i个元素组成的已经排好序的序列e0, e1, ,ei-1的适当位置上,插入后S的前i+1个元素仍为有序。, 直接插入排序:,以顺序查找的办法找到要插入的元素在已排好序的元素序列中应处的位置。 所有元素分成2个集合:已排序记录集和待排序记录集。初始时,已排序记录集只有一个元素,即e0,待排序记录集是所有剩余元素。然后每次从待排序记录集中选取一个元素,使用顺序查找的方法,找到其在已排序记录集中的位置,将其插入到该位置,直到待排序记录集为空。, 例:,待排序记录为50,20,75,34,40,34,40,75,20,50, 直接插入排序的函数示例:, 算法分析:,直接

14、插入排序的平均时间复杂度是O(n2),直接插入排序是稳定的排序算法,对于一个长度较短、接近有序的序列,直接插入排序是十分有效的,在插入ei时,e0, e1, , ei-1是一个有序序列,所以可以用二分查找法寻找ei的插入位置,从而减少比较次数。 二分插入排序是稳定的排序算法,其平均时间复杂度仍是O(n2), 二分插入排序:,3. 选择排序, 基本思想:把元素ei(0in) 依次插入到由S中前i个元素组成的已经排好序的序列e0, e1, ,ei-1的适当位置上,插入后S的前i+1个元素仍为有序。,在初始时,已排好序的元素序列为空,待排序的元素序列中包括了需要排序的所有元素, 直接选择排序:,基本

15、思想:用逐个比较的办法从待排序的元素序列中选出最小的元素。依次对i=0, 1, 2, ,n-2分别执行如下的选择和交换步骤:在元素序列ei, ei+1, , en-1中选择出最小的元素ek;当ki时,交换ei与ek的值。经上述n-1次的选择和交换后,排序工作即已完成。,直接选择排序函数模板:,直接选择排序算法是不稳定算法,其平均时间复杂度为O(n2), 演示:, 树形选择排序:,基本思想: 首先对n个待排序元素的排序码两两进行比较,得到 个比较的优胜者(排序码较小者),然后对这些优胜者再进行两两比较,如此反复,直至选出排序码最小的元素。 在下一步选择排序码为次小的元素时,只需把树当中与已选出元

16、素对应的叶结点的值设置为最大(),并从该叶结点开始和其兄弟结点进行比较,修改从该叶结点到根结点路径上各结点的值,即可选出排序码次小的元素。,算法的时间复杂度O(nlog2n),该算法是稳定的。, 堆排序:,基本思想: 首先,用需要排序的元素的排序码构造一个堆(称为建堆),这样就可以找到排序码最小的元素,将其取出;然后,用剩下的排序码继续建堆。如此反复进行直至全部元素有序。,堆是一棵完全二叉树,其中每个分支结点的值均小于或等于左、右子女的值。位于堆顶位置的结点(即完全二叉树的根结点)的值是最小的。,堆排序的关键步骤有两个:一是建立初始堆;二是在取出堆顶后把剩余的结点调整为堆。,首先,把所有元素的排序码组织到一棵完全二叉树中。然后从完全二叉树中结点编号排在最后的那个分支结点km(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号