数据结构C语言版第八章 查找

合集下载

数据结构课件第八章查找优秀课件

数据结构课件第八章查找优秀课件

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章 查找

数据结构 第8章 查找

2
5
8
11
注:判定树的形态只与表记录个数n有关,与记录的内容无关。
2013-7-28
int BinSearch(JD r[],int n,KeyType k) { int low,high,mid,found; low=1; high=n; found=0; while ((low<=high) && (found==0)) { mid=(low+high)/2; if(k>r[mid].key) low=mid+1; else if(k<r[mid].key) high=mid-1; else found=1; } if(found==1) return(mid); else return(0); }
2013-7-28
– 插入算法
例 {10, 18, 3, 8, 12, 2, 7, 3}
10
10
10
10
10
18
3
18
3 8
18
3
18
8 12
10 3 2 18 8 12 2 7 3
10 18 8 12 2 7 3 3
10 18 8 12
中序遍历二叉排序树可得到一个关键字的有序序列
2013-7-28
A[3]
A[6]
A[9]
A[12]
A[14]
A[17]
A[20]
A[4]
A[7]
A[10]
A[15]
A[18]
A[21]
2013-7-28
int BinSearch(JD r[], int low, int high, KeyType k) { int mid; if (low>hith) return -1; else { mid=(low+high)/2; if (k==r[mid].key) return mid; else if (k>r[mid].key) return (BinSearch(r,mid+1,high,k)); else return (BinSearch(r,low,mid-1,k)); } }

C语言数据结构:查找

C语言数据结构:查找
➢ 8.1 基本概念与术语 ➢ 8.2 静态查找表 ➢ 8.3 动态查找表 ➢ 8.4 哈希表查找 ➢ 8.5 小结与习题
2020年8月20日
1
本章主要内容
• 本章主要学习静态查找和动态查找方法。静态查
找包括顺序查找、二分查找和分块索引查找等, 动态查找包括二叉排序树、B树等。作为重点内 容本章还介绍了哈希查找及相关知识。
主关键字将能唯一确定一个数据元素(或记录) 的关键字。
查找表是由具有相同类型的数据元素(或记录) 组成的集合。分为静态查找表和动态查找表两大类。
如果查找表中能够找到满足条件的记录,称为查 找成功,否则称为查找不成功。
2020年8月20日
3
静态查找表:在对查找表进行操作时,不改变 表的结构,只进行查找操作;
找成功时
n
ASL= ∑ Pi*Ci
i=1
Pi为表中第i个数据元素的查找概率,Ci为表中
第i个数据元素的关键字与给定值x相等时,需要比较
的次数。
设查找表长度为n,查找元素x和表中第i个元素关
键字相等时,需要比较的次数为n-i+1,则平均查找
长度为:
n ASL= ∑ Pi*(n-i+1)
i=1
2020年8月20日
6 13 17 20 24 28 30 36 39 44 48 51 55
第一次 low=1
mቤተ መጻሕፍቲ ባይዱd=7
high=13
因x>30,下一步继续在右半区查找,即:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
6 13 17 20 24 28 30 36 39 44 48 51 55
例在给定的序列A={6,13,17,20,24,28, 30,36,39,44,48,51,55}中查找给定值13和52 这两个数据。

数据结构第8章查找

数据结构第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课件

数据结构之查找课件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,继续对 数组的前半部分进行二分查找;

数据结构chapter 8 查找.ppt

数据结构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

数据结构第八章 查找和排序

数据结构第八章 查找和排序
第八章 查找和排序
本章教学内容
8.1 静态查找表 8.2 动态查找表-二叉排序树 9.2 插入排序
9.2.1 直接插入排序 9.2.3 希尔排序
8.1 静态查找表
查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。由 于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵 便的结构。
• ma,5,25,8,50,30,40,20};
• int i,j,x;
• for(i=1;i<8;++i)
• { if (a[i]<a[i-1] )
•{
• x=a[i];

for(j=i-1; x<a[j] ;--j)

; // 记录后移

• a[j+1] =x; // 插入到正确位置
else return SearchBST(T->rchild,key); //在右子树中继续查找
} // SearchBST
二叉排序树的操作-插入 若二叉排序树为空,则插入结点应为根结点 否则,继续在其左、右子树上查找 ✓树中已有,不再插入 ✓树中没有,查找直至某个叶子结点的左 子树或右子树为空为止,则插入结点应 为该叶子结点的左孩子或右孩子
r[i] 初态:
0 1 2 3 4 5 6 7 8 9 10 49 38 65 97 76 13 27 49* 55 04
第1趟 (dk=5)
4193 3287 4695* 9575 7064 1439 2378 4695* 5957 0746
第2趟 (dk=3)
13 2074 49* 5358 0247 49 3585 65 97 76
(2) 若 *p是单支结点

数据结构授课教案-第8章查找

数据结构授课教案-第8章查找
return mid;
elseif(kx<tbl.elem[mid].key)
low=mid+1;
else
high=mid-1;
}
return 0;
}
【性能分析】
折半查找过程可用一棵判定树来描述。判定树中每一结点对应表中一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号。根结点对应当前区间的中间记录,左子树对应前一子表,右子树对应后一子表。


