数据结构(第九章 查找)[优质PPT]
合集下载
数据结构第24讲第9章查找表(5)4节c精品PPT课件
则表明查找不成功,返回“空指针”;
12.10.2020
18
在 Trie 树中的插入
查找,得到插入位置
插入一个叶子结点
12.10.2020
2
例如:
表示关键字集合
{HAD, HAS, HAVE, HE, HER, HERE, HIGH, HIS }
H
A
E
I
DSV$R
GS
$ $E
$ EH$
$
12.10.2020
$$ 3
1. 键树的结构特点:
1. 关键字中的各个符号分布在从根结点到叶的 路径上;
2. 叶结点内的符号为“结束”的标志符;
p=p->first; i++; 若 ( p && p->symbol != K.ch[i] ) 则继续在键树的同一层上进行查找 p=p->next;
若 ( p == NULL) 则表明查找不成功,返回“空指针”; 若 ( p && p->symbol==K.ch[i] && i==K.num-1) 则12.查10.20找20 成功,返回指向相应记录的指针 p->info1p0 tr
T
分支结点
H
A
叶子结点 D
E
$ … $
HAD
HE
R
$
G H
I S
含关键字 的记录HERFra bibliotekE $
$ HIGH
$ HIS
12.10.2020
HERE
6
结点结构:
分支结点
first symbol next
叶子结点 infoptr symbol next
数据结构部分(查找)课件
n=0
n=1
n=2
空树
最大深度为 0 最大深度为 1 最大深度为 2
n=4
n=7
最大深度为 3
最大深度为 4
三、 B - 树
1.定义
2.查找过程
1.B-树的定义
B-树是一种 平衡 的 多路 查找 树:
root 50
15
71 84
38
20 26 43
56 62 78 89 96
在 m 阶的B-树上,每个非终端结点可能 含有:
low 指示查找区间的下界; high 指示查找区间的上界; mid = (low+high)/2。
分析折半查找的平均查找长度
先看一个具体的情况,假设:n=11
i 1 2 3 4 5 6 7 8 9 10 11 Ci 3 4 2 3 4 1 3 4 2 3 4
判定树
3
6 9
1
4
7
10
2
5
8
11
一般情况下,表长为 n 的折半查找 的判定树的深度和含有 n 个结点的完全 二叉树的深度相同。
何谓查找表 ?
查找表是由同一类型的数据元素( 或记录)构成的集合。
由于“集合”中的数据元素之间存在着 松散的关系,因此查找表是一种应用灵 便的结构。
对查找表经常进行的操作:
• 1)查询某个“特定的”数据元素是否 在查找表中;
• 2)检索某个“特定的”数据元素的各 种属性;
• 3)在查找表中插入一个数据元素; • 4)从查找表中删去某个数据元素。
• 根据动态查找表的定义,“插入”操 作在查找不成功时才进行;
• 若二叉排序树为空树,则新插入的 结点为新的根结点;否则,新插入 的结点必为一个新的叶子结点,其 插入位置由查找过程得到。
数据结构课件--第九章.ppt
返回主目录
}
算法分析:
采用折半插入排序法,可减少关键字的比较次
数。每插入一个元素,需要比较的次数最大为折半
判定树的深度,如插入第i个元素时,设i=2j,则需进
行log2i次比较,因此插入n-1个元素的平均关键字的 比较次数为O(nlog2n)。
虽然折半插入排序法与直接插入排序法相比较,
改善了算法中比较次数的数量级,但其并未改变移
法 {r[j+1]= r[j]; j=j-1;}
r[j+1]=r[0];
/*将待插入记录插入到已排序的序列中*/
}
} /* InsSort */
返回主目录
该算法的要点是:①使用监视哨r[0]临时保存待插入的记录。 ②从后往前查找应插入的位置。③查找与移动用同一循环完 成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。 从时间耗费角度来看,主要时间耗费在关键字比较和移动元 素上。
字的领先关系在排序过程中发生变化者,则称所用
的排序方法是不稳定的。
返回主目录
在排序过程中,一般进行两种基本操作: (1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。 对于第二种操作,需要采用适当地存储方式,即向 量结构、链表结构以及记录向量与地址向量结合的 表示方法。
我们重点来讨论在向量存储结构上各种排序方法的 实现。
返回主目录
9.2 插入类排序
基本思想:在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序插入到已排好序的记录子集中,直
到将所有待排记录全部插入为止。
9.2.1 直接插入排序
基本操作是将第i个记录插入到前面i-1个已排好序的记录中, 具体过程为:将第i个记录的关键字Ki顺次与其前面记录的 关键字Ki-1,Ki-2,…K1进行比较,将所有关键字大于Ki的 记录依次向后移动一个位置,直到遇见一个关键字小于或者 等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插 入空位置即可。
}
算法分析:
采用折半插入排序法,可减少关键字的比较次
数。每插入一个元素,需要比较的次数最大为折半
判定树的深度,如插入第i个元素时,设i=2j,则需进
行log2i次比较,因此插入n-1个元素的平均关键字的 比较次数为O(nlog2n)。
虽然折半插入排序法与直接插入排序法相比较,
改善了算法中比较次数的数量级,但其并未改变移
法 {r[j+1]= r[j]; j=j-1;}
r[j+1]=r[0];
/*将待插入记录插入到已排序的序列中*/
}
} /* InsSort */
返回主目录
该算法的要点是:①使用监视哨r[0]临时保存待插入的记录。 ②从后往前查找应插入的位置。③查找与移动用同一循环完 成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。 从时间耗费角度来看,主要时间耗费在关键字比较和移动元 素上。
字的领先关系在排序过程中发生变化者,则称所用
的排序方法是不稳定的。
返回主目录
在排序过程中,一般进行两种基本操作: (1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。 对于第二种操作,需要采用适当地存储方式,即向 量结构、链表结构以及记录向量与地址向量结合的 表示方法。
我们重点来讨论在向量存储结构上各种排序方法的 实现。
返回主目录
9.2 插入类排序
基本思想:在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序插入到已排好序的记录子集中,直
到将所有待排记录全部插入为止。
9.2.1 直接插入排序
基本操作是将第i个记录插入到前面i-1个已排好序的记录中, 具体过程为:将第i个记录的关键字Ki顺次与其前面记录的 关键字Ki-1,Ki-2,…K1进行比较,将所有关键字大于Ki的 记录依次向后移动一个位置,直到遇见一个关键字小于或者 等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插 入空位置即可。
大学数据结构课件--第9章 查找
——这种既查找又插入的过程称为动态查找。
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p
数据结构查找ppt课件
low mid
high=mid-1
( 08, 14, 23, 37, 46, 55, 68, 79,
high
91 )
91 )
low=mid+1
high
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
low
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
➢ 查找算法中的基本运算是记录的关键字与给定值所进行的 比较,其执行时间通常取决于比较的次数。因此,通常以 关键字与给定值进行比较的记录个数的平均值,作为衡量 查找算法好坏的依据。
12.05.2021
4
整理版课件
查找表操作及分类
➢ 操作:
(1)查询某个“特定的”数据元素是否在查找表中;
(2)某个“特定的”数据元素的各种属性;
➢ 顺序查找的存储结构要求:
顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链 式存储结构(使用单链表作为存储结构时,扫描必须从第一个结点开始), 顺序查找对数据在表中存放的先后次序没有任何要求。
12.05.2021
7
整理版课件
➢ 顺序查找的线性表定义如下:
typedef struct { ElemType *elem; int length;
哨的 作用: 无需 判断 是否 越界.
9
顺序查找的算法:
使用了监视哨,在查
int Search_seq(SSTable ST[ ], { int i=n;
int n,
int
key找步) f{o过都r(i程去=n;中判i>断,0; -是不-i)否用
每 查
一 找
结束if(。ST0.e单lem元[ i被].k当ey=作ke监y)
数据结构九章节查找
9.3 动态查找表
二叉排序树中序遍历 中序遍历二叉排序树,可得到一个关键字的有序序列,如 5,13,19,21,37,56,64,92,75,80,88
56 13
5
37
64 92
21
80
19
75
88
中国科大《数据结构》
9-25
9.3 动态查找表
二叉排序树删除 删除二叉排序树中的一个结点后,必须保持二叉排序树的特性:
顺序查找算法 1. 从表中最后一个记录开始 2. 逐个进行记录的关键字和给定值的比较 3. 若某个记录比较相等,则查找成功 4. 若直到第1个记录都比较不等,则查找不成功
9-6
中国科大《数据结构》
9.2 静态查找表
顺序查找算法描述
int Search_Seq(SSTable ST, KeyType key) { // 若查找成功,返回位置
中国科大《数据结构》
9-19
9.3 动态查找表
动态查找表 如果应用问题涉及的数据量很大,而且数据经常发生变化,如
图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对 这类表除了提供前面的介绍的查找外,还要提供动态查找功能: 1. 查找某个“特定”元素是否在表中,若不在,将该元素插入; 2. 查找某个“特定”元素是否在表中,若在,从表中删除; 如何组织动态查找表? 用静态查找方法不能满足要求了。本节介绍几种方法。
找到 21
64
92 无此数
80
19
75
88
找到
例1:在右图二叉排序树中查找关键字值等于37 例2:在右图二叉排序树中查找关键字值等于88 例3:在右图二叉排序树中查找关键字值等于94
中国科大《数据结构》
数据结构 第九章-查找PPT课件
//继续扫描
return i;
//返回记录的下标i
}
华中科技大学计算机学院
3 查找算法性能分析:
对n个记录的表,所需比较关键字的次数
● 只考虑查找成功: 最少为1,最多为n
假定每个记录的查找概率相等,
即 P1 = P2 = ... = Pn =1/n
ASL=
n
i 1 P iC=i
1 n Ci n i1
输出:成功时:记录序号,失败时:0
int sequsearch(SSTable ST,keytype k)
{
int i=ST.length; //从第n个记录开始查找
ST.elem[0].key=k; //k填入ST.elem[0].key
while( k!=ST.elem[i].key )
i-- ;
0 1 2041 2 2042
2046
3 ...
...
...
监视哨
刘大海 ...
王 伟 ...
吴晓英 ...
...
...
...
...
...
...
maxsize
length
华中科技大学计算机学院
例1 元素类型为记录(结构)
#define maxsize 100 //表长100
typedef struct node
= 1(n(n1).. . 1)
n
=(n+1)/2
华中科技大学计算机学院
● 考虑查找失败: 使用监视哨elem[0],为 n+1 不使用监视哨elem[0],为 n
假定查找成功和失败的机会相同,对每个记录的 查找概率相等,
SSTable ST1,ST2;
[课件]数据结构 第九章 查找
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 一趟分组: 38 65 97 76 13 27 48 55 4
一趟排序:13 27 48 55 4 取d2=3 13 二趟分组: 27 48 55 4
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 三趟分组: 4 48 55 27 49 38 65 97 76
第十章 排序
排序定义——将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫~ 排序分类
按待排序记录所在位置
内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序
按排序依据原则
插入排序:直接插入排序,折半插入排序,希尔排序 交换排序:冒泡排序,快速排序 选择排序:简单选择排序,堆排序 归并排序:2-路归并排序 基数排序
4 一趟排序:13 27 48 38 27 49 55 65 97 76 55 4 38 j j j ji ij ij ij i i i
二趟排序: 13 4 48 38 27 49 55 65 97 76 Ch8_3.c
希尔排序特点
子序列的构成不是简单的"逐段分割",而是将相隔某个增 量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体 上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1
2 ( n + 4 )( n 1 ) ( i + 1) = 2
严蔚敏版数据结构C语言版PPT第九章
度较大,特别不适用于表长较大的查找表。
数
据 结
若以有序表表示查找表,则查找过程
构 可以基于“折半”进行。
折半查找只适用于有序表,且限于顺序存储结构
13
第 9 章 查找 9.2 基于线性表的查找 ②折半查找
基本思想: 数 1.首先确定查找表的中间位置;
据
结 2.然后将待查的值与中间位置的值进行比较, 构 若相等,则查找成功并返回此位置,否则须
50 -2 60 1
80 0 (a)一棵平衡二叉排序树
58 0 (b)一棵失去平衡的二叉排序树
30
第 9 章 查找
9.4 计算式查找法—哈希表
哈希表是什么?
以上两节讨论的表示查找表的各种结构的
数
共同特点:
据
结
1.记录在表中的位置和它的关键
构
字之间不存在一个确定的关系;
2.查找的过程为给定值依次和关 键字集合中各个关键字进行比较;
23
第 9 章 查找 9.3 基于树的查找 ①二叉排序树
例如: 50
数
30
80
据 结
20
40
90
构
10 25 35
66 85
23
88
不 是二叉排序树。
24
第 9 章 查找
9.3 基于树的查找 ①二叉排序树 查找算法
若二叉排序树为空,则查找不成功;
否则,
数 1. 若给定值等于根结点的关键字,则查找成功;
线性表的三种查找方法比较
顺序查找 折半查找 分块查找
数
据 表的结构 有序、无序
有序
表间有序
结
构 表的存储 顺序、链式
顺序
顺序、链式
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.1 静态查找表
静态查பைடு நூலகம்表的抽象数据类型
抽象数据类型静态查找表的定义: ADT StaticSearchTable {
数据对象D: D是具有相同特性的数据元素的集合。每个数据元素 含有类型相同的关键字,可唯一标识数据元素。
数据关系R:数据元素同属一个集合。
基本操作 P: Create(&ST, n); //构造一个含 n 个数据元素的静态查找表ST。 Destroy(&ST); //销毁表ST。 Search(ST, key); //查找 ST 中其关键字等于key 的数据元素。 Traverse(ST, Visit());//按某种次序对ST的每个元素调用函数 Visit()一次且仅一次。
动态查找 ——既查找,又改变(增减)集合内的数据元素。
关键字
主关键字 次关键字
——记录中某个数据项的值,可用来识别一个记录
( 预先确定的记录的某种标志 )
——可以唯一标识一个记录的关键字
例如“学号”
——识别若干记录的关键字
例如“女”
基本概念
讨论:
(1)查找的过程是怎样的? 给定一个值K,在含有n个记录的文件中进行搜索,寻找一个关键字
for( i=ST.length; ST.elem[ i ].key!=key; - - i );
//不要用for(i=n; i>0; - -i) 或 for(i=1; i<=n; i++)
return i; //若到达0号单元才结束循环,说明不成功,返回0值(i=0)。成功时
则返回找到的那个元素的位置i。
值等于K的记录,如找到则输出该记录,否则输出查找不成功的信息。
(2)对查找表常用的操作有哪些? 查询某个“特定的”数据元素是否在表中; 查询某个“特定的”数据元素的各种属性; 在查找表中插入一元素; 从查找表中删除一元素。
(3) 有哪些查找方法?
“特定的”=关键字 例如查字典
查找的基本方法可以分为两大类,即比较式查找法和计算式查找法。 其中比较式查找法又可以分为静态查找表和动态查找表,而计算式查找 法也称为HASH(哈希)查找法。
只要知道头指针head就可以“顺藤摸瓜”; 对非线性树结构如何顺序查找?可借助各种遍历操作!
以顺序表表示静态查找表,则Search函数可用顺序查找来实现。其顺 序存储结构如下:
顺序表的机内存储结构:
typedef struct {
ElemType *elem; //表基址,0号单元留空。表容量为全部元素
静态查找表:只作前两种操作。 动态查找表:查找过程中同时插入不存在或删除已存在的某个元素。
基本概念
(4)如何评估查找方法的优劣?
明确:查找的过程就是将给定的K值与文件中各记录的关键字项进行比 较的过程。所以用比较次数的平均值来评估算法的优劣。称为平均查找 长度(ASL:average search length)。
} // Search_Seq
时间复杂度为 O(ST.length)
9.1 静态查找表
顺序查找
顺序查找性能分析
查找算法的平均查找长度(Average Search Length):
n
ASL PiCi
i1
为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期 望值。
其中:
n 为表长
n
比较次数:
查找第n个元素: 1
查找第n-1个元素:2
……….
查找第1个元素: n
查找第i个元素: n+1-i
查找失败:
n+1
ii i 比较次数=5
9.1 静态查找表
顺序查找
算法的实现:
技巧:把待查关键字key存入表头或表尾(俗称“哨兵”),这样可以 加快执行速度。
例: 若将待查找的特定值key存入顺序表的首部(如0号单元),则顺序 查找的实现方案为:从后向前逐个比较!
Pi 为查找表中第i个记录的概率
Pi 1
i 1
Ci为找到该记录时,曾和给定值比较过的 关键字的个数
9.1 静态查找表
顺序查找
对顺序表而言,Ci = n-i+1 ASL = nP1 +(n-1)P2 + +2Pn-1+Pn
在等概率查找的情况下,
Pi
1 n
顺序表查找的平均查找长度为:
ASss Ln 1i n1(ni1)n2 1
int
length; //表长,即表中数据元素个数
}SSTable;
9.1 静态查找表
顺序查找
查找过程:从表的一端开始逐个进行记录的关键字和给定值的比 较。 例如:
找64
0 1 2 3 4 5 6 7 8 9 10 11 64 5 13 19 21 37 56 64 75 80 88 92
监视哨
ii
统计意义上的数
其中:
学期望值
n是文件记录个数;
Pi是查找第i个记录的查找概率(通常取等概率,即Pi =1/n); Ci是找到第i个记录时所经历的比较次数。
物理意义:假设每一元素被查找的概率相同,则查找每一元素所需 的比较次数之总和再取平均,即为ASL。
显然,ASL值越小,时间效率越高。
主要内容
9.1 静态查找表 9.2 动态查找表 9.3 哈希表
} ADT StaticSearchTable
9.1 静态查找表
针对静态查找表的查找算法主要有: 一、顺序查找(线性查找) 二、折半查找(二分或对分查找) 三、静态树表的查找 四、分块查找(索引顺序查找)
9.1 静态查找表
顺序查找
顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最 直接的办法。 对顺序结构如何线性查找? 对单链表结构如何线性查找?函数虽未给出,但也很容易编写;
int Search_Seq( SSTable ST , KeyType key ){
//在顺序表ST中,查找关键字与key相同的元素;若成功,返回其位置信息, 否则返回0
ST.elem[0].key =key; //设立哨兵,可免去查找过程中每一步都要检测是
否查找完毕。当n>1000时,查找时间将减少一半。
数据结构
第9章查找
基本概念
是一种数据结构
查找表 ——由同一类型的数据元素(或记录)构成的集合。
查找
——查询(Searching)特定元素是否在表中。
查找成功 ——若表中存在特定元素,称查找成功,应输出该记录;
查找不成功 ——否则,称查找不成功(也应输出失败标志或失败位置)
静态查找 ——只查找,不改变集合内的数据元素。