数据结构期末考试试题A及答案Word文档格式.docx
《数据结构期末考试试题A及答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构期末考试试题A及答案Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
90,67,87,60,55,32,70,45,19,23
2.设一个序列奇数项和偶数项分别由小到大有序,用什么方法可以最快得到一个有序序列,分析它的时间复杂度。
把奇数项和偶数项分为2个有序序列,然后进行合并,时间复杂度为O(n)。
实际上就是把2个有序表合并为一个有序表。
见教科书算法2.7。
3.二叉排序树中的最大值在二叉排序树的何处?
最大值应该位于二叉排序树中根的右子树的最右叶子上。
4.在2048个互不相同的关键码中选择最小的5个关键码,用堆排序是否比用锦标赛排序更快?
为什么?
此题用锦标赛排序比堆排序要快。
理由是;
①在首次求最小值时,锦标赛排序对2048个结点建树得到最小码只需比较n-1(即2047)次,而此时堆排序建初始堆得到最小码却可能需要比较4072次(因为每个结点的调整都要与左右两边的孩子相比。
从第1024个结点往前调整,有512个结点可能调整1次,但要与左右孩子都比较,有256个结点可能调整2次,每次都要与左右孩子比较,有128个结点可能调整3次,……有32个结点调整5次,……根结点可能要调整10次,每次都会与左右孩子比较,所以可能会比较2036×
2=4072次)。
而两种算法对求后面4个次小码的平均效率相同,都是log2n,所以,此题用锦标赛排序会比堆排序快。
5.n个顶点、m条边的全连通图,至少去掉几条边才能构成一棵树?
因为树的结构是一对多,即n个结点的树只有n-1条边与双亲结点相连。
只要再多添一条边就会成为图结构。
所以,m条边的图要去掉m-(n-1)=m-n+1条边才能构成一棵树。
这棵树也就是最小生成树。
6.设模式串为:
liuwenliuyuliuyingliyu,求该模式串的next函数。
Next[j]=0111111234112341
7.一个二叉树按层次遍历的顺序存储结构如下,请画出该二叉树(φ为空)。
123456789101112131415
A
B
D
φ
C
E
F
G
H
画出二叉树如下:
8.设数组A[1..10,1..8]的基地址为2000,每个元素占2个存储单元,若以列序为主序存储(按列存储),则元素A[4,5]的存储地址是多少?
A[4,5]的存储地址是2086
二、综合题(每题10分,共30分)
1.输入一序列(58,18,29,22,38,81,19,14),现分别采用顺序查找和二叉排序树查找,求等概率条件下二者的平均查找长度ASL;
若改用哈希查找(哈希函数为:
Hash(key)=keymod11,哈希表的大小为11,采用线性探测法进行冲突处理),求等概率条件下的平均查找长度ASL,并对这三种查找方法进行比较。
采用二叉排序树查找时,二叉排序树为:
采用二叉排序树查找时,ASL=1/8[1×
1+2×
2+3×
1+4×
2+5×
1+6×
1]=27/8=3.375
采用顺序查找时,ASL=1/2(8+1)=4.5
采用哈希查找时,查找表为:
012345678910
22
58
81
38
14(3)
18
29
(1)
19
(1)
ASL=1/8(5×
2+1×
4)=13/8=1.625
2.已知用线性有序链表存储整数集合的元素。
阅读下面算法,并回答下列问题:
(1)写出执行ABC(a,b)的返回值,其中a和b分别为指向存储集合
{2,4,5,7,9,12}和{2,4,5,7,9}的链表的头指针;
(2)简述算法ABC的功能;
(3)写出算法ABC的时间复杂度。
intABC(LinkListha,LinkListhb)
{//LinkList是带有头结点的单链表
//ha和hb分别为指向存储两个有序整数集合的链表的头指针
LinkListpa,pb;
pa=ha->
next;
pb=hb->
while(pa&
&
pb&
pa->
data==pb->
data)
{pa=pa->
pb=pb->
}
if(pa==NULL&
pb==NULL)return1;
elsereturn0;
(1)ABC(a,b)=0;
(2)此函数是判两链表是否相等的函数。
若二表完全相同将返回函数值1,不相同则返回的函数值为0.
(3)算法ABC的时间复杂度为O(min(LinkLista.length,LinkList_b.length))
3.对于下面的一串字符,根据各字符出现的频度求各个字母的哈夫曼编码,并且建树要遵循二叉树左边结点的权值≤二叉树右边结点的权值,请写出详细的求解过程。
ABCCCEBAAADCCCAEECCCEDE
此题分三步求解,第①步2分,②和③各4分。
1先统计各字母出现的频度,得到下表:
字母
频度
5
2
9
2哈夫曼树构造如下:
③各个字母的哈夫曼编码如下:
哈夫曼编码
01
000
11
001
10
三、算法设计题(每题10分,共30分)
1.采用二叉链表作为存储结构,试编写一个算法求二叉树中结点p的双亲结点和孩子结点。
采用先、中、后序遍历都可完成,基本思想是:
在遍历过程中,寻找其左孩子或者右孩子是p的节点,当访问到p节点以后,再把其左右孩子写出。
只需将遍历算法的visit(q)一句更换为:
if(q->
rchild==p||q->
lchild==p)
{printf(’theparentofpis:
’q->
data);
printf(’thelchildofpis:
’,p->
lchild->
printf(’therchildofpis:
rchild->
exit(或return)
}
2.若借助栈由输入序列为1,2,…,n得到的输出序列为P1P2…Pn,设计一个算法输出所有可能的序列,并分析该算法的时间复杂度和空间复杂度。
算法如下:
OutputStack(Stringt,inti,intj)
//输出序列t中的第i个到第j个的元素
{
if(j>
i)print("
\n"
);
//换行打印
else
{
e=GetElem(t,i);
//取t中的第i个元素
push(s,e);
OutputStack(t,i+1,j);
if(s栈不空)
{
pop(s,e);
print(e);
OutputStack(t,i+1,j);
}
时间复杂度:
O(n)=O(n!
)=O(2n)。
空间复杂度:
由于需要栈保存递归参数,因此空间复杂度是递归操作中栈的深度,故为O(n)。
3.在游戏软件和图形软件设计中,经常遇到下面的情况:
n条直线把屏幕分成m个区域,见图。
假设每条直线的方程和交点的坐标已知,设计一个数据结构表示这些区域,并设计一个算法,判断鼠标(x,y坐标)落在哪个区域,并分析此算法的时间复杂度。
区域树是一棵二叉树,随着直线的逐条输入而生成。
树中每个结点有四个域
lchild
nodenum
linenum
rchild
nodenum为结点编号,剖分过程形成的对应的区域编号。
linenum是直线的编号,当结点对应的是不被分割的基本区域时记为-1,当在分割过程记下?
分割它的直线的编号。
lchild,rchild对应每个分割直线的左右两侧的生成区域。
建立3个表:
交点表:
0,1,2…..
区域表:
0,1,2,3…10,11,12及区域所围成的边
直线表:
直线方程式
显然,此区域树的叶子节点表示划分的区域。
判断鼠标落在哪个区域的算法
输入mouse的坐标(x,y),从区域树的根节点开始,将x,y带入此节点的直线方程,大于0,走左子树,否则,走右子树,直至叶子节点,则此叶子节点表示的区域即为鼠标落在的区域。
算法复杂度分析:
算法的时间复杂度为区域二叉树的平均深度,因为划分的区域为n!
个,也即叶子有n!
个,则二叉树的平均深度为o(n)。