折半查找的算法和分析;二叉排序树的插入和删除;平衡二叉树的平衡化方法;B-树的插入和删除方法;哈希表的构造方法。
作业布置
习题9
参考书
1.数据结构题集(C语言版),严蔚敏,清华大学出版社,2002。
3. 数据结构、算法与应用-C++语言描述,(美)SartajSahni著,汪诗林等译,机械工业出版社,2002。
本章以后讨论中,涉及的关键码类型和数据元素类型统一说明如下:
typedefstruct{
KeyTypekey;/*关键码字段,可以是整型、字符型、构造型等*/
……/*其它字段*/
}ElemType;
9.2静态查找表
9.2.1静态查找表结构
静态查找表是数据元素的线性表,可以是基于数组的顺序存储或以线性链表存储。
二叉排序树(查找表)的类型定义:
typedefintKeyType;//设关键字的类型可直接进行比较
typedefstructnode {
KeyTypekey ; /*关键字的值*/
……/*其它字段的值*/
structnode*lchild,*rchild;/*左右指针*/
}BitNode,*BiTree;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章查找重点难点要求理解"查找表"的结构特点以及各种表示方法的适用性;熟练掌握顺序查找和折半查找的方法;熟悉描述折半查找过程的判定树的构造方法;熟练掌握二叉排序树的构造和查找方法;理解二叉平衡树的构造过程;理解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.设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。

此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?【解】此命题正确。

假设最小元有左孩子,则根据二叉排序树性质,此左孩子应比最小元更小,如此一来就产生矛盾了,因此最小元不可能有左孩子,对于最大元也是这个道理。

但最大元和最小元不一定是叶子,它也可以是根、内部结点(分支结点)等,这得根据插入结点时的次序而定。

新结点总是作为叶子插入在二叉排序树中的。

5.在一棵m阶的B-树中,当将一关键字插入某结点而引起该结点的分裂时,此结点原有多少个关键字?若删去某结点中的一个关键字,而导致结点合并时,该结点中原有几个关键字?【解】在一棵m阶的B-树中,若由于一关键字的插入某结点而引起该结点的分裂时,则该结点原有m-1个关键字。

若删去某结点中一个关键字而导致结点合并时,该结点中原有┌m/2┐-1个关键字。

6.设散列表长度为11,散列函数h(x)=x%11,给定的关键字序列为:1,13,13,34,38,33,27,22.试画出分别用拉链法和线性探查法解决冲突时所构造的散列表,并求出在等概率情况下,这两种方法查找成功和失败时的平均查找长度。

请问装填因子的值是什么?答:(1)拉链法如下图:T[0..10]┌──┐0││→ 33 → 22 →∧├──┤1││→ 1 → 12 →34→ ∧├──┤2││→ 13 →∧├──┤3│ ∧ │├──┤4│ ∧ │├──┤5││→ 38 → 27 →∧├──┤6│ ∧ │├──┤7│∧ │├──┤8│ ∧ │├──┤9│ ∧ │├──┤10│ ∧ │└──┘(2)线性探查法如下图:下标 0 1 2 3 4 5 6 7 8 9 10┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐T[0..10]│33│1 │13│12│34│38│27│22││││└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘探查次数 1 1 1 3 4 1 7 8用拉链法的查找成功平均查找长度为:ASLsucc=(1*4+2*3+3*1)/8=1.625查找失败时平均查找长度为:ASLunsucc=(2+3+1+0+0+0+2+0+0+0+0)/11=0.73用线性探查法查找成功时平均查找长度为:ASLsucc=(1+1+1+3+4+1+7+8)/8=3.25查找失败时平均查找长度为:ASLunsucc=(9+8+7+6+5+4+3+2+1+1+1)/11=4.3装填因子α拉链=4/11=0.36 α线性探查=8/11=0.737.试写一算法判别给定的二叉树是否为二叉排序树,设此二叉树以二叉链表为存储结构,且树中结点的关键字均不相同。

【解】由二叉排序树的定义可得:二叉排序树中左子树的所有结点的值都小于根结点的值,所有右子树中结点的值都大于根结点的值。

那么只要对待判定的二叉树中的结点按层遍历并判断即可。

