《数据结构与算法》A答案解析资料Word文档下载推荐.docx
- 文档编号:19234309
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:26
- 大小:1.98MB
《数据结构与算法》A答案解析资料Word文档下载推荐.docx
《《数据结构与算法》A答案解析资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构与算法》A答案解析资料Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
}。
则其强连通分量个数为A。
A、3B、4C、5D、6
考有向图中的强联通分量问题:
首先要把强联通分量概念弄清楚:
有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi<
>
vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stronglyconnected)。
如果有向图G的每两个顶点都强连通,称G是一个强连通图。
非强连通图有向图的极大强连通子图,称为强连通分量(stronglyconnectedcomponents)。
记主要特征:
强联通分量图中两两都可达,也可见下图实例。
按照这个定义,得到图G中的强联通分量共3个:
<
1,2>
<
3,5,6>
4>
3、数组Q[0..n-1]作为一个环形队列,f为当前队头元素的前一位置,r为队尾元素
的位置,假定队列中元素的个数总小于n,计算队列中元素个数的公式是D。
A.r-fB.n+f-rC.n+r-fD.(n+r-f)modn考循环队列的定义、性质和特点:
所以,由于可以循环,f和r不一定哪个在前,哪个在后,需要用取余来判断。
答案是最后一个。
既然r和f不知道哪个大,那么,前3个答案都有可能得到非法数据:
小于0或者大于n,因此,也可以排除前3个选项。
4、设一棵Huffman树中度为2的节点数为n2,则该树的总节点数为D。
A、2n2B、n2+1C、4n2D、2n2+1
考Huffman树的特点和性质:
首先是了解Huffman树的特点(也是一颗二叉树),如下图,其次,了解度的概念:
结点的度指结点的孩子结点个数,例如度为2就是有2个孩子结点的结点;
叶子结点就是度为0的结点,没有孩子结点的结点.
按照这个概念,度为2的结点树为n2,即为非叶子结点,Huffman树中叶子结点个数是非结点个数+1,所以总结点个数:
n2+n2+1
从左边的树例子中就可以看出来。
5、按照二叉树的定义,具有3个节点的二叉树有C种。
A.3B.4C.5D.6
考二叉树的定义。
画一画就可以得出答案了:
6、有一棵非空的二叉树(第0层为根结点),其第i层上至多有A个结点。
A.2iB.2i-1C.2i+1D.i
考二叉树的特点:
画一颗树来看看,结果自然就出来了,第i层结点个数的一般规律:
第0层:
20=1,第1层:
21=2,第2层,22=4,因此,。
。
第i层,2i
7、对于n个节点的满二叉树,设叶节点数为m,分枝节点数为k,则A。
A.n=k+mB.k+m=2kC.m=k-1D.n=2k-1
考满二叉树的定义:
满二叉树中,除了叶子结点,就是分支结点。
答案为A
8、在已知待排序文件已基本有序的前提下,效率最高的排序方法是(A)
A.直接插入排序B.直接选择排序
C.快速排序D.归并排序
考排序的效率和特点:
9、用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,
各数据元素的变化情况如下:
(1)258421471527683520
(2)201521254727683584
(3)152021253527476884
(4)152021252735476884
那么,所采用的排序方法是D。
A.选择排序B.希尔排序C.插入排序D.快速排序
了解常用排序算法的过程:
给出的过程,符合快速排序的特点。
把几种排序的特点都熟悉,对照一下,就得出答案了:
不是插入,不是选择,不是冒泡,剩下的就是快速了。
一、插入排序(InsertionSort)
1.基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;
直到待排序数据元素全部插入完为止。
2.排序过程:
【示例】:
[初始关键字][49]38659776132749
J=2(38)[3849]659776132749
J=3(65)[384965]9776132749
J=4(97)[38496597]76132749
J=5(76)[3849657697]132749
J=6(13)[133849657697]2749
J=7(27)[13273849657697]49
J=8(49)[1327384949657697]
二、选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
初始关键字[4938659776132749]
第一趟排序后13[38659776492749]
第二趟排序后1327[659776493849]
第三趟排序后132738[9776496549]
第四趟排序后13273849[49976576]
第五趟排序后1327384949[979776]
第六趟排序后132738494976[7697]
第七趟排序后13273849497676[97]
最后排序结果1327384949767697
三、冒泡排序(BubbleSort)
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"
漂浮"
,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
4913131313131313
3849272727272727
6538493838383838
9765384949494949
7697654949494949
1376976565656565
2727769776767676
4949497697979797
四、快速排序(QuickSort)
在当前无序区R[1..H]中任取一个数据元素作为比较的"
基准"
(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:
R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
初始关键字[4938659776132749]
第一次交换后[2738659776134949]
第二次交换后[2738499776136549]
J向左扫描,位置不变,第三次交换后[2738139776496549]
I向右扫描,位置不变,第四次交换后[2738134976976549]
J向左扫描[2738134976976549]
(一次划分过程)
初始关键字[4938659776132749]
一趟排序之后[273813]49[76976549]
二趟排序之后[13]27[38]49[4965]76[97]
三趟排序之后1327384949[65]7697
最后的排序结果1327384949657697
各趟排序之后的状态
五、堆排序(HeapSort)
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
2.堆的定义:
N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
Ki≤K2iKi≤K2i+1(1≤I≤[N/2])
堆实质上是满足如下性质的完全二叉树:
树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。
例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。
这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。
反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
3.排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。
我们不妨利用大根堆来排序。
每一趟排序的基本操作是:
将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。
这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
对关键字序列42,13,91,23,24,16,05,88建堆
10、对以下四组原始数据用快速排序法排序,D组的情况速度最慢。
A.19230315072128B.23212815190307
C.19071528232103D.03071519212328
还是要熟悉快速排序的过程:
D答案中13应改为03,4组都一样的数据,序列不一样。
11、对于已排好序的、具有12个数据元素的线性表,采用冒泡排序方法排序时最少需
要比较。
A.1B.144C.11D.66
考冒泡排序法:
熟悉算法过程(最好是把程序写出来),就得出答案了。
For(i=0;
i<
n-1;
i++)
For(j=0;
j<
n-1-I;
j++)
If(a[j]>
a[j+1]则交换
注意:
如果按照一般的冒泡排序,则答案是:
D:
11+10+。
+1=66
但稍微优化一下冒泡排序法,答案是C
Intf=0;
{For(j=0;
a[j+1])则{F=1;
交换}
if(!
f)break;
//如果第一趟排序,发现已经是有序,则退出了,只比较了第一趟的11次
}
(这一题有争议,我的意见是看题目的意思,趋向于答案C)
12、在一个有n(n≥1)个顶点的有向图中,边数最多为C。
A、n-1B、nC、n(n-1)D、n(n-1)/2
有向图的特征:
画一个图,就得到答案了。
4个结点,12条边
13、在有n个结点的二叉链表中,值为非空的链域的个数为A。
A.n-lB.2n-lC.n+lD.2n+1
二叉链表的特征:
n个结点,则链指针有所指的为n-1,:
2叉链表,则总链域个数2n,头指针指向根结点,其余n-1个结点,共需要n-1个指针域(非空),注意,空链域个数:
2n-(n-1)=n+1
(原有答案出错)
14、带权有向图G用邻接矩阵A存储,则顶点i的入度等于A中D。
A.第i行非∞的元素之和B.第i列非∞的元素之和
C.第i行非∞且非0的元素个数D.第i列非∞且非O的元素个数
有向图中,结点i的入度就是指向i结点的弧的条数,而邻接矩阵是行数据中非0非无穷元素个数为i的出度,列才为入度(原有答案出错)。
15、从下图中顶点A出发,采用深度优先遍历,则下列各顶点序列中,不是遍历结果的是C。
A、ABCDEGFB、ABFDCGEC、AGDEBFCD、AFDGECB
图的深度优先和广度优先都要弄清楚。
深度优先为相连访问(注意退回到还有连接结点没有访问过的那个结点上,广度优先为层次访问,先访问的结点其子树也先访问(子树访问无次序,仅对下层访问有影响)(最好先把层次图画出)。
A->
B->
C->
D->
E>
G(所有相连结点已访问)->
退回E->
退回D->
F
F->
CG->
E
G->
E(所有相连结点已访问)->
退回D->
只能访问F或C
退回G->
E->
B
二、判断题(每小题1分,共10分)√√√√√×
×
1.在循环队列中,若尾指针Rear大于头指针Front,则其元素个数为Rear-Front。
(√)
首先是队列特点:
先进先出,队头出,队尾进,当队尾大于队头时,说明进的比出的多,此时元素个数为Rear–Front,大家可以画图帮助理解。
2.将一棵树转换为二叉树表示后,该二叉树的根结点没有右子树。
要了解树转换为二叉树的步骤,
3.在用k叉链表示的n个结点的k叉树中,空的链指针有n*(k-1)+1个。
总共kn个链域,n个结点,非空链域n-1个,则空的为:
kn-(n-1)=kn-n+1
4.已知完全二叉树的第八层有8个结点,则其叶子结点数是68。
(√)
注意是根结点为第1层,第7层该有26=64个结点,第八层有8个结点用去第7层的4个结点,所以叶子结点总数:
64-4+8=68。
有时间的话,画一下图也可以
5.有向图用邻接矩阵表示后,顶点i的出度等于第i行中非0且非∞的元素个数。
6.图G的某一最小生成树的代价一定小于其他生成树的代价。
(×
)
最小生成树不止一颗,所以,。
可以等于
7.若一棵二叉树的任一非叶子结点的度为2,则该二叉树为满二叉树。
画一下,就知道答案了:
8.二叉树只能采用二又链表来存储。
顺序存储结构(数组形式)和链式存储结构(二叉链表)
9.只有在初始数据为逆序时,冒泡排序所执行的比较次数最多。
冒泡排序在最坏情况是初始序列为“逆序”,需要进行N-1次排序,进行的比较次数为:
∑(i-1),下标从n到2,即n(n-1)/2.
10.堆排序中,在输出一个根之后的调整操作中,“临时根”结点的值将被调到“叶子结点”上。
)了解堆排序过程
三、简答题(每小题5分,共30分)
1、对下面给出的数据序列,构造一棵哈夫曼树,并求出其带权路径长度。
4,5,6,7,1O,12,15,18,23
以上是Huffman树的构造过程,考试时需要先在草稿上一步一步构造,只需要把最后的Huffman树写出来就可以。
每个叶子结点的路径长度就是从根结点开始到叶子结点的树枝条数,如4的路径长度是4,23的是2等。
叶子的带权路径长度=权值*路径长度
树的带权路径长度=所有叶子结点的带权路径长度之和
WPL=4*4+5*4+10*3+23*2+6*4+7*4+12*3++15*3+18*3=。
算一下,就知道结果了。
2、一棵二叉树的先序、中序和后序序列分别如下,其中有一部分未显示出来,试求出空格处的内容,并画出该二叉树。
先序:
ABDFKI(前为左和后为右)CEHJG
中序:
DBKFI(左)A(右)EJCG
后序:
DKIFBHJEGCA(根)
步骤:
先序(根-左-右),中序(左-根-右),后序(左-右-根):
1)从后序KFBHJGA(根),知道A是根结点
2)从中序,知道左子树和右子树DKFI(左)A(右)EJC
3)从先序知道B是左子树的根结点AB
4)从中序DB知道D是B的左孩子,KFI是B的右子树上结点
5)从后序FB知道F是B的右子树上根结点,根据中序KFI知道K是左,I是右
先序序列得出:
6)从先序CE知道A的右子树根结点是C,从中序得知C只有一个右结点。
从先序CEHJG得知必为G,再结合先序,中序序列得出
中序:
DBKFI(左)A(右)HEJCG
然后,后序序列得出:
后序:
这树就出来了:
B为A左子树的根,D为B的左子树,F为B的右子树的根,K为F的左,I为F的右。
C为A右子树的根,G为C的右子树,E为C的左子树的根,H为E的左,J为E的右。
注意下面的考法:
3、设有序列:
{11,30,5,6,23,17,29,37,4,13,33},用希尔排序法进行排序,设d1=5,d2=3,d3=1。
给出每一趟排序的结果。
4、下列程序段中,语句
(1),
(2),(3)执行的次数为多少?
for(i=1;
i≤m;
i++)
{
xx+2;
..............................
(1)
for(j=1;
j≤n;
j++)
yy+2;
........................
(2)
for(k=1;
k≤j;
zx+y;
...................(3)
5、请画出下面的无向带权图的最小生成树:
6、下面是简单选择排序算法,效率不高,请给出优化后的算法。
voidSelectSort(intr[],intn){for(i1;
i≤n-1;
i++)for(ji+1;
j≤n;
j++)if(r[j]<
r[k])
r[i]r[k];
四、算法设计题(每小题15分,共30分,任选其中两题)
1、试写出计算二叉树节点数目的算法。
2、编写一个算法,从一给定的数组A[]中删除元素值在x到y(x≤y)之间的所有元素(假定数组中有n个元素)。
算法头部约定如下:
voidDelete(A[],n,x,y)
3、对于任意给定的一个线性表:
L=(a1,a2,……,an),写出构造一个链表的算法。
节点类型及其算法头部约定如下:
structnode
ElemTypedata;
structnode*next;
};
typedefstructnodeNODE;
NODE*CreateLinkList(intn)
4、设有两个有序关键字表S1,S2。
S1和S2存储在数组r[low,high]中,Sl放在r[low,mid]中,S2放在r[mid+1,high]中,如下图所示。
现在要把S1,S2归并,请写出归并排序算法。
算法头部约定为:
voidMerge(r[],low,mid,high)
lowmidmid+1high
参考答案
BADACAAADDCCCCC
二、判断题:
(每小题1分,共10分)
√√√√√×
1、带权路径长度WPL=299
100
4258
19232533
91012131518
4567
2、先序:
ABDFKICEHJG或者:
ADKJ
中序:
DBKFIAHEJCG或者:
BHG
DKIFBHJEGCA或者:
DIEC
A
BC
DFEG
KIHJ
3、11,29,5,4,13,17,30,37,6,23,33
4,13,5,11,29,6,23,33,17,30,37
4,5,6,11,17,13,23,30,29,33,37
4、
(1)m
(2)m*n(3)m*n*n*(n+1)/2
5、答:
该图的最小生成树为:
6、答:
该算法经优化后的形式如下:
i++){ki;
for(ji+1;
kj;
if(k≠i)
四、算法设计题(每小题15分,共30分)
1、算法如下:
counter<
=0;
voidNumbers(NODE*tree)
if(tree)
counter++;
Numbers(tree->
Lsubtree);
Rsubtree);
2、本题的算法思想是:
先将A[]中所有元素值在x≤y之间的元素置成一个特殊的值(如0),并不立即删除它们,然后从最后向前依次扫描,对于该特殊值的元素便移动其后面的元素将其删除,这种算法比每删
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法 数据结构 算法 答案 解析 资料