数据结构第7章查找
第7章图_数据结构

v4
11
2013-8-7
图的概念(3)
子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E 则称G’为G的子图
2 1 4 3 5 6 3 5 6 1 2
v1 v2 v4 v3 v2
v1 v3 v4
v3
2013-8-7
12
图的概念(4)
路径——是顶点的序列V={Vp,Vi1,……Vin,Vq},满足(Vp,Vi1),
2013-8-7 5
本章目录
7.1 图的定义和术语 7.2 图的存储结构
7.2.1 数组表示法 7.2.2 邻接表 ( *7.2.3 十字链表 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4.1 图的连通分量和生成树 7.4.2 最小生成树
*7.2.4 邻接多重表 )
7.3 图的遍历
连通树或无根树
无回路的图称为树或自由树 或无根树
2013-8-7
18
图的概念(8)
有向树:只有一个顶点的入度为0,其余 顶点的入度为1的有向图。
V1 V2
有向树是弱 连通的
V3
V4
2013-8-7
19
自测题
7. 下列关于无向连通图特性的叙述中,正确的是
2013-8-7
29
图的存贮结构:邻接矩阵
若顶点只是编号信息,边上信息只是有无(边),则 数组表示法可以简化为如下的邻接矩阵表示法: typedef int AdjMatrix[MAXNODE][MAXNODE];
*有n个顶点的图G=(V,{R})的邻接矩阵为n阶方阵A,其定 义如下:
1 A[i ][ j ] 0
【北方交通大学 2001 一.24 (2分)】
《数据结构(C语言版 第2版)》(严蔚敏 著)第七章练习题答案