在该算法中要用到队列保存已遍历的结点指针。

typedef BinTNode *DataType;//循环队列中元素为二叉树结点指针int BinSortStree(BinTree T){CirQueue Q;BinTNode *p;if (!T) return 1;//空树为二叉排序树InitQueue(&Q);EnQueue(&Q,T);while(!QueueEmpty(&Q)){p=DeQueue(&Q);if (p->lchild)if (p->data<p->lchild->data) return -1;//不是二叉排序树else EnQueue(&Q,p->lchild);if (p->rchild)if (p->data>p->rchild->data) return -1;//不是二叉排序树else EnQueue(&Q,p->rchild);}return 1;//是二叉排序树}8.试写一递归算法,从大到小输出二叉排序树中所有其值不小于x的关键字。

要求算法的时间为O(lgn+m),n为树中结点数,m为输出关键字个数(提示:先遍历右子树,后遍历左子树)。

typedef int KeyType; //假定关键字类型为整数typedef struct node { //结点类型KeyType key; //关键字项InfoType otherinfo; //其它数据域,InfoType视应用情况而定,下面不处理它struct node *lchild,*rchild; //左右孩子指针} BSTNode;typedef BSTNode *BSTree;void OUTPUTNODE(BSTree T,KeyType x){//从大到小输出二叉排序树中所有其值不小于x的关键字if (T){OUTPUTNODE( T->rchild,x);if (T->key>=x) printf("%d",T->key);OUTPUTNODE( T->Lchild,x);}}习题精选1.选择题(1)对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。

A.(n-1)/2 B.n/2 C.(n+1)/2D.n(2)适用于折半查找的表的存储方式及元素排列要求为()。

A.链接方式存储,元素无序B.链接方式存储,元素有序C.顺序方式存储,元素无序D.顺序方式存储,元素有序(3)当在一个有序的顺序表上查找一个数据时,既可用折半查找,也可用顺序查找,但前者比后者的查找速度()。

A.必定快B.不一定C.在大部分情况下要快D.取决于表递增还是递减(4)折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。

A.20,70,30,50 B.30,88,70,50C.20,50 D.30,88,50(5)对22个记录的有序表作折半查找,当查找失败时,至少需要比较()次关键字。

A.3 B.4 C.5 D.6(6)折半搜索与二叉排序树的时间性能()。

A.相同B.完全不同C.有时不相同D.数量级都是O(log2n) (7)分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()。

A.(100,80,90,60,120,110,130)B.(100,120,110,130,80,60,90)C.(100,60,80,90,120,110,130)D.(100,80,60,90,120,130,110)(8)在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作()型调整以使其平衡。

A.LL B.LR C.RL D.RR(9)下列关于m阶B-树的说法错误的是()。

A.根结点至多有m棵子树B.所有叶子都在同一层次上C.非叶结点至少有m/2 (m为偶数)或m/2+1(m为奇数)棵子树D.根结点中的数据是有序的(10)下面关于B-和B+树的叙述中,不正确的是()。

A.B-树和B+树都是平衡的多叉树B.B-树和B+树都可用于文件的索引结构C.B-树和B+树都能有效地支持顺序检索D.B-树和B+树都能有效地支持随机检索(11)m阶B-树是一棵()。

A.m叉排序树B.m叉平衡排序树C.m-1叉平衡排序树D.m+1叉平衡排序树(12)下面关于哈希查找的说法,正确的是()。

A.哈希函数构造的越复杂越好,因为这样随机性好,冲突小B.除留余数法是所有哈希函数中最好的C.不存在特别好与坏的哈希函数,要视情况而定D.哈希表的平均查找长度有时也和记录总数有关(13)下面关于哈希查找的说法,不正确的是()。

A.采用链地址法处理冲突时,查找一个元素的时间是相同的B.采用链地址法处理冲突时,若插入规定总是在链首,则插入任一个元素的时间是相同的C.用链地址法处理冲突,不会引起二次聚集现象D.用链地址法处理冲突,适合表长不确定的情况(14)设哈希表长为14,哈希函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的元素加到表中,用二次探测法解决冲突,则放入的位置是()。

A.8 B.3 C.5 D.9 (15)采用线性探测法处理冲突,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字( )。

A.不一定都是同义词B.一定都是同义词C.一定都不是同义词D.都相同2.应用题(1)假定对有序表:(3,4,5,7,24,30,42,54,63,72,87,95)进行折半查找,试回答下列问题:①画出描述折半查找过程的判定树;②若查找元素54,需依次与哪些元素比较?③若查找元素90,需依次与哪些元素比较?④假定每个元素的查找概率相等,求查找成功时的平均查找长度。

相关文档
最新文档