《算法导论》习题答案.docx

对n个元素值分别为-1、0或1的整型数组A进行升序排序的算法描述如下:统计A中-1、0和1的个数,设分别为n1、n2和n3,然后将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n3个元素赋值为1。该算法的时间复杂度和空间复杂度分别为()。

A.Θ(n)和Θ(1)

B.Θ(n)和Θ(n)

C.Θ(n2)和Θ(1)

D.Θ(n2)和Θ(n)


参考答案:A

本题需要用3个辅助变量n1、n2和n3来保存数组A中-1、0和1的个数,空间复杂度为Θ(1)。在统计时,需要使用一循环语句遍历数组A。统计完成后,再使用一次循环语句遍历数组A,并将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n个元素赋值为1。数组A的元素个数为n,因此算法的时间复杂度为Θ(n)。


( 9 )下面的函数利用递归实现了求 1+2+3+ …… +n 的功能:

int sum ( int n ) {

if ( n==0 )

return 0;

else

return n+sum ( n-1 ) ;

}

在执行 sum ( 10 )的过程中,递归调用 sum 函数的次数是【 9 】 。


正确答案:


某算法的时间复杂度可用递归式[*],表示,若用[*]表示该算法的渐进时间复杂度的紧致界,则正确的是(62)。

A.(nlg2n)

B.(nlgn)

C.(n2)

D.(n3)


正确答案:A
解析:本题利用递归树方法求解。得到的递归树如下图所示:

 由于C属于O(nlg2n)且C属于Ω(nlg2n),所以总的时间复杂度为A。


用折半查找方式查找N个元素的数组,当查找成功时,其递归执行程序时递归调用的最大次数是(11)。

A.

B.

C.

D.


正确答案:D
解析:折半查找法每次将序列划分成两个部分,故最差情况下查找成功的递归调用次数是。


将f=1+1/2+1/3+…+1/n转化成递归函数,其递归体是()。

A、f(1)=0

B、f(1)=1

C、f(0)=1

D、f(n)=f(n-1)+1/n


参考答案:D


