第9章查找

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对第i个记录,查找需要的比较次数是(n-i+1)
2020/9/23
平均查找长度——未确定记录在查找表中的位置,需要和给定值进行比 较的关键字的平均个数。
n
ASL PiCi i1
其中:Ci表示查找第i个记录时,需要进行
比较的关键字的个数。Pi查找概率
只考虑查找成功的情况:
ASL 1n(ni1 )n1
fR
用子树替代删除的结点
PL
2020/9/23
f
p C
PR
fR
Q CL
S QL
SL
算法9.7,9.8
3)p指向的结点有左子,同时也有右子。 结点序列: …… CL C …… QL Q SL S P PR f ……
方法1:用P的左子树来替代P 问题:P的右子树如何处理? PR在S之后访问,所以将PR做为S 的右子树。
第九章 查找
• 计算机存储信息的目的是要使用这些信 息,必须能对这些信息进行查找,从中 找到所需的数据。
• 如何实现对信息的有效查找?针对信息 的不同特点和不同的存储方法,有不同 的查找方法。
2020/9/23
– 查找表:同一类型数据组成的集合,每个数 据在表中又称为一个记录。
– 查找是作用在同一个类型的数据元素集合上 的,将这样的集合称为查找表。
2020/9/23
– 删除
• 删除一个结点后,仍要保持二叉树的特性。从有序 序列的角度,从中删除一个元素,其他元素的相对 位置不变。
• 分析:删除p指向的结点,f指向p所指结点的父结点 。
f
1)p指向叶结点
直接删除,不影响其它部分。
f
p
2)p指向的结点有一棵子树
以只有左子树为例
p
结点序列:
…PL P f fR … ==>…PL f fR …
BR
AR h-1
2020/9/23
24
13
31
8
15
10
13
右旋
8
24
10 15
31
2)、单向左旋操作:RR型——当有新结点插入结点的右 子树的右支上,而导致此结点失衡。
A -1->-2
h-1 AL
B 0->-1 BL BR
h
h-1 左旋
0 A
h-1 AL
B0
BR BL
2020/9/23
20 15
访问的最后一个结点。
45
45
12
50
插入53
6
21 49
70
6
20
2020/9/23
12
50
21 49 20
70 53
– 生成
若从空树出发,经过一系列的查找插入操作以后,可生成一棵二叉
树。设查找的关键字序列为{45,24,53,45,12,24,90},则生成二叉树的 过程如下:
45 45 45 24 24 53
• AVL树任一结点平衡因子只能取 -1, 0, 1
• 如果一个结点的平衡因子的绝对值大于1,则这棵二 叉搜索树就失去了平衡, 不再是AVL树。
• 如果一棵二叉搜索树是高度平衡的, 且有 n 个结点 ,其高度可保持在O(log2n),平均搜索长度也可保持 在O(log2n)。
• 在创建二叉排序树时,让它时刻是平衡二叉树,一旦失 衡,就要进行调整。
查找不成功时: h = log2(n+1)
2020/9/23
• 3、索引顺序表
– 除表本身外,还建立了一个索引。表中数据分块,每 一块是一个子表,子表内的数据是无序的,但子表之 间的数据是有序的。(即块有序)
– 利用索引,先将数据定位到子表,而后再在子表中, 进行查询。减小数据集合。
索引表
max(T1) max(T2) ...... max(Tn)
T1
T2
Tn
数据表
2020/9/23
• 二步查询:
– 确定数据所在的分块 – 在相应的子表中查询
• 算法
– 索引表上的查找算法+顺序表的查找算法
• 时间复杂度: ASbsLLbLw
2020/9/23
其中: Lb为确定所在块的平均查找长度。 Lw为在块中查找时的平均查找长度。
a. 若采用顺序查找确定所在块,则: ASL = (b+1)/2 + (s+1)/2 = (n/s+s)/2+1
2020/9/23
查找记录的过程恰好走了一条从根到该结点的路径,比较次数=路径上的结点 数=此结点所在的层数。
所以:比较成功时的比较次数<=树的深度。
若设 n = 2h-1,则描述折半搜索的判定树是高度为 h 的满二叉树。
2h = n+1, h = log2(n+1)。
搜索第 i 层结点要比较 i次,…。
方法2:用P在序列中的前驱S来替代P 将S从原有位置上删除。
2020/9/23
P没 有 右 子 N
P没 有 左 子 N
Y P的 左 子 替 代 P
Y P的 右 子 替 代 P
( 利 用 有 序 序 列 中 的 直 接 前 驱 S来 替 代 P) 在左子树中找直接前驱S
用 S替 代 P
删除S
N
p=q
Biblioteka Baidu
假定每个结点的搜索概率相等,即 pi = 1/n,则搜索成功的平均搜索长度为:
32 (h1 )2 h 2 )
2
h 2
h 1
i 1
ni 1
n
AS suL c c p iC i
C i (1122
1
1
1
n
n
n 1((h1 )2h1)n 1((n1)lo 2(n g1 )n)
nn 1lo2g(n1)1lo2g(n1 )1
1 在随机的情况下,平均性能为:P(n) <= 2(1+1/n)lnn
在使用二叉排序树时应该尽量让左右子树平衡发展,这样生 成的二叉排序树能在其上实现性能较优的查找。
2020/9/23
二叉排序树平衡化---->平衡二叉树
2、平衡二叉树——AVL树
• AVL树的定义(Addson-Velskill-Landis)
选择链式结构,选用什么样的链式结构?
能不能进一步改善查询?回想前面在进行折半查找性能分析 时,使用的判定树。
2020/9/23
二、动态查找表
– 特点:表在查找的过程中动态生成,动态查找表有不同的表示方 式,这一章重点讨论树型结构实现的查找表。
• 1、二叉排序树
定义:二叉排序树(Binary Sort Tree)或者是一棵空二叉树;或者具 有下列性质的二叉树: A,若它的左子树不空,则左子树上所有结点的值均 小于它的根结点的值; B,若它的右子树不空,则右子树上所有结点的值均 大于它的根结点的值; C,它的左右子树也分别为二叉排序树。
{
if EQ(ST.elem[i].key,key) return i;
}
• 算法9.1
下表 0 1 2 3 … n-1 n
– 监视哨的作用
元素
a1 a2 a3 … an-1 an
• 算法性能分析
岗哨,即待查元素
– 时间复杂度
查找一个记录时,需要和给定值进行比较的关键字的个数。
记录在表中的位置不同,需要比较的关键字个数也不同。
45
45
12
6
21
20
2020/9/23
50
49
100
60
103
12
50
6
21 49
100
20
42
103
– 查找
• 与根比较,若不等,则如果比根小,去左子树中查找;如果 比根大,去右子树中查找
• 算法9.5(a)
– 插入
• 如果要查找的数据不在二叉树中,则插入合适的位置。 • 插入前要确定插入位置,应该是查找不成功时,查找路径上
• 不同:
– 给定n个数值的有序序列,判定树是唯一的。
– 具有n个结点二叉树可以有不同的形态,而不同形态的二叉树具 有不同的深度,因此,对于不同形态的二叉排序树,其平均查 找长度也是不同的。
最坏的情况下蜕变为单支树,此时的平均查找长度为:(n+1)/2 最好的情况下就是折半查找,此时的平均查找长度为:log2(n+1)-
26
31 37
33
左旋
15
31
20
37
26 33
3)、先左后右旋转操作:LR型——当有新结点插入结点 的左子树的右支上,而导致此结点失衡。
1->2 A
0->-1 B AR h-1
h h-1 BL BR
-2 B
A1
x
h-1 BL
h+1
BR
AR h-1
2020/9/23
24
13
31
8
15
16
0->-1 B
– 13,24,37
13
2020/9/23
13
13
24
24
37
24
13
37
• 调整方法:利用四种旋转操作,作用于失衡的结点 。
1)、单向右旋操作:LL型——当有新结点插入结点的 左子 树的左支上,而导致此结点失衡。
1->2 A
0->1 B
0 B A0
h
AR h-1
右旋
h
h-1 BL BR
h-1 BL
S 是 父 结 点 q的 右 子 ,S 的 左 子 替 代 S
Y P的 左 子 是 单 支 树 , S是 P的 左 子
p
q
S
SL
其中:p指向待删除节点 s是有序序列中p的直接前驱 q指向s的双亲节点
2020/9/23
35、 15、 10、 45、 25、 20、30、50
35 15
搜索45
45
10
一棵AVL树或者是空树,或者是具有下列性质的二 叉搜索树:
它的左子树和右子树都是AVL树,且左子树和右子 树的高度之差的绝对值不超过1。
高度不平衡 A B C DE
2020/9/23
高度平衡
A
B
D
C
E
• 结点的平衡因子balance (balance factor)
• 每个结点附加一个数字, 给出该结点左子树的高度 减去右子树的高度所得的高度差,这个数字即为结 点的平衡因子balance
A 1->2
左旋
2
A2
C
C
AR h-1
B
h h-1 BL
CL h-1 CR h-2
h-1 BL
CR h-2 CL h-1
AR h-1
24
13
31
8
15
左旋
24
15
31
13
16
16
8
右旋
0 C
B
右旋
A -1
h-1 BL
CL h-1 CR h-2
AR h-1
2020/9/23
15
13
24
8
16
31
4)、先右后左旋转操作:RL型——当有新结点插入结点 的右子树的左支上,而导致此结点失衡。
45 24 53
45 24 53
12
12
90
中序遍历可以得到一个结点的有序序列。这就是说,一个无序序列 可以通过构造成一棵二叉排序树而变成一个有序序列。另外可以看 到,每次插入的新结点都是树中一个叶子结点,因此在进行插入的 时候不必移动其他结点,仅需改动某个结点的指针。
•算法9.5(b)——在以T为根的二叉树上进行查找,f指向T的父结 点, •9.6
b. 若采用折半查找确定所在块,则:
ASL = log2(n/s+1) + s/2
静态查找表的特点:查找表一旦建立起来,数据不再变动。 顺序存储特点:
优点:元素地址可计算;结构简单;空间利用率高。 缺点:增加和删除时,需要移动数据,费时。 链式存储特点: 优点:增加和删除时,不需要移动数据;有一定的空间代价; 缺点:用指针可以表示元素之间的关系,处理相应的复杂。 考虑: 动态查找表,数据经常变动,什么结构比较合适?
– 8,15,18,23,41,56,63 查找:19 – – low(下界) mid(比较) high(上界) 演示
• 算法9.2 • 性能分析 • 查找过程可以借助二叉树来描述、分析。这个二叉树称为判
定二叉树。
– 构造:以中间元素为根,所有小于中间元素的数据组成左子树 ,大于中间元素的数据组成右子树。
1、二叉排序树 2、平衡二叉树---AVL树 3、平衡查找树---B_树 20204/9、/23 散列表
一、静态查找表
• 1、顺序表的查找
– 查找表采用顺序存储结构,记录按逻辑顺序存放
• 查找方法:用给定值与表中的各个纪录的关键字逐个比较
• 原始算法
for ( i = ST.length; i >=0; -- i)
– 关键字:是数据元素中某个数据项的值。
• 主关键字:可以唯一地标识一个记录。 例如: 学生纪录 学 号姓 名年 龄籍 贯
所谓查找,就是在数据集合中按关键
字寻找满足某种条件的数据对象。
2020/9/23
• 静态查找——查找表的内容不变(即元素都已知 )
1、顺序查找 2、折半查找 3、索引顺序查找
• 动态查找——查找表的内容受插入、删除的影响 。 (即元素动态变化)
25
50
20 30
搜索22
搜索成功时检测指针停留在树中某个结点。
搜索不成功时检测指针停留在某个外结点(失败结点)。
2020/9/23
10 、 15、 20、 25、 30、 35、 45、 50
10 15 20 25 30 35 45 50
2020/9/23
– 查找的性能分析
• 查找的过程走了一条从根到查找结点的路径的过程,路径的 最大长度不会超过树的深度,类似于折半查找。
ni1
2
考虑查找成功和不成功的情况:
AS 1(L 1n( ni 1 )( n1 )3 ) ( 1 n)
2ni 1
4
评价:简单、适应面广
缺点:费时
8,15,18,23,41,56,63 19
2020/9/23
• 2、有序表的折半查找
– 静态查找表中,各个记录按关键字大小顺序排列。 – 折半查找
• 原理:通过与中间位置上的元素进行比较,每次可以将比较 的元素范围缩小一半。 例如:
相关文档
最新文档