厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx

上传人:b****4 文档编号:14143569 上传时间:2022-10-19 格式:DOCX 页数:31 大小:956.99KB
下载 相关 举报
厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx_第1页
第1页 / 共31页
厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx_第2页
第2页 / 共31页
厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx_第3页
第3页 / 共31页
厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx_第4页
第4页 / 共31页
厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx

《厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx》由会员分享,可在线阅读,更多相关《厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。

厦门大学数据结构及算法陈海山期末习题答案解析Word文档格式.docx

2.算法的五大特性:

⑴输入:

一个算法有零个或多个输入。

⑵输出:

一个算法有一个或多个输出。

⑶有穷性:

一个算法必须总是在执行有穷步之后完毕,且每一步都在有穷时间完成。

⑷确定性:

算法中的每一条指令必须有确切的含义,对于一样的输入只能得到一样的输出。

⑸可行性:

算法描述的操作可以通过已经实现的根本操作执行有限次来实现。

1-5简述算法及其时间复杂度。

1.算法〔Algorithm〕:

是对特定问题求解步骤的一种描述,是指令的有限序列。

算法复杂度(AlgorithmComplexity):

算法占用机器资源的多少,主要有算法运行所需的机器时间和所占用的存储空间。

时间复杂度(TimeComplexity):

算法运行所需要的执行时间,T(n)=O(f(n))。

空间复杂度(SpaceComplexity):

算法运行所需要的存储空间度量,S(n)=O(f(n))。

1-6设数组A中只存放正数和负数。

试设计算法,将A中的负数调整到前半区间,正数调整到后半区间。

分析算法的时间复杂度。

A[n+1]

For(inti=n-1,j=0;

i>

j;

i--)

