数据结构课件-第9章
合集下载
《数据结构》_第9章 图

int edges[MAXV][MAXV]; int vexnum,arcnum; VertexType vexs[MAXV];
} MGraph;
9.2.2
邻接表存储方法
图的邻接表存储方法是一种顺序分配与链式分配相结 合的存储方法。在邻接表中,对图中每个顶点建立一个单链 表,第i个单链表中的结点表示依附于顶点vi 的边(对有向图 是以顶点vi为尾的弧)。每个单链表上附设一个表头结点。 表结点和表头结点的结构如下: 表结点 advex nextarc info 表头结点
(2)在邻接表上查找相邻结点,找到后修改相应邻接矩阵元素 的值。算法如下: void ListToMat(ALGraph *G,MGraph &g) /*将邻接表G转换成邻接矩阵g*/ { int i,j,n=G->n;ArcNode *p; for (i=0;i<n;i++) /*g.edges[i][j]赋初值0*/ for (j=0;j<n;j++) g.edges[i][j]=0; for (i=0;i<n;i++) { p=G->adjlist[i].firstarc; while (p!=NULL) { g.edges[i][p->adjvex]=1; p=p->nextarc; } } g.vexnum=n;g.arcnum=G->e; }
(5)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或 非∞元素)的个数正好是第i个顶点vi的出度(或入度)。 (6)用邻接矩阵方法存储图,很容易确定图中任意两个顶 点之间是否有边相连。但是,要确定图中有多少条边,则必须 按行、按列对每个元素进行检测,所花费的时间代价很大。 这是用邻接矩阵存储图的局限性。
数据结构课件--第九章.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
C++数据结构(第2版)课件第9章索引技术

第十二页,共44页。
多重表
9.2 线性索引技术
关键码 指针 0001 0002 0003 0004 0005 0006 主索引
职工号 0001 0002 0003 0004 0005 0006
姓名 王刚 张亮 刘楠 齐梅 李爽 王东
性别 男 02 男 06 女 04 女 05 女∧ 男∧
文件
年龄 30 03 25 04 27 05 25 06 30 ∧ 24 ∧
稠密索引主要适用于静态索引。
第四页,共44页。
9.2 线性索引技术
稠密索引示例
关键码 指针
8 20 35 40 52 56 61
索引表 有序
关键码 其它数据项
r1 8 … r2 20 … r3 52 … r4 35 … r5 40 … r6 61 … r7 56 …
无序或有序
文件
第五页,共44页。
次关键码 头指针 长度
次关键码 头指针 长度
男
01
3
女
03
3
24~26
02
3
27~
01
3
“性别”次索引
第十三页,共44页。
“年龄”次索引
9.2 线性索引技术
倒排表
关键码 指针 0001 0002 0003 0004 0005 0006 主索引
职工号 0001 0002 0003 0004 0005 0006
情况2:从包含1个记录的叶子结点中删除这个记录。
18 33
12
23 30
48
10 15 20 21 24 31 45 47 50 52
解决方法:向兄弟结点借一个记录,同时修改双亲结点 的记录。
第二十九页,共44页。
《数据结构》课件(C语言)第09章

