数据结构c课件 第八章 查找
数据结构部分(查找)课件
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)从查找表中删去某个数据元素。
• 根据动态查找表的定义,“插入”操 作在查找不成功时才进行;
• 若二叉排序树为空树,则新插入的 结点为新的根结点;否则,新插入 的结点必为一个新的叶子结点,其 插入位置由查找过程得到。
数据结构课件第八章查找优秀课件
low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low mid high 1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查找第i个元素: n+1-i
查找失败:
n+1
iii 比较次数=5
顺序查找方法的ASL
n
对含 n个 有记录的 AS表 L , pici i1
设表中每个元 概素 率的 相 pi查 等 1n找
n
则AS L
i1
pici
1 n i ni1
1n(n1) n2
n1 2
7.2.2 折半查找
1. 折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数 据元素按关键字有序(升序或降序)排列,也就是说 折半查找只适用于对有序顺序表进行查找。
查找——也叫检索,是根据给定的某个值,在表中确定一 个关键字等于给定值的记录或数据元素
关键字——是数据元素中某个数据项的值,它可以标识一 个数据元素
查找方法评价
查找速度
占用存储空间多少
算法本身复杂程度
平均查找长度ASL(Average Search Length):为确定记 录在表中的位置,需和给定值进行比较的关键字的个 数的期望值叫查找算法的~
7.2 静态查找
正如本章第一节所述:静态查找是指在静态查找 表上进行的查找操作,在查找表中查找满足条件的数 据元素的存储位置或各种属性。本节将讨论以线性结 构表示的静态查找表及相应的查找算法。
7.2.1 顺序查找
1. 顺序查找的基本思想
数据结构课件-第八章
8.3.1 顺序查找
顺序查找思想:
从表的一端开始,逐个将记录关键字与给定的 值比较。若相等,则查找成功;若所有n 个记录的 关键字值都已比较,其关键字和给定值都不相等,则 查找失败。
若要在顺序表上进行查找,其类型定义:
typedef int KeyType; //关键字类型
typedef struct
r[0].key=k;
if (i>0) return i; return -1; }/*seq_search*/
/*监视哨*/
/*查找成功*/
while (r[i]. key!=k) i--; /*元素比较*/ /*查找失败*/
算法效率分析:
(2)在平均情况下,假定各记录的查找机会均等, 即pi=1/n ,由于找第i个记录需要比较(n-i+1)次,
{ KeyType key; // other fields; //关键字 //其它数据项
} SSTable[MAXSIZE]
算法描述如下:
int Seq_Search(SSTable r,int n,KeyType k) {/*返回关键字等于k的元素在顺序表表r中的位置, n为表中元素的个数*/ int i; i=n;
二、散列函数的构造方法 1、除留余数法是最为简单常用的一种方法,它是以表长m来除关键字,取余数 作为散列地址,即 h(key) = key%m。该方法的关键就是选取m。m一般取为略大 于元素个数的第一个素数。
2、举例:如果给出一组数据(20,30,70,14,8,12,18,60,1,11),因为 一共10个数据,那么m应该选取为略大于10的素数11, 散列函数h(key) = key%11。
0 11
数据结构第8章查找
动态查找表
1 二叉排序树和平衡二叉树 二叉排序树或者是一颗空树,或者是具 有如下性质的二叉树: (1)若它的左子树非空,则左子树上所有 结点的值均小于根结点的值; (2)若它的右子树非空,则右子树上所有 结点的值均大于根结点的值; (3)其左右子树也是一颗二叉排序树。
43
33
37 37 51 43 33 41 67 40 67
int SearchBin(Seqlist S ,KeyType t) { int mid,low=0,high=S.size-1; while(low<=high) { mid=(low+high)/2; if(t.key==S.list[mid].key) return mid; else if(t.key>S.list[mid].key) low=mid+1; else high=mid-1; } return -1; }
1 43
2
23
37
1
51
1
20
1
30
1
41
1
49
1
67
B-树上的结点可以含有m-1个关键字和m 个指针,查找过程:将数据元素关键字 和跟结点的若干个关键字逐个进行比较, 如果相等,则查找成功返回;否则,将 沿着指针继续查找下层结点。
B-树的生成从空树开始,逐个插入关键 字得到。 根据B-树的特点,其关键字的个数必须 至少为m /2-1,但又不能超过m-1。 每次插入时总是根据其大小在最底层某 个叶子结点上添加一个关键字,如果该 结点的关键字个数小于m-1,则直接插 入,如果发现新插入关键字后,关键字 总数超过m-1,则该结点必须分裂 。
二叉排序树的插入过程: 若二叉排序树非空,先将给定关键字和 根结点关键字进行比较,如果相等,则 停止插入操作并返回;否则,如果小于 根结点关键字,则在左子树上搜得合适 位置插入该元素;如果大于根结点关键 字,则在右子树上搜得合适位置插入该 元素。
数据结构之查找课件PPT课件
索引表的定义
struct indexterm {
keytype key; int low, high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
int blksearch (sqlist r, index idx, int k, bn)
{
/*bn为块的个数*/
int i, j, mid, low=1, high=bn, find=0;
while (low<=high && !find)
{
➢ 顺序查找的优点是算法简单、适应面广,且 不要求表中数据有序。缺点是平均查找长度 较大,特别是当n较大时,查找效率较低, 不宜采用。
2.折半查找
➢ 折半查找又称二分查找(Birary search)。 ➢ 假设记录在查找表R[1…n]中按关键字排列有
序。首先用k与查找表中间元素的关键字比 较,。。。。。。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
➢ 顺序查找的线性表定义如下:
Typedef struct rectype {
keytype key; itemtype item1 …… }rectype;
➢ 比较结果有三种可能:
⑴ 如果r[m].key>k,说明如果存在欲查找的元素, 该元素一定在数组的前半部分,查找范围缩小了 一半,修改查找范围的的上界high=m-1,继续对 数组的前半部分进行二分查找;
数据结构课件-查找
(2)输入一组数据元素的序列,构造二叉排序树的算法
void Creat BST( BiTree &T ) { int x; BiTree S; T=NULL; while ( scanf (“%d”,&x), x!=0 ) { S = (BiTNode *) malloc(sizeof(BitNode)); S->data.key = x; S->lchild = NULL; S->rchild = NULL; Insert_BST( T,S ); } return; }
9.2.1二叉排序树 ( Binary Sort Tree )
定义
二叉排序树(二叉查找树)或者是一棵空树,或者是具 有下列性质的二叉树:
▪ 每个结点都有一个作为查找依据的关键字(key),所 有结点的关键字互不相同。
▪ 左子树(若非空)上所有结点的关键字都小于根结点的 关键字。
▪ 右子树(若非空)上所有结点的关键字都大于根结点的 关键字。
3) 二叉排序树上插入结点的算法
(1)在二叉排序树上插入一个结点的算法; (2)依次输入一组数据元素,并插入到二叉排
序树中的算法
(1)将指针S所指的结点插入到根结点指针为T的
二叉排序树中的算法
void Insert_BST( BiTree &T, BiTree S ) { BiTree p, q;
{ mid = (low+high)/2; if (IT[mid].Maxkey>=key)) high=mid-1; else low=mid+1; }
i=IT[low].next; ST.ele[0].key = key; If(low!=BLOCK_NUM) p=IT[low+1].next; else p=ST.length+1; while(ST.elem[i%p].key != key ) i++ ; return( struct{ ElemType *elem; int length; } SSTable;
数据结构-第8章-查找(作业)PPT课件
-
25
第8章 查找
40 -1
25 -1
60 -1
0
0
30 50
70 -1
0 80
(a) 一棵平衡二叉排序树
40 -1
25 0
50 -2
0
0
20
30
60 1
58 0 (b) 一棵失去平衡的二叉排序树
图8.7 平衡与不平衡的二叉排序树
-
26
第8章 查找
已知一棵平衡二叉排序树如图8.9(a)所示。在A的左子树 的左子树上插入15后,导致失衡,如图8.9(b)所示。为恢复 平衡并保持二叉排序树的特性,可将A改为B的右子,B原来 的右子改为A的左子,如图8.9(c)所示。这相当于以B为轴, 对A做了一次顺时针旋转。
图8.2 分块查找法示意图
-
11
第8章 查找
分块查找的基本过程如下:
(1) 首先将待查关键字K与索引表中的关键字进行比较, 以确定待查记录所在的块。具体的可用顺序查找法或折半查 找法进行。
(2) 用顺序查找法在相应块内查找关键字为K的元素。
例如,在上述索引顺序表中查找36。首先,将36与索引
表中的关键字进行比较,因为25<36≤58,所以36在第二个块
顺序查找法的过程是:从表中最后一个记录开始,逐个进 行记录的关键字和给定值的比较,若某个记录的关键字和给定 值比较相等,则查找成功,否则查找失败。存储结构通常为顺 序结构,也可为链式结构。
-
4
第8章 查找
//静态查找表的顺序存储结构 typedef struct {
ElemType *elem; //数据元素存储空间基址,建 //表时按实际长度分配,0号单元留空
-
数据结构chapter 8 查找.ppt
21-Jan-20
20
二叉判定树
折半查找过程可以用一棵二叉树来表示。 树中的每个结点表示查找表中的一个记录 结点的值表示该记录在查找表中的位置 通常情况下称这个描述查找过程的二叉树为二叉判定树。
6
3 1
2
4 5
9 7
8
10 11
21-Jan-20
21
二叉判定树分析(查找成功)
由二叉判定树可见,成功查找结点的过程就是从根结点到树中某 个结点的路径,比较的次数是该结点在二叉判定树上的层次。
折半查找法在查找不成功时和给定值进行比较的次数最多为
log
n 2
1
6
3
9
1
4
7
10
-1
2
3-4
5
6-7
8
9-10
11
1-2
2-3
4-5
5-6
7-8
8-9
10-11
11-
21-Jan-20
23
折半查找的平均查找长度
假定有序表的长度为 n,n=2h-1,h为树的最大深度
由于第j层上的节点数目为 2j-1,这些节点只需要比较j 次
动态查找表的突出特征在于:表的内容本身就是在查 找过程中动态生成的。
对于给定的值key,如果在表中存在关键字等于key记 录,则查找成功,否则就插入关键字等于key的记录。
21-Jan-20
21-Jan-20
4
如何进行查找?
查找过程依赖于数据元素在查找表中的位置。 具体采用什么样的查找方法完全取决于查找表中数据
元素是根据何种关系来组织的。
21-Jan-20
数据结构C语言版第八章 查找
第八章查找重点难点要求理解"查找表"的结构特点以及各种表示方法的适用性;熟练掌握顺序查找和折半查找的方法;熟悉描述折半查找过程的判定树的构造方法;熟练掌握二叉排序树的构造和查找方法;理解二叉平衡树的构造过程;理解B-和B+树的特点、基本操作和二者的区别。
熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别;掌握各种不同查找方法之间的区别和各自的适用情况,能按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。
典型例题1.若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:(1)查找不成功,即表中无关键字等于给定值K的记录;(2)查找成功,即表中有关键字等于给定值K的记录。
【解】查找不成功时,需进行n+1次比较才能确定查找失败。
因此平均查找长度为n+1,这时有序表和无序表是一样的。
查找成功时,平均查找长度为(n+1)/2,有序表和无序表也是一样的。
因为顺序查找与表的初始序列状态无关。
2.画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数。
【解】等概率情况下,查找成功的平均查找长度为:ASL=(1+2*2+3*4+4*8+5*3)/18=3.556查找失败时,最多的关键字比较次树不超过判定树的深度,此处为5.3.为什么有序的单链表不能进行折半查找?【解】因为链表无法进行随机访问,如果要访问链表的中间结点,就必须先从头结点开始进行依次访问,这就要浪费很多时间,还不如进行顺序查找,而且,用链存储结构将无法判定二分的过程是否结束,因此无法用链表实现二分查找。
4.设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。
此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?【解】此命题正确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对查找表进行的操作
1)查询某个”特定的” 数据元素是否在查找表 中 2)检索某个”特定的”数据元素的各种属性 3)在查找表中插入一个数据元素 4)从查找表中删除数据元素
查找表可分为两类: 查找表可分为两类
静态查找表
仅作查询和检索操作的查找表。
动态查找表
有时在查询之后,还需要将“查询” 结果为“不在查找表中”的数据元素插 入到查找表中;或者,从查找表中删除 其“查询”结果为“在查找表中”的数 据元素。
8.2 基于线性表的查找法
具有顺序查找法、 具有顺序查找法、折半查找法和分块 顺序查找法 查找法三种 查找法三种 8.2.1顺序查找法 顺序查找法 顺序查找法的特点 特点是 顺序查找法的特点是:用所给关键字 与线性表中各元素的关键字逐个比较, 与线性表中各元素的关键字逐个比较, 直到成功或失败。 直到成功或失败。
平均查找长度: 平均查找长度:为确定数据元素在列表 中的位置, 中的位置,需和给定值进行比较的关键 字个数的期望值, 字个数的期望值,称为查找算法在查找 成功时的平均查找长度。 成功时的平均查找长度。 对于长度为n的列表 的列表, 对于长度为 的列表,查找成功时的平均 查找长度为: 查找长度为:
ASL=P1C1+ P2C2+…+ PnCn = ∑ni=1PiCi
21
56
45
33
55
25
17
int Locate(SeqList L,ElemType e) { i=0 ; /*i为扫描计数器,初值为0,即 从第一个元素开始比较*/ while ((i<=st)&&(L.elem[i]!=e) ) i++; /*顺序扫描表,直到找到值为e 的元素,或扫描到表尾而没找到*/ if (i<=st) return(i+1); /*若找到值为e的元素,则返回其序号*/ else return(-1); /*若没找到,则返回空序号*/ }
55
21
56
45
33
55
25
17
设置监视哨的顺序查找算法 int SeqSearch(RecordList l, KeyType k) ( ) /*在顺序表 中顺序查找其关键字等于 的元素,若找到, 在顺序表l中顺序查找其关键字等于 的元素, 在顺序表 中顺序查找其关键字等于k的元素 若找到, 则函数值为该元素在表中的位置,否则为0*/ 则函数值为该元素在表中的位置,否则为 { l.r[0].key=k; i=l.length; while (l.r[i].key!=k) i--; return(i); () } 其中l.r[0]为监视哨,可以起到防止越界的作用 为监视哨, 其中 为监视哨
35
46
58
60
low=10 6 12 15 18 22 25 28 35 46
mid=10 high=11 58 60
high=9 low=10
折半查找的算法如下: 折半查找的算法如下:
int BinSrch (SqList l, KeyType k)/*在有序表 中折半查找其关键 在有序表l中折半查找其关键 ) 在有序表 字等于k的元素 若找到,则函数值为该元素在表中的位置*/ 的元素, 字等于 的元素,若找到,则函数值为该元素在表中的位置 { low=1 ; high=l.length; /*置区间初值 置区间初值*/ 置区间初值 while ( low<=high) { mid=(low+high) / 2; if (k==l.r[mid]. key) return(mid); /*找到待查元素 找到待查元素*/ ( ) 找到待查元素 else if (k<l.r[mid]. key) high=mid-1;/*未找到,则继续在前半区间进行查找 未找到, 未找到 则继续在前半区间进行查找*/ else low=mid+1; /*继续在后半区间进行查找 继续在后半区间进行查找*/ 继续在后半区间进行查找 } return (0); }
其中P 为查找列表中第i个数据元素的概 其中 i为查找列表中第 个数据元素的概 率,Ci为找到列表中第i个数据元素时, 为找到列表中第 个数据元素时, 个数据元素时 已经进行过的关键字比较次数。 已经进行过的关键字比较次数。
如何进行查找? 如何进行查找? 取决于查找表的结构。 取决于查找表的结构。 然而,查找表本身是一种很松散的结构,因此, 然而,查找表本身是一种很松散的结构,因此,为了 提高查找的效率, 提高查找的效率,需要在查找表中的元素之间人为地 附加某种确定的关系,换句话说, 附加某种确定的关系,换句话说,用另外一种结构来 表示查找表。 表示查找表。 讨论:查找表的表示方法和 讨论:查找表的表示方法和在该查找表下进行的各种 操作 查找的基本方法可以分为两大类,即比较式查找法 比较式查找法和 查找的基本方法 比较式查找法 计算式查找法。 计算式查找法 比较式查找法又可以分为基于线性表的查找法 基于 基于线性表的查找法和基于 比较式查找法 基于线性表的查找法 树的查找法 计算式查找法也称为hash哈希查找法 计算式查找法 哈希查找法
例如用折半查找法查找10、 的具体过程 的具体过程, 例如用折半查找法查找 、50的具体过程,其中 mid=(low+high)/2,当high<low时,表示不存在这 , 时 样的子表空间,查找失败。 样的子表空间,查找失败。 用折半查找法查找12的过程为 的过程为: 用折半查找法查找 的过程为:
用折半查找法查找50的过程为: 用折半查找法查找 的过程为: 的过程为
1
6 low=1 6 12 15 18 22
2
12
3
15
4
18
5
22
6
25 mid=6 25
7
28
8
35
9
46
10
58
11
60 high=11
28 low=7
35
46 mid=9
58
60 high=11
6
12
15
18
22
25
28
1
6 low=1 6 low=1 6 12 12 15 mid=3 15 18 18 22
2
12
3
15
4
18
5
22
6
25 mid=6 25
7
28
8
35
9
46
10
58
11
60 high=11
28
35
46
58
60
high=5 22 25 28 35 46 58 60
low=1 high=2 low=2 mid=2 high=2 mid=1
顺序结构有关数据类型的定义: 顺序结构有关数据类型的定义: #define LIST_SIZE 20 typedef struct { KeyType key; OtherType other_data; } RecordType; typedef struct { RecordType r[LIST_SIZE+1]; /* r[0]为工作单元 */ 为工作单元 int length; } RecordList;
21
56
45
33
55
25
17
不设置监视哨的顺序查找算法 int SeqSearch(RecordList l, KeyType k) ( )
/*不用监视哨法,在顺序表中查找关键字等于k的元素 不用监视哨法,在顺序表中查找关键字等于 的元素 的元素*/ 不用监视哨法 { i=l.length; while (i>=1&&l.r[i].key!=k) i--; if (i>=1) return(i) () else return (0); } 循环条件i>=1判断查找是否越界。 判断查找是否越界。 循环条件 判断查找是否越界
8.1 查找的基本概念
列表:由同一类型的数据元素(或记录) 列表:由同一类型的数据元素(或记录)构成的集 可利用任意数据结构实现。 合,可利用任意数据结构实现。 关键字:数据元素的某个数据项的值,用它可以标 关键字:数据元素的某个数据项的值, 识列表中的一个或一组数据元素。 识列表中的一个或一组数据元素。 主关键字:如果一个关键字可以唯一标识列表中的 主关键字:如果一个关键字可以唯一标识列表中的 唯一标识 一个数据元素,则称其为主关键字 为主关键字, 一个数据元素,则称其为主关键字,否则为次关键 当数据元素仅有一个数据项时, 字。当数据元素仅有一个数据项时,数据元素的值 就是关键字。 就是关键字。
第八章 查 找
8.1查找的基本概念 8.2基于线性表的查找法 8.3基于树的查找法 8.4计算式查找法-----哈希法
无法显示图像。计算机可能没有足够的内存以打开该 无法显示图像。计算机可能没有足够的内存以打开该图像,也可能是该图像已损坏。请重新启动计算机,然后重新打开该文件。如果仍然显示红色 “x”,则 图像,也可能是该图像已损坏。请重新启动计算机, 可能需要删除该图像,然后重新将其插入。 然后重新打开该文件。如果仍然显示红色 “x”,则可能 需要删除该图像,然后重新将其插入。1Fra bibliotek3 4
7
10
2
5
8
11
优点:比较次数少,查找速度快,平均性能好。 优点:比较次数少,查找速度快,平均性能好。 缺点:要求待查的表为有序表,且插入、删除困难。 缺点:要求待查的表为有序表,且插入、删除困难。
8.2.3 分块查找法
分块查找法要求将列表组织成以下索引顺序结构: 分块查找法要求将列表组织成以下索引顺序结构: ★首先将列表分成若干个块(子表)。一般情况下, 首先将列表分成若干个块( )。一般情况下 首先将列表分成若干个块 子表)。一般情况下, 块的长度均匀,最后一块可以不满。每块中元素任 块的长度均匀,最后一块可以不满。 意排列,即块内无序,但块与块之间有序。 意排列, 块内无序, 块与块之间有序。 ★构造一个索引表。其中每个索引项对应一个块并 构造一个索引表。 构造一个索引表 记录每块的起始位置,和每块中的最大关键字( 记录每块的起始位置,和每块中的最大关键字(或 最小关键字)。索引表按关键字有序排列。 )。索引表按关键字有序排列 最小关键字)。索引表按关键字有序排列。