《数据结构(C语言版第2版)》(严蔚敏著)第七章练习题答案第7章查找1.选择题(1)对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。
A.(n-1)/2B.n/2C.(n+1)/2D.n答案:C解释:总查找次数N=1+2+3+…+n=n(n+1)/2,则平均查找长度为N/n=(n+1)/2。
(2)适用于折半查找的表的存储方式及元素排列要求为()。
A.链接方式存储,元素无序B.链接方式存储,元素有序C.顺序方式存储,元素无序D.顺序方式存储,元素有序答案:D解释:折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
(3)如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用()查找法。
A.顺序查找B.折半查找C.分块查找D.哈希查找答案:C解释:分块查找的优点是:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。
由于块内是无序的,故插入和删除比较容易,无需进行大量移动。
如果线性表既要快速查找又经常动态变化,则可采用分块查找。
(4)折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。
A.20,70,30,50B.30,88,70,50C.20,50D.30,88,50答案:A解释:表中共10个元素,第一次取⎣(1+10)/2⎦=5,与第五个元素20比较,58大于20,再取⎣(6+10)/2⎦=8,与第八个元素70比较,依次类推再与30、50比较,最终查找失败。
(5)对22个记录的有序表作折半查找,当查找失败时,至少需要比较()次关键字。
A.3B.4C.5D.6答案:B解释:22个记录的有序表,其折半查找的判定树深度为⎣log222⎦+1=5,且该判定树不是满二叉树,即查找失败时至多比较5次,至少比较4次。
(6)折半搜索与二叉排序树的时间性能()。
数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。
7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。
在遍历中若发现顶点j,则说明顶点i和j间有路径。
{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。
设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。
数据结构第七章课后习题答案 (1)

7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。
(2)表示该图的邻接表。
(3)图中每个顶点的度。
解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。
7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。
(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。
数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。
visit[i]数组用来表示顶点i是否被访问过。
遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。
每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。
这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。
另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。
数据结构c语言版课后习题答案完整版

第1章绪论5.:CCBDCA6.分析下面各程序段的复度。
1〕O〔1〕2〕O〔m*n〕3〕O〔n2〕4〕O〔log3n〕〔5〕因x++共行了n-1+n-2+⋯⋯+1=n(n-1)/2,所以行O〔n2〕〔6〕O( n)第2章线性表1.babadbcabdcddac2.算法〔6〕一个算法,通一趟遍在表中确定最大的点。
ElemTypeMax(LinkListL){if(L->next==NULL)returnNULL;pmax=L->next;// 假定第一个点中数据具有最大p=L->next->next;while(p!=NULL){// 如果下一个点存在if(p->data>pmax->data)pmax=p;p=p->next;}returnpmax->data;〔7〕一个算法,通遍一趟,将表中所有点的接方向逆,仍利用原表的存空。
voidinverse(LinkList&L){ 逆置点的表Lp=L->next;L->next=NULL;while(p){q=p->next; //q指向*p的后p->next=L->next;L->next=p; //*p插入在点之后p=q;}}〔10〕度n的性表A采用序存构,写一复度O(n)、空复度O(1)的算法,算法除性表中所有item的数据元素。
[目分析] 在序存的性表上除元素,通常要涉及到一系列元素的移〔第个元素,第i+1至第n个元素要依次前移〕。
此题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针〔 i=1,j=n〕,从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
void Delete 〔ElemTypeA[] ,int n〕∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。
数据结构-第7章图答案

7.3 图的遍历 从图中某个顶点出发游历图,访遍图中其余顶点, 并且使图中的每个顶点仅被访问一次的过程。 一、深度优先搜索 从图中某个顶点V0 出发,访问此顶点,然后依次 从V0的各个未被访问的邻接点出发深度优先搜索遍 历图,直至图中所有和V0有路径相通的顶点都被访 问到,若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点,重复上述过程, 直至图中所有顶点都被访问到为止。
void BFSTraverse(Graph G, Status (*Visit)(int v)) { // 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组 visited。 for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; InitQueue(Q); // 置空的辅助队列Q for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) { // v尚未访问 EnQueue(Q, v); // v入队列 while (!QueueEmpty(Q)) { DeQueue(Q, u); // 队头元素出队并置为u visited[u] = TRUE; Visit(u); // 访问u for ( w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G, u, w) ) if ( ! visited[w]) EnQueue(Q, w); // u的尚未访问的邻接顶点w入队列Q
4。邻接多重表
边结点
mark ivex
顶点结点
ilink
jvex
jlink
info
data
firstedge
#define MAX_VERTEX_NUM 20 typedef emnu {unvisited, visited} VisitIf; typedef struct Ebox { VisitIf mark; // 访问标记 int ivex, jvex; // 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; // 分别指向依附这两个顶点的下一条 边 InfoType *info; // 该边信息指针 } EBox; typedef struct VexBox { VertexType data; EBox *firstedge; // 指向第一条依附该顶点的边 } VexBox; typedef struct { VexBox adjmulist[MAX_VERTEX_NUM]; int vexnum, edgenum; // 无向图的当前顶点数和边数 } AMLGraph;
《数据结构》第 7 章 图

v3
v4 v5 v4
v3
v5 v4
v3
v5 v4
v3
v5 v4
v3
v5
注
一个图可以有许多棵不同的生成树。 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。 含 n 个顶点 n-1 条边的图不一定是生成树。
A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} v1 v2
有向图
v3
v4
制作:计算机科学与技术学院 徐振中
数据结构 边:若 <v, w>∈VR 必有<w, v>∈VR,则以 无序对 (v, w) 代表这两个有序对,表示 v 和 w 之 间的一条边,此时的图称为无向图。 G2 = (V2, E2) V2 = {v1, v2, v3, v4, v5}
第七章 图
E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} v1
G2
v3
v2
无向图
v4
v5
制作:计算机科学与技术学院 徐振中
数据结构
第七章 图
例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是 表示两个城市的距离,则<A, B> 和 <B, A> 是相同的, 用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之 间人口流动的情况,则 <A, B> 和 <B, A> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海
数据结构教案7-8

课题
教学 目的 要求
第 7 章 查找 1.理解查找的基本概念和术语
章节
2.掌握线性表的顺序查找和二分法查找方法及算法实现。
3.掌握二叉排序树的生成和查找方法。
4.掌握散列表的构造方法、查找过程及解决冲突的方法。
教学重点 基于线性表的查找方法;二叉排序树;散列表
教学难点 平衡二叉树;哈希表处理冲突的方法
(1)必须采取顺序存储结构;(2)必须按关键字大小排序的有序表。
二分查找过程:
取表的中间记录关键字与查找 key 进行比较,三种情况:
相等:查找成功;
小于:要查找的记录只可能在表的后半部分;
大于:要查找的记录只可能在表的前半部分。
经过—次比较就可将查找范围缩小一半。如此反复进行,直到找到
给定关键字 key 记录,查找成功;当前查找范围为空,查找失败。
折半查找的过程可描述为:
⑴ low=1;high=length
⑵ 若 low>high,则查找失败
⑶
mid
low
high 2
若 key<L.r[mid].key,则 high=mid-1,转⑵
若 key>L.r[mid].key,则 low=mid+1,转⑵
若 key=L.r[mid].key,则查找成功,返回 mid
50
92
②若它的右子树非空,则右子树上所有结点的值
8
19
31
24
354249515 2229
38 46
53
均大于根结点的值;
43 60 70 98
③左、右子树本身又各是一棵二叉排序树。
图 7-4 一棵二叉排序树
3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020年8月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
数据结构
2020年8月2日
2020年8月2日
第7章 查找
教学内容
7.1 查找的基本概念 7.2 线性表的查找 7.3 树表的查找 7.4 哈希表的查找
2020年8月2日
教学目标
1.熟练掌握顺序表和有序表(折半查找)的查找算法 及其性能分析方法;
2.熟练掌握二叉排序树的构造和查找算法及其性能分 析方法;
• 重复上述操作,直至low>high时,查找失败
2020年8月2日
折半查找(递归算法)
int Search_Bin (SSTable ST, keyType key, int low, int high) { if(low>high) return 0; //查找不到时返回0 mid=(low+high)/2; if(key与ST.elem[mid].key) return mid; else if(key小于ST.elem[mid].key)
3.掌握二叉排序树的插入算法,了解二叉排序树的删 除算法;
4.熟练掌握哈希函数(除留余数法)的构造 5.熟练掌握哈希函数解决冲突的方法及其特点
2020年8月2日
7.1 查找的基本概念
是一种数据结构
• 查找表:
由同一类型的数据元素(或记录)构成的集合
• 静态查找表:
对查找表没有修改操作
• 动态查找表:
对查找表具有修改操作
• 关键字
记录中某个数据项的值,可用来识别一个记录
• 主关键字:
唯一标识数据元素
• 次关键字:
可以标识若干个数据元素
2020年8月2日
查找算法的评价指标 关键字的平均比较次数,也称平均搜索长度
ASL(Average Search Length)
n
ASL pici i 1
n:记录的个数 pi:查找第i个记录的概率 ( 通常认为pi =1/n ) ci:找到第i个记录所需的比较次数
}
2020年8月2日
顺序查找的性能分析
• 空间复杂度:一个辅助空间。 • 时间复杂度: 1) 查找成功时的平均查找长度
设表中各记录查找概率相等 ASLs(n)=(1+2+ ... +n)/n =(n+1)/2
2)查找不成功时的平均查找长度 ASLf =n+1
2020年8月2日
顺序查找算法有特点
• 算法简单,对表结构无任何要求(顺序和链式) • n很大时查找效率较低 • 改进措施:非等概率查找时,可按照查找概率进
2020年8月2日
int Search_Seq( SSTable ST , KeyType key ){ //若成功返回其位置信息,否则返回0 ST.R[0].key =key;
for( i=ST.length; ST.R[ i ].key!=key; - - i ); //不用for(i=n; i>0; - -i) 或 for(i=1; i<=n; i++) return i;
5 13 19 21 37 56 64 75 80 88 92
low mid high
2020年8月2日
直至low>high时,查找失败
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
low high mid
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
}SSTab的数据元素
int LocateELem(SqList L,ElemType e) { for (i=0;i< L.length;i++)
if (L.elem[i]==e) return i+1; return 0;} 改进:把待查关键字key存入表头(“哨兵”), 从后向前逐个比较,可免去查找过程中每一步都要 检测是否查找完毕,加快速度。
行排序。
2020年8月2日
练习:判断对错
n个数存在一维数组A[1..n]中,在进行顺序查找时, 这n个数的排列有序或无序其平均查找长度ASL不同。
查找概率相等时,ASL相同; 查找概率不等时,如果从前向后查找,则按查找概率 由大到小排列的有序表其ASL要比无序表ASL小。
2020年8月2日
折半查找
找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
low
mid
high
1 2 3 4 5 6 7 8 9 10 11
123456 5 13 19 21 37 56
若k==R[mid].key,查找成功 若k<R[mid].key,则high=mid-1 若k>R[mid].key,则low=mid+1
找21
7 8 9 10 11 64 75 80 88 92
low
mid
123456 7 5 13 19 21 37 56 64
2020年8月2日
7.2 线性表的查找
一、顺序查找(线性查找) 二、折半查找(二分或对分查找)
2020年8月2日
顺序查找
应用范围: 顺序表或线性链表表示的静态查找表 表内元素之间无序
顺序表的表示
typedef struct { ElemType *R; //表基址 int length; //表长
high
8 9 10 11 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
lowmid high
2020年8月2日
若k==R[mid].key,查找成功 若k<R[mid].key,则high=mid-1 若k>R[mid].key,则low=mid+1