根据指针的不同,链表可分为单向链表、 双向链表和循环链表等多种类型。
单链表存储结构原理
存储结构
单链表中的每个结点包含两部分,一部分是存储数据元素的数据域,另一部分是存储下 一个结点地址的指针域。
原理
单链表通过每个结点的指针域将各个结点按顺序链接起来,形成一个线性结构。在单链 表中,每个结点只有一个后继结点,除首结点外,每个结点有且只有一个前驱结点。
一维数组排序
使用顺序表实现一维数组的排序,如冒泡排 序、插入排序等。
字符串操作
使用顺序表实现字符串的存储和操作,如字 符串拼接、查找子串等。
03 链表及其存储结构
链表定义及分类
链表定义
链表是一种物理存储单元上非连续、非 顺序的存储结构,数据元素的逻辑顺序 是通过链表中的指针链接次序实现的。
VS
链表分类
邻接表
用链表表示图,每个链表节点表示一 条边。适用于稀疏图的存储。
十字链表
有向图的邻接表与逆邻接表的结合, 适用于有向图的存储。
邻接多重表
无向图的邻接表的改进,适用于无向 图的存储。
图的遍历算法
深度优先遍历
从某个顶点出发,尽可能深地访问图中的所有顶点,直到没有未 访问的顶点为止。
广度优先遍历
从某个顶点出发,逐层访问图中的所有顶点,直到没有未访问的 ,队头指针加1。
注意
03
当队尾指针到达数组末尾时,需要进行循环移动,即将队尾指
针移动到数组开头。
队列链式存储结构实现
入队操作
在链表尾部插入新节点,队尾指针指向新节 点。
出队操作
删除链表头部的节点,队头指针指向下一个 节点。如果链表为空,则队头指针和队尾指
针都指向空。
05 数组和广义表
单链表存储结构原理
存储结构
单链表中的每个结点包含两部分,一部分是存储数据元素的数据域,另一部分是存储下 一个结点地址的指针域。
原理
单链表通过每个结点的指针域将各个结点按顺序链接起来,形成一个线性结构。在单链 表中,每个结点只有一个后继结点,除首结点外,每个结点有且只有一个前驱结点。
一维数组排序
使用顺序表实现一维数组的排序,如冒泡排 序、插入排序等。
字符串操作
使用顺序表实现字符串的存储和操作,如字 符串拼接、查找子串等。
03 链表及其存储结构
链表定义及分类
链表定义
链表是一种物理存储单元上非连续、非 顺序的存储结构,数据元素的逻辑顺序 是通过链表中的指针链接次序实现的。
VS
链表分类
邻接表
用链表表示图,每个链表节点表示一 条边。适用于稀疏图的存储。
十字链表
有向图的邻接表与逆邻接表的结合, 适用于有向图的存储。
邻接多重表
无向图的邻接表的改进,适用于无向 图的存储。
图的遍历算法
深度优先遍历
从某个顶点出发,尽可能深地访问图中的所有顶点,直到没有未 访问的顶点为止。
广度优先遍历
从某个顶点出发,逐层访问图中的所有顶点,直到没有未访问的 ,队头指针加1。
注意
03
当队尾指针到达数组末尾时,需要进行循环移动,即将队尾指
针移动到数组开头。
队列链式存储结构实现
入队操作
在链表尾部插入新节点,队尾指针指向新节 点。
出队操作
删除链表头部的节点,队头指针指向下一个 节点。如果链表为空,则队头指针和队尾指
针都指向空。
05 数组和广义表
数据结构-第9章 查找