Chapter2GettingStartInsertionsort2.1.2将Insertion-Sort重写为按非递减顺序排序2.1.3计算两个n位的二进制数组之和Analyzingalgorithms2.2.当k二1时,n二2,显然有T(n)=nlgn假设当k=i时公式成立,即T(n)=nlgn=2ilg2i=i-2i,则当k=i+1,即n=2i+1时,将函数n3/1000-100n2-100n+3用符号0表示2.2.2写出选择排序算法selection-sort当前n-1个元素排好序后,第n个元素已经是最大的元素了.最好时间和最坏时间均为0(n2)Designingalgorithms2ifn二2T(n)斗2.3.3计算递归方程的解l2T(n/2)+nfn二2k,fork1T(n)=nlgn2.3.4给出insertionsort的递归版本的递归式T()=爲爲)f;=:2.3-6使用二分查找来替代insertion-sort中while循环内的线性扫描,是否可以将算法的时间提高到0(nlgn)?虽然用二分查找法可以将查找正确位置的时间复杂度降下来,但是移位操作的复杂度并没有减少,所以最坏情况下该算法的时间复杂度依然是0(n2)2.3-7给出一个算法,使得其能在0(nlgn)的时间内找出在一个n元素的整数数组内,是否存在两个元素之和为x首先利用快速排序将数组排序,时间0(nlgn),然后再进行查找:Search(A,n,x)QuickSort(A,n);i1;jn;whileAi+Aj丰xandijifAi+Aj0,(n+a)b=&(nb)a0时,(n+a)nb对于c=1,c=2b,cnb(n+a)cnb1212a0时,(n+a)-2a,当nn时,(n+a)(n/2)b00对于c=2-b,c=1,cnb(n+a)cnb121231-4判断2n+1与22n是否等于O)316证明如果算法的运行时间为0(g(n),如果其最坏运行时间为O(g(n),最佳运行时间为Q(g(n)。最坏时间O(g(n),即Teg(n)1.T=0(g(n)3,1,7:证明o(g(n)nw(g(n)

设求解某问题的递归算法如下: F(int n){ if n==1{ Move(1); } else{ F(n-1); Move(n); F(n-1); } } 求解该算法的计算时间时,仅考虑算法Move所进行的计算为主要计算,且Move为常数级算法,设算法Move的计算时间为k,当n=5时,算法F的计算时间为(42)。

A.7k

B.15k

C.31k

D.63k


正确答案:C
解析:直接递归算法的计算时间可以根据递归调用形式对应写出其递推关系式。按照题目中描述的算法形式可知,算法F的计算时间T(n)的递推关系式为T(n)=2T(n-1)+1,其中两次递归调用F(n-1)用时2T(n-1),算法Move的计算时间为常数,计为1。将上述递推关系式中常数1用k替换,求解可得T(n)=2n-1T(1)+k2i,易知T(1)=k,将n=5代入可得T(n)=2n-1T(1)+k2i=25-1k+k2i=24k+(20+21+22+23)k=31k。


用递归算法实现n个相异元素构成的有序序列的二分查找,采用一个递归工作栈时,该栈的最小容量应为______。

A.n

B.n/2

C.log2n

D.log2(n+1)


正确答案:D
解析:二分查找亦称折半查找,其基本思想:设查找表的元素存储在一维数组r[1..n]中,首先将待查的key值与表r中间位置上(下标为mid)的记录的关键字进行比较,若相等,则查找成功:若key>r[mid].key,则说明待查记录只可能在后半个子表r[mid+1..n](注意:是mid+1,而不是mid)中,下一步应在后半个子表中再进行折半查找,若keyr[mid].key,则说明待查记录只可能在前半个子表r[1..mid-1](注意:是mid-1,而不是mid)中,下一步应在前半个子表中再进行折半查找,这样通过逐步缩小范围,直到查找成功或予表为空时失败为止。
  在表中的元素已经按关键字递增(或递减)的方式排序的情况下,才可进行折半查找。
  等概率情况下顺序查找成功的平均查找长度为:当n值较大时,ASLbs≈log2(n+1)-1。


计算N!的递归算法如下,求解该算法的时间复杂度时,只考虑相乘操作,则算法的计算时间T(n)的递推关系式为(55);对应时间复杂度为(56)。

int Factorial (int n)

{//计算n!

if(n<=1)return 1;

else return n * Factorial(n-1);

}

(62)

A.T(n)=T(n-1)+1

B.T(n)=T(n-1)

C.T(n)=2T(n-1)+1

D.T(n)=2T(n-1)-1


正确答案:A


设某算法的计算时间表示为递推关系式T(n)=T(n-1)+n(n>O)及T(0)=1,则该算法的时间复杂度为(65)。

A.O(lgn)

B.O (nlgn)

C.O(n)

D.O(n2)


正确答案:D
解析:本题考查算法设计基础知识。根据题目中给出的递推关系:T(n)=T(n-1)+n=T(n-2)+n-1+n=…=T(0)+1+2+…+n-1+n=1+n(n+1)/2


设求解某问题的递归算法如下:

F(int n){

if n=1 {

Move(1)

}else{

F(n-1);

Move(n);

F(n-1);

}

}

求解该算法的计算时间时,仅考虑算法Move所做的计算为主要计算,且Move为常数级算法。则算法F的计算时间T(n)的递推关系式为(9);设算法Move的计算时间为k,当 n=4时,算法F的计算时间为(10)。

A.T(n)=T(n-1)+1

B.T(n)=2T(n-1)

C.T(n)=2T(n-1)+1

D.T(n)=2T(n+1)+1


正确答案:C

更多 “《算法导论》习题答案.docx” 相关考题
考题 某个算法的时间复杂度递归式T(n)=T(n-1)+n,其中n为问题的规模,则该算法的渐进时间复杂度为(62),若问题的规模增加了16倍,则运行时间增加(63)倍。 A.O(n) B.O(nlgn) C.O(n2) D.O(n2lgn) 答案:C解析:对于递归式,假设T(1)=1,则: T(n)=T(n-1)+n =T(n-2)+n-1+n =T(n-3)+n-2+n-1+n =1+2+…+n-1+n =n(n+1)/2 可见,时间复杂度为O(n2)。若问题的规模增加了16倍,则运行时间增加了162=256倍。

考题 从具有n个结点的二叉排序树中查找一个元素时,最坏情况下的时间复杂性为()。A、O(n)B、O(1)C、O(log2n)D、O(n2)正确答案:A

考题 单选题设有一个递归算法如下: int fact(int n) {  //n大于等于0               if(n<=0) return 1;               else return n*fact(n-1);        }  则计算fact(n)需要调用该函数的次数为()An+1Bn-1CnDn+2正确答案:A解析:特殊值法。设n=0,易知仅调用一次fact(n)函数,故选A。

考题 从具有n个结点的二叉排序树中查找一个元素时,在最坏情况下的时间复杂度为()。A、 O(n)B、 O(1)C、 O(log2n)D、 O(n2)正确答案:A

考题 递归函数f(n)=f(n-1)+n(n>1)的递归出口是()A、 f(1)=0B、 f(1)=1C、 f(0)=1D、 f(n)=n正确答案:B

考题 对n个元素进行冒泡排序若某趟冒泡中只进行了()次元素间的交换,则表明序列已经排好序。A、1B、2C、0D、n-1正确答案:C

考题 单选题递归函数f(n)=f(n-1)+n(n>1)的递归出口是()Af(1)=0Bf(1)=1Cf(0)=1Df(n)=n正确答案:B解析:暂无解析

考题 某个算法的时间复杂度递归式T(n)=T(n-1)+n,其中n为问题的规模,则该算法的渐进时间复杂度为(请作答此空),若问题的规模增加了16倍,则运行时间增加( )倍。A.O(n) B.O(nlgn) C.O(n2) D.O(n2lgn)答案:C解析:对于递归式,假设T(1)=1,则:T(n)=T(n-1)+n=T(n-2)+n-1+n=T(n-3)+n-2+n-1+n=1+2+…+n-1+n=n(n+1)/2可见,时间复杂度为O(n2)。若问题的规模增加了16倍,则运行时间增加了162=256倍。

考题 给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,请设计一个最坏时间复杂度为O(n)的算法,并对其时间复杂度进行分析说明。正确答案:我们把这种算法叫做快速选择(quickselect)。令〡Si〡为Si中元素的个数,快速选择的步骤如下:1)如果〡S〡=1,那么k=1并将S中的元素作为答案返回。如果正在使用小数组的截止方法且〡S〡≤CUTOFF,则将S排序并返回第k个最小元。2)选取一个枢纽元v∈S。3)将集合S-{v}分割成S1和S2,就像快速排序中所做的那样。4)如果k≤〡S1〡,那么第K个最小元必然在S1中。在这种情况下,返回quickselect(S1,k),如果k=1+〡S1〡,那么枢纽元就是第k个最小元,将它最为答案返回。否则,第k个最小元就在S2中,他是S2中的第(k-〡S1〡-1)个最小元。我们进行一次递归调用并返回quickselect(S2,k-〡S1〡-1)。与快速排序对比,快速选择只进行了一次递归调用而不是两次。快速选择的最坏情形和快速排序的相同,也就是O(N=2)。直观看来,这是因为快速排序的最坏情形发生在S1和S2有一个是空的时候;于是,快速选择也就不是真的节省一次递归调用。不过平均运行时间是O(N)。具体分析类似快速排序的分析。快速排序的实现甚至比抽象描述还要简单,当算法终止时,第k个最小元就在位置k-1上(因为数组开始于下标0)。这破坏了原来的排序;如果不希望这样,那么需要做一份拷贝。

考题 设有一个递归算法如下: int fact(int n) {  //n大于等于0               if(n<=0) return 1;               else return n*fact(n-1);        }  则计算fact(n)需要调用该函数的次数为()A、 n+1B、 n-1C、 nD、 n+2正确答案:A