数据结构课件第八章查找优秀课件
合集下载
数据结构部分(查找)课件
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)从查找表中删去某个数据元素。
• 根据动态查找表的定义,“插入”操 作在查找不成功时才进行;
• 若二叉排序树为空树,则新插入的 结点为新的根结点;否则,新插入 的结点必为一个新的叶子结点,其 插入位置由查找过程得到。
数据结构课件-第八章
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).ppt
这样通过一趟处理,把待排序记录分成以支点记录 为界的独立的两部分,前面部分记录关键字小于支点记 录关键字,后面部分记录关键字大于支点记录关键字。 然后再按上面方式对每一部分进行同样的分割排序,以 达到整个序列有序(直到每一部分的记录数为1为止)。 快速排序是采用二分法的思想进行排序的方法。 快速排序也是一种交换排序。
冒泡排序算法描述
viod Bubblesort(Sqlist *L) { ElemType temp; int i,j,flag for (i= L->length-1;i>0; --i) { flag=0; for (j=0;j<i;++j) if (L->data[j].key>L.data[j+1].key) { temp=L->data[j];L->data[j]=L->data[j+1]; L->data[j+1]=temp; //交换数据元素 flag=1; //置标识 } if (!flag) break; } }
冒泡排序(续1)
结束标志:若某遍处理无数据交换,说明已排序 好,可提前结束。 若为正序,则只需进行一趟排序,只进行n-1次关 键字比较,无记录移动。 若为逆序,则需进行n-1趟排序,需进行n(n-1)/2次 比较,并做等数量级的记录移动,算法时间复杂度为 O(n2)。 算法中可设置一标志变量flag,每一遍处理开始时, 令其为0,该遍若有数据交换,则置成1。
直接插入排序--算法分析
空间分析:需要一个记录的辅助空间。 时间分析: 1、若记录关键字已按非递减排列,每趟排序插入,只需 进行一次关键字比较,则总的比较次数为n-1。算法时间复杂 度为O(n)。 2、若关键字已按非递增排列,则对第i个记录进行查找插 入时,要比较i次,移动i+1个记录。则总的比较次数为: ∑i=(n+2)(n-1)/2=(n2+n-2)/2 (i=2..n) 移动记录数为∑(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2 平均比较次数=((n2+n-2)/2+n-1)/2=n2/4+3n/4-1≈n2/4 平均移动次数=((n2+3n-4)/2)/2 =n2/2+7n/2-1≈n2/2 则直接插入排序的时间复杂度为O(n2) 直接插入排序为稳定排序。
冒泡排序算法描述
viod Bubblesort(Sqlist *L) { ElemType temp; int i,j,flag for (i= L->length-1;i>0; --i) { flag=0; for (j=0;j<i;++j) if (L->data[j].key>L.data[j+1].key) { temp=L->data[j];L->data[j]=L->data[j+1]; L->data[j+1]=temp; //交换数据元素 flag=1; //置标识 } if (!flag) break; } }
冒泡排序(续1)
结束标志:若某遍处理无数据交换,说明已排序 好,可提前结束。 若为正序,则只需进行一趟排序,只进行n-1次关 键字比较,无记录移动。 若为逆序,则需进行n-1趟排序,需进行n(n-1)/2次 比较,并做等数量级的记录移动,算法时间复杂度为 O(n2)。 算法中可设置一标志变量flag,每一遍处理开始时, 令其为0,该遍若有数据交换,则置成1。
直接插入排序--算法分析
空间分析:需要一个记录的辅助空间。 时间分析: 1、若记录关键字已按非递减排列,每趟排序插入,只需 进行一次关键字比较,则总的比较次数为n-1。算法时间复杂 度为O(n)。 2、若关键字已按非递增排列,则对第i个记录进行查找插 入时,要比较i次,移动i+1个记录。则总的比较次数为: ∑i=(n+2)(n-1)/2=(n2+n-2)/2 (i=2..n) 移动记录数为∑(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2 平均比较次数=((n2+n-2)/2+n-1)/2=n2/4+3n/4-1≈n2/4 平均移动次数=((n2+3n-4)/2)/2 =n2/2+7n/2-1≈n2/2 则直接插入排序的时间复杂度为O(n2) 直接插入排序为稳定排序。
数据结构-第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
《数据结构的第八讲》PPT课件
13
图的定义
路径长度: 非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。
A
从A到F长度为 3 的路径
B
E {A,B,C,F}
CF
精选ppt
14
图的定义
连通图与连通分量:
在无向图中, 若从顶点v1到顶点v2有路径, 则称顶 点v1与v2是连通的。
如果图中任意一对顶点都是连通的, 则称此图是连 通图。
构造器方法重新构建了顶点数组和在常量 NUMVERTICES中指定数值的邻接矩阵。
既然数组是基于零的,所以数据成员 numVerts存储着 顶点列表内当前的数量以便于把列表初始设置为 0。
AddVertex方法会为顶点标签取走一个字符串参数,实 例化一个新的 Vertex对象,并且把它添加到顶点数组 内。
精选ppt
22
8.2 图的存储表示
精选ppt
23
邻接矩阵(Adjacency Matrix)
在图的邻接矩阵表示中,有一个记录各个顶点 信息的顶点表,还有一个表示各个顶点之间关 系的邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图, 图的邻 接矩阵是一个二维数组 A.edge[n][n],
(vi, vp1)、(vp1, vp2)、...、(vpm, vj) 应是属于E的边。
精选ppt
8
图的定义
路径的长度:
从路径中第一个顶点到最后一个顶点的边 的数量。
讨论的图对象的限制 : (1) 自身环 不讨论.
0
1
(2) 与两个特定顶点相关联的边不
能多于一条,多重图也不讨论。
1
0 2
精选ppt
9
图中,边必须是不同的。
数据结构查找PPT培训课件
high=mid-1; else low=mid+1;} return -1; }
递归:
bin_search(st[],key,l,h) { if(l<=h) { mid=(l+h)>>1; if( st[mid] = = key) return mid; else if(st[mid]>key) return bin_search(st,key,l,mid-1); else return bin_search(st,key,mid+1,h) } else return -1; }
low
mid
high
bin_search(st[],key,n) { low=0; high=n-1; while(low<=high){ mid=(low+high)/2;
mid=(low+high)>>1; if( st[mid] = = key)
return mid; else if(st[mid]>key)
search1(st,key,n) { st[0]=key; i=n; while(st[i]!=key) i- -; return i; //查找返回序号,0为不成功 }
算法主要时间在循环,为减少判定,n个数据用容量为n+1的 一维数组表示。st[1]到st[n]存储数据,st[0]作为监视哨
顺序查找的平均时间为表长的一半。 2、顺序有序表的查找——— 二分(折半)查找
8.2 动态查找
8. 2.1 二叉排序树和二叉平衡树 一、二叉排序树
1 二叉排序树定义 二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具 有下列性质的二叉树: (1)若左子树不空,则左子树中所有结点的值均小于它的 根结点的值; (2)若右子树不空,则右子树中所有结点的值均大于它的 根结点的值; (3)左、右子树也分别为二叉排序树;
递归:
bin_search(st[],key,l,h) { if(l<=h) { mid=(l+h)>>1; if( st[mid] = = key) return mid; else if(st[mid]>key) return bin_search(st,key,l,mid-1); else return bin_search(st,key,mid+1,h) } else return -1; }
low
mid
high
bin_search(st[],key,n) { low=0; high=n-1; while(low<=high){ mid=(low+high)/2;
mid=(low+high)>>1; if( st[mid] = = key)
return mid; else if(st[mid]>key)
search1(st,key,n) { st[0]=key; i=n; while(st[i]!=key) i- -; return i; //查找返回序号,0为不成功 }
算法主要时间在循环,为减少判定,n个数据用容量为n+1的 一维数组表示。st[1]到st[n]存储数据,st[0]作为监视哨
顺序查找的平均时间为表长的一半。 2、顺序有序表的查找——— 二分(折半)查找
8.2 动态查找
8. 2.1 二叉排序树和二叉平衡树 一、二叉排序树
1 二叉排序树定义 二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具 有下列性质的二叉树: (1)若左子树不空,则左子树中所有结点的值均小于它的 根结点的值; (2)若右子树不空,则右子树中所有结点的值均大于它的 根结点的值; (3)左、右子树也分别为二叉排序树;
《数据结构教学课件》第08章.ppt
DE F
G
HI
双亲孩子表示法存储结构
(4)孩子兄弟表示法
root
A∧
B
C∧
14 of 118
A
B
C
DE F
G
HI
∧D
E
∧F∧
∧G ∧
∧H
∧I ∧
常规指针的孩子兄弟表示法
15 of 118
8.2 二叉树
1.二叉树的定义
二叉树:是n(n≥0)个结点的有限集合。n=0的树称为空 二叉树;n>0的二叉树由一个根结点以及两棵互不相交 的、分别称为左子树和右子树的二叉树组成 。
逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点); ② 左子树和右子树次序不能颠倒。所以下面是两棵不同
的树
16 of 118
A
B
C
A
B
C
D
左子树
G
E
F
D
E
F
G 右子树
满二叉树:在一棵二叉树中,如果所有分支结点都存在左 子树和右子树,并且所有叶子结点都在同一层上,这样的 二叉树称为满二叉树。
完全二叉树:如果一棵深度为k,有n个结点的二叉树结构与
深度为k的满二叉树的前n个结点的结构相同,那么该二叉树
称为完全二叉树。如下图所示
A
B
C
D
E
F
G
H I J K L MN O
17 of 118
A
B
C
D
E
F
G
H IJ
(b)完全二叉树
(a)满二叉树
问题:一个深度为h的完全二叉 树最多有多少个结点?最少有 多少个结点?
数据结构 第08章 课件
删除边(i,j);
(7)Degree(i)
返回顶点i的度;
(8)InDegree(i) 返回顶点i的入度;
(9)OnDegree(i) 返回顶点i的出度;
} ADT Graph
8.1图的基本概念
8.2 图的基本运算
8.5生成树与最小生成树
8.3 图的基本存储结构 8.5.1最小生成树定义
8.3.1 邻接矩阵及其实现 8.5.2 最小生成树的普利姆算法
例:图8-2
v1
v1
v2
v3
v2
v3
v4
v4
(a)无向完全图G3(b)有向完全图G4
图8.2所示的G3与G4分别是具有4个顶点的无向 完全图和有向完全图。图G3共有4个顶点6条边;图 G4共有4个顶点12条边。
若(vi,vj)是一条无向边,则称顶点vi和vj互为 邻接点 。
若<vi,vj>是一条有向边,则称vi邻接到vj,或vj 邻接于vi,并称有向边<vi,vj>关联于vi与vj,或称有 向边<vi,vj>与顶点vi和vj相关联。
V2
V3
通常,也将图G的顶点集和边集分别记为V(G) 和E(G)。E(G)可以是空集,若E(G)为空, 则图G只有顶点而没有边。
若图G中的每条边都是有方向的,则称G为有向 图。在有向图中,一条有向边是由两个顶点组成的有 序对,有序对通常用尖括号表示。例如,有序对<vi, vj>表示一条由vi到vj的有向边。有向边又称为弧,弧 的始点称为弧尾,弧的终点称为弧头。若图G中的每 条边都是没有方向的,则称G为无向图。无向图中的 边均是顶点的无序对,无序对通常用圆括号表示。例 如,(vi,vj)表示无向图中的一条无向边。
数据结构PPT第八章 查找
数 据 结 构与算法
主讲人: 主讲人: 杜洪波
沈阳工业大学
数
据
结
构
与
算
法
数据结构课程的内容
沈阳工业大学
数
据
结
构
与
算
法
第9章 查找
一、教学内容: 教学内容:
1、 2、 3、 线性表的查找; 线性表的查找; 树表查找; 树表查找; 哈希表查找。 哈希表查找。
二、教学要求: 教学要求:
1、熟练掌握顺序表和有序表的查找算法及其性能分析方法; 熟练掌握顺序表和有序表的查找算法及其性能分析方法; 2、熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 3、理解AVL树的维护平衡方法; 理解AVL树的维护平衡方法; AVL树的维护平衡方法 4、理解B_树、B+的特点、查找及构造方法; 理解B_树 B+的特点、查找及构造方法; B_ 的特点 5、熟练掌握哈希函数的构造及解决冲突的方法。 熟练掌握哈希函数的构造及解决冲突的方法。 沈阳工业大学
( 预先确定的记录的某种标志 )
主关键字 ——可以唯一标识一个记录的关键字 可以唯一标识一个记录的关键字 可以唯一 次关键字 ——识别若干记录的关键字 识别若干记录的关键字
沈阳工业大学
例如“学号” 例如“学号”
例如“ 例如“女” 构 与 算 法
数
据
结
讨论:
(1)查找的过程是怎样的? )查找的过程是怎样的?
沈阳工业大学
数
据
结
构
与
算
法
8.2 静态查找表
静态查找表的抽象数据类型参见教材P216。 。 静态查找表的抽象数据类型参见教材 针对静态查找表的查找算法主要有: 针对静态查找表的查找算法主要有: 一、顺序查找(线性查找) 顺序查找(线性查找) 二、折半查找(二分或对分查找) 折半查找(二分或对分查找) 三、静态树表的查找 四、分块查找(索引顺序查找) 分块查找(索引顺序查找)
主讲人: 主讲人: 杜洪波
沈阳工业大学
数
据
结
构
与
算
法
数据结构课程的内容
沈阳工业大学
数
据
结
构
与
算
法
第9章 查找
一、教学内容: 教学内容:
1、 2、 3、 线性表的查找; 线性表的查找; 树表查找; 树表查找; 哈希表查找。 哈希表查找。
二、教学要求: 教学要求:
1、熟练掌握顺序表和有序表的查找算法及其性能分析方法; 熟练掌握顺序表和有序表的查找算法及其性能分析方法; 2、熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 3、理解AVL树的维护平衡方法; 理解AVL树的维护平衡方法; AVL树的维护平衡方法 4、理解B_树、B+的特点、查找及构造方法; 理解B_树 B+的特点、查找及构造方法; B_ 的特点 5、熟练掌握哈希函数的构造及解决冲突的方法。 熟练掌握哈希函数的构造及解决冲突的方法。 沈阳工业大学
( 预先确定的记录的某种标志 )
主关键字 ——可以唯一标识一个记录的关键字 可以唯一标识一个记录的关键字 可以唯一 次关键字 ——识别若干记录的关键字 识别若干记录的关键字
沈阳工业大学
例如“学号” 例如“学号”
例如“ 例如“女” 构 与 算 法
数
据
结
讨论:
(1)查找的过程是怎样的? )查找的过程是怎样的?
沈阳工业大学
数
据
结
构
与
算
法
8.2 静态查找表
静态查找表的抽象数据类型参见教材P216。 。 静态查找表的抽象数据类型参见教材 针对静态查找表的查找算法主要有: 针对静态查找表的查找算法主要有: 一、顺序查找(线性查找) 顺序查找(线性查找) 二、折半查找(二分或对分查找) 折半查找(二分或对分查找) 三、静态树表的查找 四、分块查找(索引顺序查找) 分块查找(索引顺序查找)
数据结构课件第8章
,操作系统中的可利用空间表属于这种类型。 若用户需求量为n,链表中仅有一块其容量m≥n,则分割 出大小为n的部分分配给用户,剩余大小为m-n的部分作为一 个结点留在链表中(只要把size改小就行)。 问题:若空闲块链表中有若干个大小不小于n的结点,该分配 哪一个?分配策略?
三种分配策略:首次拟合法;最佳拟合法;最差拟合法。
存储管理是一个既复杂而又重要的问 题。在后续课程——操作系统和编译技术 (或方法、原理)中,将对其作较深入的 研究。在数据库技术中,也涉及大量有关 存储管理的问题。本章仅就动态存储管理 方面的一些基本技术进行讨论。
返回目录
8.1 概述
● 动态存储管理的基本问题与解决途径 动态存储管理的基本问题
(1) 如何按用户提出的“请示”分配内存? (2) 如何回收那些用户不再使用而“释放”的内存,以 备新的“请示”产生时重新进行分配?
8.2 可利用空间表及分配方法
8.2.1 可利用空间表的结构形式 ● 结构形式二:建立若干个可利用空间表,同一链表中的结点
大小相同。不同链表中的结点大小,一般成倍数关系。
tag type link
示例2 有三种大小结点 (设结点大小分 别为2,4,8个字) 的可利用空间表 的结点结构及其 可利用空间表。
18,000
分配给用户的占用块
1 7,000
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 最佳拟合法:
从空闲块链表中找出能满足用户请求容 量的最小空闲块。 显然这是一种较好的方法,但为了满足某个请示分配,需要对 空闲块链表从头至尾扫描,时间开销大。 最佳空闲块 示例5 上例,若采用最佳拟合法,则可得
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 首次拟合法:
三种分配策略:首次拟合法;最佳拟合法;最差拟合法。
存储管理是一个既复杂而又重要的问 题。在后续课程——操作系统和编译技术 (或方法、原理)中,将对其作较深入的 研究。在数据库技术中,也涉及大量有关 存储管理的问题。本章仅就动态存储管理 方面的一些基本技术进行讨论。
返回目录
8.1 概述
● 动态存储管理的基本问题与解决途径 动态存储管理的基本问题
(1) 如何按用户提出的“请示”分配内存? (2) 如何回收那些用户不再使用而“释放”的内存,以 备新的“请示”产生时重新进行分配?
8.2 可利用空间表及分配方法
8.2.1 可利用空间表的结构形式 ● 结构形式二:建立若干个可利用空间表,同一链表中的结点
大小相同。不同链表中的结点大小,一般成倍数关系。
tag type link
示例2 有三种大小结点 (设结点大小分 别为2,4,8个字) 的可利用空间表 的结点结构及其 可利用空间表。
18,000
分配给用户的占用块
1 7,000
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 最佳拟合法:
从空闲块链表中找出能满足用户请求容 量的最小空闲块。 显然这是一种较好的方法,但为了满足某个请示分配,需要对 空闲块链表从头至尾扫描,时间开销大。 最佳空闲块 示例5 上例,若采用最佳拟合法,则可得
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 首次拟合法:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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. 顺序查找的基本思想
顺序查找是一种最简单的查找方法。其基本思想 是将查找表作为一个线性表,可以是顺序表,也可以 是链表,依次用查找条件中给定的值与查找表中数据 元素的关键字值进行比较,若某个记录的关键字值与 给定值相等,则查找成功,返回该记录的存储位置, 反之,若直到最后一个记录,其关键字值与给定值均 不相等,则查找失败,返回查找失败标志。
5 13 19 21 37 56 64 75 80 88 92
lowmid high
找70 例 1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low
mid
123456 7
5 13 19 21 37 56 64
high 8 9 10 11 75 80 88 92
数据结构课件第八章查找
7.1 基本概念 7.2 静态查找 7.3 动态查找 7.4 哈希表 7.5 应用举例
7.1 基本概念
查找表 用于查找的数据元素 若只对查找表进行如下两种操作: (1)在查找表中查看某个特定的数据元素是否在查找表中, (2)检索某个特定元素的各种属性,则称这类查找表为静 态查找表。静态查找表在查找过程中查找表本身不发生变 化。对静态查找表进行的查找操作称为静态查找。
查找表的存储结构 查找表是一种非常灵活的数据 结构,对于不同的存储结构,其查找方法不同。为了 提高查找速度,有时会采用一些特殊的存储结构。本 章将介绍以线性结构、树型结构及哈希表结构为存储 结构的各种查找算法。
查找算法的时间效率 查找过程的主要操作是关键 字的比较,所以通常以“平均比较次数”来衡量查找 算法的时间效率。
动态查找表 若在查找过程中可以将查找表中不存 在的数据元素插入,或者从查找表中删除某个数据元 素,则称这类查找表为动态查找表。动态查找表在查 找过程中查找表可能会发生变化。对动态查找表进行 的查找操作称为动态查找。
关键字 是数据元素中的某个数据项。唯一能标识 数据元素(或记录)的关键字,即每个元素的关键字 值互不相同,我们称这种关键字为主关键字;若查找 表中某些元素的关键字值相同,称这种关键字为次关 键字。例如,银行帐户中的帐号是主关键字,而姓名 是次关键字。
算法描述
找21 例 1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low
mid
123456 7 5 13 19 21 37 56 64
high
8 9 10 11 75 80 88 92
low
mid
high
1 2 3 4 5 6 7 8 9 10 11
查找 在数据元素集合中查找满足某种条件的数据 元素的过程称为查找。最简单且最常用的查找条件是 “关键字值等于某个给定值”,在查找表搜索关键字 等于给定值的数据元素(或记录)。若表中存在这样 的记录,则称查找成功,此时的查找结果应给出找到 记录的全部信息或指示找到记录的存储位置;若表中 不存在关键字等于给定值的记录,则称查找不成功, 此时查找的结果可以给出一个空记录或空指针。若按 主关键字查找,查找结果是唯一的;若按次关键字查 找,结果可能是多个记录,即结果可能不唯一。
}NodeType;
7.1 顺序查找 查找过程:从表的一端开始逐个进行记录的关键字和给定 值的比较
算法描述
例0 1 64 5
23456 13 19 21 37 56
找64 7 8 9 10 11 64 75 80 88 92
监视哨
ii
比较次数:
查找第n个元素: 1
查找第n-1个元素:2
……….
查找第1个元素: n
7.2 折半查找 查找过程:每次将待查记录所在区间缩小一半 适用条件:采用顺序存储结构的有序表 算法实现 设表长为n,low、high和mid分别指向待查元素所在区 间的上界、下界和中点,k为给定值 初始时,令low=1,high=n,mid=(low+high)/2 让k与mid指向的记录比较 若k==r[mid].key,查找成功 若k<r[mid].key,则high=mid-1 若k>r[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败
/* 顺序存储结构 */
typedef struct{
ElemType *elem;
/* 数组基址 */
int
length;
/* 表长度 */
}S_TBL;
/* 链式存储结构结点类型 */
typedef struct NODE{
ElemType elem;
/* 结点的值域 */
struct NODE *next;/* 下一个结点指针域 */