Top Banner
查查查查查 ---- 查查查查 查查查查
27

查找和排序

Mar 15, 2016

Download

Documents

Ella Carpenter

查找和排序. ---- 动态查找,二叉树篇. 二叉排序(查找)树. 定义 若二叉树不空,则 若它的左子树不空,则左子树上所有结点的值均小于根结点的值,且是一棵二叉树; 若它的右子树不空,则右子树上所有结点的值均大于根结点的值,且是一棵二叉树;. 二叉排序树中查找的过程. 查找51,33 与根结点进行比较, 如果和根结点的值相等,则找到了; 如果比根结点的值大,则到右子树中查找;否则,到左子树中查找. 二叉排序树插入. 将 31 插入到右边的二叉排序树中 先找到要插入的位置(查找过程) 将 31 插入到合适的位置. 二叉排序树删除. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 查找和排序

查找和排序---- 动态查找,二叉树篇

Page 2: 查找和排序

二叉排序(查找)树 定义若二叉树不空,则1. 若它的左子树不空,则左子树上所有结点的值均小于根结点的值,且是一棵二叉树;2. 若它的右子树不空,则右子树上所有结点的值均大于根结点的值,且是一棵二叉树;

Page 3: 查找和排序
Page 4: 查找和排序

二叉排序树中查找的过程 查找 51 , 33 与根结点进行比较,如果和根结点的值相等,则找到了;如果比根结点的值大,则到右子树中查找;否则,到左子树中查找

Page 5: 查找和排序

二叉排序树插入 将 31 插入到右边的二叉排序树中1. 先找到要插入的位置(查找过程)2. 将 31 插入到合适的位置

Page 6: 查找和排序

二叉排序树删除 将右边的二叉排序树中值为 45 删除1. 先找到要删除的结点(查找过程)2. 删除该节点,并保持二叉树仍然是一个二叉排序树

Page 7: 查找和排序

删除节点的一般处理1. 用左子树中最大的结点代替该结点;或者用右子树中最小的结点代替该结点

Page 8: 查找和排序

具体的处理 如果待删除结点是叶子 ,如 32,47 如果待删除结点只有左子树 , 如 51,34 如果待删除节点只有右子树 , 如 12 如果待删除结点左右子树均非空 , 如 45,54

Page 9: 查找和排序

平均查找长度 ASL ASL=(1+2+2+3+3

+3+4+4)/8=11/4=2.75<4

最好的情形 : 完全二叉树 最差的情形 : 单支树

ASL<=log2 n

ASL=(n+1)/2

Page 10: 查找和排序

二叉排序树进行排序 特征:中序遍历为有序1. 用给定数据构造二叉排序树2. 中序遍历二叉排序树

Page 11: 查找和排序

平衡二叉树 定义

或者是一个棵空树,或者具有下列性质:它的左右子树都是平衡二叉树,且左右子树的高度相差(的绝对值)不超过 1 结点的平衡因子:左子树高度减去右子树的高度 平衡二叉树上的结点平衡因子只能是 -1,0,1

Page 12: 查找和排序

Hash (哈希)表 Hash 表的定义由关键字直接确定存储位置 Hash 函数根据关键字计算存储位置的函数

Page 13: 查找和排序

Hash 函数的构造 直接定址取关键字或者关键字的线性函数值为 hash 地址 例如: H(key)= key 或者 H(key)=a*key+b 数字分析关键字都是事先可知的,则可取关键字的若干位作为 hash 地址例如: 学号 10062364 ..10062396

Page 14: 查找和排序

Hash 函数的构造 平方取中取关键字平方后的中间几位为 hash 地址例如:key key^2 H(key)1100 12100 2101160 137040 3702161 4734741 7342162 4741304 741

Page 15: 查找和排序

Hash 函数的构造 折叠将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几位的叠加和(舍去进位)作为 hash 地址例如: 0-442-20586-4 5864 5864 4220 0224+ 04 + 04———— ----------10088 6092

Page 16: 查找和排序

Hash 函数的构造 除留余数取关键字被某个不大于 hash 表长的 m 的数 p除后所得余数为 hash 地址 H(key)= key mod p; p<=m通常应选取 p 为质数或者不包含小于 20 的质因数的合数

Page 17: 查找和排序

Hash 函数的构造 随机数选择一个随机函数,取关键字的随机函数值为它的 hash 地址 H(key)= random (key) 其他

Page 18: 查找和排序

Hash 函数主要考虑因素 计算函数所需时间 关键字长度 Hash 表长度 关键字分布情况 记录的查找频率 Hash 函数导致地址冲突

Page 19: 查找和排序

处理冲突的方法1. 开放定址法 Hi=( H(key) + di ) mod mH(key) 是 hash 函数, m 为表长, di 为增量序列(1) di =1,2,3,..,m-1 线性探测再散列(2) di =1,-1,22,-22, 32,..,-k2 (k<=m/2) 二次探测再散列(3) di = 伪随机序列,伪随机探测再散列

Page 20: 查找和排序

处理冲突的方法2. 再 Hash Hi=RHi ( key )RHi 均是不同的 hash 函数,在同义词产生地址冲突的时候计算另一个 hash 函数地址,直到冲突不再产生

Page 21: 查找和排序

处理冲突的方法3. 双 Hash 函数提供两个 hash 函数,第一个确定地址,第二个函数在冲突的时候提供探测的步长例如:表长 11H1(key)= key mod 11H2(key)=7-(key mod 7)若 key=58 则探测序列为: 3 , 8 , 2

Page 22: 查找和排序

处理冲突的方法4. 链地址将所有关键字为同义词的记录存储在同一线性表中5. 公共溢出区一旦发生冲突,就将该数据放入溢出表

Page 23: 查找和排序

考虑下面的问题 现在用双函数法来计算 hash 地址。将数据放入 hash 表中时,1. 如何表示地址冲突?2. 需要将表中的一个数据删除时,应该怎么做?这对上面表示冲突的方法有影响吗?

Page 24: 查找和排序

平均查找长度 例 19 14 23 01 68 20 84 27 55 11 10

79 表长 16 Hash 函数 H(key)= key mod 13 冲突解决方法:线性探测再散列 画出 Hash 表,并求出 ASL

Page 25: 查找和排序

堆排序 锦标赛排序 什么是一个堆?(大、小顶堆)大顶堆例: 96,83,27,38,11,09小顶堆例: 12,36,24,85,47,30,53,91

Page 26: 查找和排序

如何构造一个堆 ( 以大顶堆为例 ) 例: 49 38 65 97 76 13 27 51 从上往下从只有一个元素的大顶堆开始,逐步增加数据仍保持是一个大顶堆 从下往上把孩子已经是大顶堆的结点调整成一个大顶堆

Page 27: 查找和排序

堆排序例 96,83,27,38,11,09,23,37,13 第一步 先构造一个堆 第二步 把构造好的堆按照顺序输出