{

If(a[i]>

0)continue;

Else{

A[n]=A[i];

A[i]=A[j];

A[j]=A[n];

J++;

}

时间复杂度为O(n)

1-7将上三角矩阵A=(aij)nn的非0元素逐行存于B[(n*(n+1)/2]中,使得B[k]=aij且k=f1(i)+f2(j)+c(f1,f2不含常数项),试推导函数f1,f2和常数c。

k+1=1+2+3+…+(i-1)+j

k=1/2*i*(i-1)+j-1;

1-8描述以下递归函数的功能。

intF(intm,intn)

if(n>

m)returnF(n,m);

elseif(n==0)returnm;

else

r=m%n;

returnF(n,r);

求m与n的最大公约数

1-9编写递归算法:

0,m=0且n≥0

g(m,n)=

g(m-1,2n)+n,m>

0且n≥0

doubleg(doublem,doublen)

If(m==0&

&

n>

=0)

return0;

returng(m-1,2*n)+n;

1-10将以下递归过程改写为非递归过程。

voidtest(int&

s)

intx;

scanf(“%d〞,&

x);

if(x==0)s=0;

test(s);

s+=x;

习题2表

2-1如果长度为n的线性表采用顺序存储构造存储,那么在第i(1≤i≤n+1)个位置插入一个新元素的算法的时间复杂度为()。

(A)O

(1)(B)O(n)(C)O(nlog2n)(D)O(n2)

B

需要让线性表移动n+1-i个

2-2在一个有127个元素的顺序表中插入一个新元素,要求保持顺序表元素的原有(相对)顺序不变,那么平均要移动()个元素。

(A)7(B)32(C)64(D)127

Cn/2+1

2-3将关键字2,4,6,8,10,12,14,16依次存放于一维数组A[0...7]中,如果采用折半查找方法查找关键字,在等概率情况下查找成功时的平均查找长度为()。

(A)21/8(B)7/2(C)4(D)9/2

A

3,2,3,1,3,2,3,4

公式法1*2^0+2*2^1+3*2^2+…+i*2^(n-1);

2-4顺序表L递增有序。

设计一个算法,将a和b插入L中,要求保持L递增有序且以较高的效率实现。

先用折半查找法查询位置,然后移动

voidinsert(intL[],inta,intb)//a<

b

inti=0,p,q;

n=length(L);

//L现有长度

//查找确定a、b的位置

for(;

i<

n;

i++)

{

if(L[i]<

=a&

(a<

L[i+1]||i==n-1))

p=i+1;

//a的最终位置

n++;

break;

}

=b&

(b<

q=i+2;

//b的最终位置

//移动元素,插入a,b

for(i=n+1;

q;

L[i]=L[i-2];

L[q]=b;

//插入b

for(i=q-1;

p;

L[i]=L[i-1];

L[p]=a;

//插入a

2-5简单描述静态查找和动态查找的区别。

A静态查找表只查找

B、静态查找表不改变数据元素集合的数据元素

C、动态查找表不只查找

D、动态查找表还插入或删除集合的数据元素

2-6综合比较顺序表和链表。

(1)存储空间利用率高——只存储元素值。

(2)随机存取——可以通过计算来确定顺序表中第i个数据元素的存储地址Li=L0+(i-1)*m,其中,L0为第一个数据元素的存储地址,

m为每个数据元素所占用的存储单元数。

(3)插入和删除数据元素会引起大量结点移动.

顺序表:

存中地址连续

长度不可变更

支持随机查找可以在O

(1)查找元素

适用于需要大量访问元素的而少量增添/删除元素的程序

链表:

存中地址非连续

长度可以实时变化

不支持随机查找查找元素时间复杂度O〔n〕

适用于需要进展大量增添/删除元素操作而对访问元素无要求的程序

2-7解释链表的“头指针、头结点和首元素结点〞三个概念。

“头指针〞是指向头结点的指针。

"

头结点"

是为了操作的统一、方便而设立的,放在首元素结点之前,其数据域一般无意义〔当然有些情况下也可存放链表的长度、用做监视哨等等〕。

“首元结点〞也就是第一元素结点,它是头结点后边的第一个结点。

2-8描述以下算法的主要功能是()。

①构造头结点L,取q=L;

②产生1个结点p;

③q−>

next=p;

④输入p−>

data的值;

⑤取q=p;

⑥重复执行②至⑤n次;

⑦p−>

next=NULL;

(A)通过输入n个数据元素构建链表L

(B)采用前插法,在链表L中输入n个数据元素

(C)通过产生n个结点构建链栈L,q为栈顶指针

(D)在链队列L中输入n个数据元素,q为队尾指针

2-9设L是不带头结点的单链表的头指针,k是一个正整数,那么以下算法的主要功能是()。

LinkSearch(LinkListL,intk)

k0=0;

p=L->

next;

//next为单链表的指针域

q=p;

while(p)

if(k0<

=k)k0++;

elseq=q->

p=p->

q->

next=0;

(A)计算单链表L的长度

(B)查找单链表L中倒数第k个结点

(C)删除单链表L中最后面的k个结点

(D)将单链表L中第k个结点q的指针置0

只遍历一次的高效算法

〔排除法〕

2-10设链表L不带头结点,试分析算法的功能。

A(Linklist&

L)

if(L&

L->

next)

Q=L;

L=L->

P=L;

while(P->

next)P=P->

P->

next=Q;

Q->

}//A算法完毕

将链表的第一个结点接到最后一个结点后面

2-11设两个循环链表的长度分别为n和m,那么将这两个循环链表连接成一个循环链表,最好的时间复杂度为()。

(A)O

(1)(B)O(n)(C)O(m)(D)O(min(n,m))

首先取一个指针p指向la的第一个节点〔不包括头节点,头节点是空〕,然后让la头指针指向lb的第二个节点,接着用lb的第一个节点填充lb的头节点,最后将la头节点next指向p

如以下列图:

还是不明白请自己看ppt第二章P65

2-12设有6个数据元素A,B,C,D,E,F依次进栈。

如果6个数据元素的出栈顺序为B,C,D,F,E,A,那么该栈的最小容量为()。

(A)2(B)3(C)4(D)5

操作栈元素出栈顺序

A,B入栈A,B

B出栈AB

C入栈A,C

C出栈AB,C

D入栈A,D

D出栈AB,C,D

E,F入栈A,E,F

F出栈A,EB,C,D,F

E出栈AB,C,D,F,E

A出栈B,C,D,F,E,A

因此栈的最小容量只需3

2-13设进栈序列为123,试给出所有可能的出栈序列。

所有可能的出栈序列为:

1,2,3〔1入栈,1出栈,2入栈,2出栈,3入栈,3出栈〕

1,3,2〔1入栈,1出栈,2,3,入栈,3出栈,2出栈〕

2,1,3〔1,2入栈,2出栈,1出栈,3入栈,3出栈〕

2,3,1〔1,2入栈,2出栈,3入栈,3出栈,1出栈〕

3,2,1〔1,2,3入栈,3出栈,2出栈,1出栈〕

注意:

唯一只有3,1,2不可能出现,因为3要先出栈,前面1,2,3要按顺序一起入栈,因此不可能出现1在2的前面,后面的题目也是一样。

原那么就是只要后入栈的先出栈,那么这个元素前面入栈的元素一定按照入栈顺序的反序排列

2-14如果进栈序列为123456,能否得到出栈序列435612和135426?

435612不能得到6的后面不可能出现1,2的出栈顺序

135426能够得到

2-15简述算法的功能(设数据元素类型为int):

voidproc(LinkQueue*Q)

LinkStackS;

InitStack(S);

while(!

EmptyQueue(Q))

DeleteQueue(Q,d);

Push(S,d);

EmptyStack(S))

Pop(S,d);

InsertQueue(Q,d);

将链队列中的顺序倒过来

如原来ABCDEF,执行

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1