静态查找表 对查找表的查找仅是以查询为 目的,不改动查找表中的数据。 动态查找表 在查找的过程中同时插入不存 在的记录,或删除某个已存在的记录。
查找成功 查找表中存在满足查找条件的记 录。 查找不成功 查找表中不存在满足查找条件 的记录。
内查找 整个查找过程都在内存中进行。 外查找 在查找过程中需要访问外存。 平均查找长度ASL——查找方法时效的度量 为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值。 n 查找成功时的ASL计算方法: ASL pici
3. 在二叉排序树上的操作
1)查找
[例] Key=28 f 24 12 T
45
53 28 90
Key=32 T 45 24 53 12 f 28 90 32
[算法描述]
2) 插入
[算法描述]
3) 生成
查找算法
返回
BiTree SearchBST(BiTree T,KeyType key){
//在根指针T所指二叉树中递归地查找某关键字等于 //key的数据元素,若查找成功,则返回指向该数据元 //素结点的指针,否则返回空指针
图9.1 用折半查找法查找12、50的过程 其中mid=(low+high)/2,当high<low时,表 示不存在这样的子表空间,查找失败。
成功! 位 置 1 2 3 4 5 6 7 8 9 10 11
值
6 12 15 18 22 25 28 35 45 58 60
low hign mid mid hign mid low mid (a) 用折半查找法查找12的过程
[性能分析] • 空间:一个辅助空间。 • 时间: 查找成功时的平均查找长度 设表中各记录查找概率相等 n ASLs(n)= PiCi =(1+2+ ... +n)/n =(n+1)/2 i 1 [算法特点] • 算法简单,对表结构无任何要求 • n很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。
《数据结构》课件ds-09

数据结构电子教案
第九章 排序
1
第九章 排序
概述 插入排序 交换排序 选择排序 归并排序 基数排序
140-2
概述
排序:将一组杂乱无章的数据按一定的规律 顺次排列起来。 数据表(datalist): 它是待排序数据元素的有限 集合。
排序码(key): 通常数据元素有多个属性域, 即 多个数据成员组成, 其中有一个属性域可用来 区分元素, 作为排序依据。该域即为排序码。 每个数据表用哪个属性域作为排序码,要视 具体的应用需要而定。
起泡排序的算法
template <class T> void BubbleSort (dataList<T>& L, const int left, const int right) { int pass = left+1, exchange = 1; while (pass <= right && exchange) { exchange = 0; //标志为0假定未交换 for (int j = right; j >= pass; j--)
140-6
bool operator == (Element<T>& x) { return key == x.key; } //判*this与x相等 bool operator <= (Element<T>& x) { return key <= x.key; } //判*this小于或等于x bool operator >= (Element<T>& x) { return key >= x.key; } //判*this大于或等于x bool operator > (Element<T>& x) { return key > x.key; } //判*this大于x bool operator < (Element<T>& x) { return key < x.key; } //判*this小于x
第九章 排序
1
第九章 排序
概述 插入排序 交换排序 选择排序 归并排序 基数排序
140-2
概述
排序:将一组杂乱无章的数据按一定的规律 顺次排列起来。 数据表(datalist): 它是待排序数据元素的有限 集合。
排序码(key): 通常数据元素有多个属性域, 即 多个数据成员组成, 其中有一个属性域可用来 区分元素, 作为排序依据。该域即为排序码。 每个数据表用哪个属性域作为排序码,要视 具体的应用需要而定。
起泡排序的算法
template <class T> void BubbleSort (dataList<T>& L, const int left, const int right) { int pass = left+1, exchange = 1; while (pass <= right && exchange) { exchange = 0; //标志为0假定未交换 for (int j = right; j >= pass; j--)
140-6
bool operator == (Element<T>& x) { return key == x.key; } //判*this与x相等 bool operator <= (Element<T>& x) { return key <= x.key; } //判*this小于或等于x bool operator >= (Element<T>& x) { return key >= x.key; } //判*this大于或等于x bool operator > (Element<T>& x) { return key > x.key; } //判*this大于x bool operator < (Element<T>& x) { return key < x.key; } //判*this小于x
《数据结构教学课件》第09章.ppt

C1 C2 C3 C4 C5
C6 C7 C8 C9
课程名称 计算机导论 数据结构 汇编语言 C程序设计语言 计算机图形学
接口技术 数据库原理 编译原理 操作系统
先修课程
无 C1,C4 C1 C1 C2,C3,C4
C3 C2,C9 C4 C2
4 of 114
教学计划编排问题(图形结构)
各课程之间的次序关系可用一个称作图 的数据结构来表示,如课程之间优先关系 有向图。有向图中的每个顶点表示一门课 程,如果从顶点vi到vj之间存在有向边<vi, vj>,则表示课程i必须先于课程j进行。
0
0
0
0
1
1
3
2
(a) 图G1
1
2
3
45
6
(b)图G2
1
2
3
2
(c)图G3 (d)图G4
12 of 114
(5)顶点的度: 顶点v的度是与它相关联的边的条数,记作TD(v)。 ➢有向图:顶点的度 = 入度 + 出度。 •入度ID(v)定义为以顶点v为终点的有向边的条数; •出度OD(v)定义为以顶点v为起点的有向边的条数; ➢无向图:TD(v)=ID(v)=OD(v)
0
0
0
0
1
1
3
2
(a) 图G1
1
2
3
45
6
(b)图G2
1
2
3
2
(c)图G3 (d)图G4
10 of 114 (3)完全图:
在有n个顶点的无向图中,若有n(n-1)/2条边,即任意两个 顶点之间有且只有一条边,则称此图为无向完全图; 在有n个顶点的有向图中,若有n(n-1)条边,即任意两个顶 点之间有且只有方向相反的两条边,则称此图为有向完全图
C6 C7 C8 C9
课程名称 计算机导论 数据结构 汇编语言 C程序设计语言 计算机图形学
接口技术 数据库原理 编译原理 操作系统
先修课程
无 C1,C4 C1 C1 C2,C3,C4
C3 C2,C9 C4 C2
4 of 114
教学计划编排问题(图形结构)
各课程之间的次序关系可用一个称作图 的数据结构来表示,如课程之间优先关系 有向图。有向图中的每个顶点表示一门课 程,如果从顶点vi到vj之间存在有向边<vi, vj>,则表示课程i必须先于课程j进行。
0
0
0
0
1
1
3
2
(a) 图G1
1
2
3
45
6
(b)图G2
1
2
3
2
(c)图G3 (d)图G4
12 of 114
(5)顶点的度: 顶点v的度是与它相关联的边的条数,记作TD(v)。 ➢有向图:顶点的度 = 入度 + 出度。 •入度ID(v)定义为以顶点v为终点的有向边的条数; •出度OD(v)定义为以顶点v为起点的有向边的条数; ➢无向图:TD(v)=ID(v)=OD(v)
0
0
0
0
1
1
3
2
(a) 图G1
1
2
3
45
6
(b)图G2
1
2
3
2
(c)图G3 (d)图G4
10 of 114 (3)完全图:
在有n个顶点的无向图中,若有n(n-1)/2条边,即任意两个 顶点之间有且只有一条边,则称此图为无向完全图; 在有n个顶点的有向图中,若有n(n-1)条边,即任意两个顶 点之间有且只有方向相反的两条边,则称此图为有向完全图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ASL= pi ci =1/n ci ≤1/n(1+22+322+…+h2h-1),
因此,在最坏情形下,上面的不等号将会成立 ,并根据 二叉树的性质,最大的结点数n=2h-1,h=log2(n+1) ,于是 可以得到平均查找长度ASL=(n+1)/n log2(n+1)-1。 当n很大时,ASL log2(n+1)-1 可以作为二分查找成功 时的平均查找长度,它的时间复杂度为O(log2n)。
算法一
BiTree SearchBST(BiTree T, KeyType key){ //在根结点T所指二叉排序树中递归地查找某关键字等于key的数据元素, //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针 if (!T||EQ ( key,T->data.key)) return( T ); //查找结束
查找效率低,当n较大时,不宜采用顺序查找,而 必须寻求更好的查找方法。
9.2.2二分查找
1. 二分查找的基本思想(Binary Search) 二分查找,也称折半查找,它是一种高效率的查找方 法。但二分查找有条件限制:要求表必须用向量作存贮结 构,且表中元素必须按关键字有序(升序或降序均可)。 二分查找的基本思想是:用于查找一个数据已按大小 次序排列的文件的方法,查找时依数据中某个键值进行, 先确定待查找所在的范围,然后每次缩小一半范围,直到 找到或找不到记录为止。
(a)15 个关键字序列得到的主表
index 34 70 90
(b)
start 0 5 10
length 5 5 5
按关键字序列递增得到的索引表
图 8-5
分块查找的主表和索引表
静态查找表的比较
A: 顺序表的查找
B:有序表的查找
C:索引顺序表的查找
• 平均查找长度: B〈 C〈 A • 记录顺序:A灵活性最好
//在右子区间中查找
例 如 , 假 设 给 定 有 序 表 中 关 键 字 为 8,17,25,44,68,77,98,100,115,125 , 将 查 找 K=17 和 K=120 的 情况描述为图8-1及图8-2形式。
[ 8 low
(a) 初始情形
17
25
44
68
77
98
10
115
125 high
pc
i 1
n
i i
pi =1; 其中:Pi为查找表中第i个记录的概率,且 i 1
n
一般情形下我们认为查找每个元素的概率相等, Ci为查找第i个元素所用到的比较次数。
2、 ASLss
假设在每个位置查找的概率相等,即有pi=1/n,由 于查找是从后往前扫描,则有每个位置的查找比较次数 Cn=1 , Cn-1=2 , … , C1=n ,则 Ci=n-i+1 。于是,查找成 功的平均查找 ASLss= [ 1 n ( n i 1)] =
else if LT( key,T->data.key) return( SearchBST(T->lchild, key)); //在左子树中继续查找 else return( SearchBST(T->rchild, key)); }//SearchBST //在右子树中继续查找
i 1 n
n 1 2
即它的时间复杂度为O(n)。 这就是说,查找成功的 平均比较次数约为表长的一半。若k 值不在表中,则必 须进行 n+1 次比较之后才能确定查找失败。另处,从 ASL 可知,当 n 较大时, ASL 值较大,查找的效率较低 。
4. 优缺点 优点:
算法简单,对表结构无任何要求,无论是用向量还 是用链表来存放结点,也无论结点之间是否按关键字有 序或无序,它都同样适用。 缺点:
•保存要找值的副本,若查找时,遇到它,表示查找不成 功。
3. 顺序查找性能分析 1、平均查找程度ASL(Average Search Length) 为确定记录在查找表中的位置,需和给定值进行 比较的关键字个数的期望值称为查找算法在查找成功 时的平均查找长度。ASL越小越好。 对于含有n个记录的表,查找成功时的平均查找 长度为 ASL =
return i;
}//Search_Seq
ST.elem[0]为监视哨,起两个作用:
•为了省去循环中下标越界的条件i≥1,从而节省比较时 间;若算法中不设立监视哨,程序花费的时间将会增加 ,例如:
for(i=ST.length; !EQ(ST.elem[i].key,key)&&(i>=1); --i);
数据结构与算法 Data Structure and Algorithm
第9章 查找
目 录
9.1 查找的基本概念
9.2 静态查找表
9.3 动态查找表
9.4哈希表
9.1 查找的基本概念
(1) 关键字 主关键字 关键字是数据元素中某个数据项的值,可以标志一个数据元素。
主关键字是可唯一标志一个数据元素的某个数据项的值
出生日期 学号 姓名 性 别 年 ┆ 1982 1982 1983 ┆ 1982 月 ┆ 11 09 01 ┆ 05 日 ┆ 05 12 25 ┆ 2 来 源 总分 录取专业
┆ 20010983 20010984 20010985 ┆ 20010989
┆ 赵剑平 蒋伟峰 郭 娜 ┆ 郭 娜
┆ 男 男 女 ┆ 女
例如,给定关键字序列如下:
18,7,26,34,15,42,36,70,60,55,83,90,78,72,74,假设m=3,s=5 ,即将该序序分成3个子表,每个子表有5 个元素,则得到 的主表和索引表如图8-5所示。
0 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 26 34 15 42 36 70 60 55 83 90 78 72 74
2.方法(各种树结构表示时的实现方法) a. 二叉排序树
b. 平衡二叉树
c. B树 d. B+树
9.3.1二叉排序树查找 1.什么是二叉排序树 二叉排序树( Binary Sorting Tree),它或者是一棵 空树,或者是一棵具有如下特征的非空二叉树: (1) 若它的左子树非空,则左子树上所有结点的关键字均 小于根结点的关键字; (2) 若它的右子树非空,则右子树上所有结点的关键字均 大于等于根结点的关键字; (3)左、右子树本身又都是一棵二叉排序树。
2.二叉排序树的特点
45 12 53 100
3
37
24
中序序列:3,12,24,37,45,53,100 结论:中序遍历二叉树可得到一个关键字的有序序列
3.二叉排序 树上的查找 (1)二叉排序 树的查找思想 当二叉排序树不为空的时候,若相等,则查找成功 ,若根结点值大于待查值,则进入左子树重复此步骤, 否则,进入右子树重复此步骤,若在查找过程中遇到二 叉排序树的叶子结点时,还没有找到待找结点,则查找 不成功。 (2)二叉排序树查找的算法实现
3.二分查找的性能分析
1.判定树 树中的每个结点表示表中一个记录,结点中的值为该记录在表中的位 置,通常称这个描述查找过程的二叉树为判定树。
0
1
2
3
4
5
6
7
8
9
10
8
17
25
44
68
5
77
98
100
115
125
2
8
1
3
6
9
4
7
10
图 8-3 具有 10 个关键字序列的二分查找判定树
2.折半查找的ASLbs 可以得到结论:二叉树第K 层结点的查找次数各为k 次(根结点为第1层),而第k层结点数最多为2k-1个。假设 该二叉树的深度为h, 则二分查找的成功的平均查找长 度为(假设每个结点的查找概率相等):
2.二分查找算法实现
int Search_Bin(SSTable ST, KeyType key){ //在有序表ST中折半查找其关键字等于key的数据元素。若找到, //则函数值为该元素在表中的位置,否则为0 low=1; high=ST.length; while (low< = high){ mid=(low +high)/2; //取区间中点 //查找成功
(3)内部查找 外部查找 若整个查找过程全部在内存进行,则称这样的查找为内查找 ;反之,若在查找过程中还需要访问外存,则称之为外查找。我 们仅介绍内部查找。
(4)查找表 由同一类型的数据元素构成的集合。可分为静态查找表和动态 查找表。 (5)静态查找 动态查找 查找过程中表中数据不会再增加、删除、修改,如查找数据元 素是否在表中,或检查某个数据的属性这些一般查找都属于静态查 找。 查找过程中数据元素会增加、删除和修改操作的属于动态查找 。
[
8 17 25 44 68 77 98 100 115 125 ]
low
(a) 初始情形
high
8
17
25
44
68 mid
[
77 low
98
100
115
125 high
]
(b)
经过一次比较后的情形
8
17 25 44 68 77 98 100 [
115 125 ]
mid
(c) 经过二次比较后的情形
9.2 静态表的查找
9.2.1 9.2.2 顺序表的查找 有序表的查找
9.2.3
索引顺序表的查找
9.2.1 顺序表的查找
1.顺序查找的基本思想(Sequential Search)
顺序查找是一种最简单的查找方法,它的基本思 想是:从表的一端开始,顺序扫描线性表,依次将扫 描到的结点关键字和待找的值K相比较,若相等,则 查找成功,若整个表扫描完毕,仍末找到关键字等于 K的元素,则查找失败。 顺序查找既适用于顺序表,也适用于链表。若用 顺序表,查找可从前往后扫描,也可从后往前扫描, 但若采用单链表,则只能从前往后扫描。另外,顺序 查找的表中元素可以是无序的。 此处以顺序表为例,从后往前扫描。