学堂在线数据结构部分作业1

计算
1.视频中提到的Hailstone问题(又名3n+1问题)中Hailstone(n)的计算程序是不能确定是否存在n,使程序无法终止
解析:Hailstone问题至今仍未得到证明,即至今没有人证明对所有的正整数,Hailstone(n)过程都可以终止。
2.判断一个算法是否是一个“好算法”,最重要的一条性质是效率

计算模型
1.以下哪项不是图灵机的组成要件?有限长的纸带
解析:作为一个理想计算模型,图灵机的纸带是两端无线延伸的无限长纸带。
2.RAM模型与图灵机模型的区别在于图灵机的存储空间无限,而RAM的存储空间有限。×
解析:RAM模型中寄存器的总数没有限制(虽然我们平时使用的计算机无法做到),它与图灵机是等价的。

算法分析
1.1+1/2+1/3+…+1/n=O(logn)
2.x=n;
y=1;
while(x>=(y−1)∗(y−1))
y++;
以上程序的时间复杂度为O(O(n−−√))
解析:由程序可知(y−1)2≤n,由此可得y≤n√+1,程序执行次数为不大于n的完全平方根加1的最大整数。
3.经过k轮扫描交换后,起泡排序程序会将问题规模缩减至k。×
解析:经过k轮扫描交换后,最大的k个元素已经就位,因此问题规模缩减为n-k

迭代与递归
1.用分而治之的思想来解决长度为n的数组的求和问题(n足够大),递归实例的数目是否会比用减而治之的方法少
解析:减而治之的算法中,递归实例分别是:1个规模为n的实例、1个规模为n-1的实例、1个规模为n-2的实例、…,共有n个。

分而治之的算法中,递归实例分别是:1个规模为n的实例、2个规模为n/2的实例、4个规模为n/4的实例、…,共有1+2+4+8+…+n个。

2.减而治之的思想是:将问题划分为两个平凡的子问题,分别求解子问题,来得到原问题的解。(×)
解析:减而治之的思想是:应当是划分为一个平凡、一个规模缩减的两个子问题。所谓“平凡的问题”,是指无需进行复杂运算,可以直接给出结果的问题。例如,“对n个数进行排序”是一个复杂的问题,但当n等于1时,问题便成为了一个平凡的问题,因为序列长度为1,则序列自然是有序的。

3… A同学赞同视频中的算法,由于单个递归实例需要O(1)时间完成,共有n个实例,所以整个算法的复杂度是O(n)。但B同学认为,当sum(A,n)函数中调用sum(A,n-1)时,sum(A,n)仍在执行,因此sum(A,n)的完成时间不是O(1)而是O(n),依此计算,整个算法的复杂度应该为n+n−1+…+3+2+1=O(n2)。请问哪位同学对了?
解析:. B同学认为“函数中调用sum(A,n-1)时,sum(A,n)仍在执行”,实际上这个想法是错误的。当sum(A,n)调用sum(A,n-1)时,sum(A,n)函数中的数据以“函数帧”的形式被压入一个栈中,并没有处于执行状态。

4.视频里代码注释中“需要两个递归基”的含义是:“递归基”是
解析:递归函数的一种平凡情况,只有有递归基,递归才不会一直进行下去。

动态规划
1.直接用定义以递归的方式计算fib(n)的时间复杂度是:O(2^n)

2.以现在普通计算机的速度,直接用定义以递归的方式计算fib(100)需要多少时间(不考虑溢出):
解析:指数复杂度的算法属于实际不可行的算法。

3.对于视频中的上台阶问题(从第一层开始),上到第8层共有多少种不同的走法:
解析:上台阶问题的第n层答案floor(n)=fib(n),故floor(8)=fib(8)=21

4.用动态规划计算fib(n)的时间、空间复杂度分别为Θ(n),Θ(1)

5.The length of the LCS between “program” and “algorithm” is
program 和 algorithm的LCS长度为3

  1. LCS(“program”, “algorithm”) =LCS(x,y)表示字符串x,y最长公共子序列长度,则LCS(“program”, “algorithm”)=LCS(“progra”, “algorith”) + 1

7.下载并使用视频中的Demo(下载链接在“课程信息”右侧,01-f-6里也有),它是用什么做的?
解析:在默认情况下,本课程的Excel Demo可以用F9来进行刷新,查看不同的输入数据的结果。

8.用动态规划求解输入序列长度分别为m,n的LCS问题,时间复杂度为:
Θ(mn)

绪论测试小结
1.设函数f(n),g(n),h(n)非负,以下关于O,Θ,Ω记号的命题,正确的有:if f(n)=O(h(n)) and f(n)=Ω(h(n)), then f(n)=Θ(h(n)) 已知f(n)=O(h(n))且f(n)=Ω(h(n)),则f(n)=Θ(h(n))
解析:f(n)=O(h(n))中的“=”并不是“等于”的意思,O(h(n))也不是某个具体的函数。事实上,可以把O(h(n))理解成一个由某一类函数构成的集合,该集合中的函数都具有O记号定义中描述的性质,而f(n)=O(h(n))意思是f(n)∈O(h(n)),即f(n)是该集合的一个元素。

2.下列函数渐进增长速度最快的是:n/log2(n)
解析:对数函数log2(n)的渐进增长慢于任何次数的幂函数x^ϵ,(ϵ>0),以上几个函数增长速度从小到大是:log2(log2(n)),log22n,n2/3,n/log2(n)

3.以下递归函数实现数组A[lo, hi]的倒置:
void reverse(int *a,int lo,int hi){//数组转置
if(lo<hi){
swap(A[lo],A[hi]);
reverse(A,lo+1,hi-1);//递归倒置
}
}
调用reverse(A, 0, n-1)以倒置长度为n的数组,算法的时间复杂度为:Θ(n)
解析:用递归跟踪的方法:每个递归实例实际的工作只是交换两个元素,于是总时间与递归实例总数成正比,为Θ(n)。

4.V={11, 23, 19, 7, 17, 5, 3, 13, 2, 29},对V进行起泡排序,两趟扫描交换后V[8] =23
解析:每次扫描交换后原无序部分的最大元素必然就位,故所求答案为整个向量中的次大元素

发布了4 篇原创文章 · 获赞 7 · 访问量 679

猜你喜欢

转载自blog.csdn.net/qq_38101996/article/details/103318177
今日推荐