《算法导论》课后题--2--第二章(1)

来源:互联网 发布:测试心理的软件 编辑:程序博客网 时间:2024/05/22 09:40

2.3-2

分析:该题是对课本例子的简单改写;

作答:

MERGE(A,p,q,r)1n1 = q - p + 12n2 = r - q3let L[1..n1] and R[1..n2] be new arrays4for i = 1 to n15L[i] = A[p+i-1]6for j = 1 to n27R[j] = A[q+j]8i = 19j = 110k = q11while i <= n1 and j <= n212if L[i] <= R[j]13A[k] = L[i]14i = i + 115else A[k] = R[j]16j = j + 117k = k + 118if i <= n119for i to n120A[k] = L[i]21k = k + 122else for j to n223A[k] = R[j]24k = k + 1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.3-3

分析:本题考查“数学归纳法”

证明:

当k = 1时,,由题中递归式得:,该结果与待证明的式子结果相等:,故成立;

假设当k = i (i > 1)时,有递归式的解为成立;

当k = i + 1时,由题目得:

,成立

所以, 对当k >= 1时均成立。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.3-4

分析:本题考查递归式的书写,内容是“插入排序递归版”

作答:

INSERTION-SORT(A)//假设排成不减序列1if A.length == 1//假设输入的数组为有效输入2return3else INSERTION-SORT(A[1..A.length-1])//规模缩减4INSERT(A[1..A.length-1],A[A.length])//结果合并5return注:INSERT(A[1..i],v)函数实现将单个值插入到已排好序的数组A中INSERT(A[1..i],v)//i取值在整个A的长度范围内1j = i2while j >= 1 and A[j] > v3A[j+1] = A[j]4j = j - 15A[j+1] = v//将v插入到正确的位置
对于最坏情况时,INSERT函数的时间复杂度为:,i为输入规模;

经简单分析得:

                           

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.3-5

分析:考查迭代递归算法,伪代码书写,分析算法时间复杂度;

作答:(假设输入A为单调不减序列)

(1)迭代版:

BINARY-SEARCH(A,v)1L = 1//记录数组索引下界2H = A.length//记录数组索引上界3M = (L + H) / 2//记录数组中间位置的索引4while L <= H5if A[M] == v6return M7elseif A[M] > v8H = M - 19M = (L + H) / 210elseif A[M] < v11L = M + 112M = (L + H) / 213return NIL
(2)递归版:

//p,q记录要考查的子数组在A中的范围索引//p表示下界,q表示上界BINARY-SEARCH(A,p,q,v)1if p > q            //递归出口12return NIL3elseif p == q //递归出口24if A[p] == v5return p6else return NIL7else L = p8H = q9M = (L + H) / 210if A[M] == v11return M12elseif A[M] > v13return BINARY-SEARCH(A,L,M-1,v)14elseif A[M] < v15return BINARY-SEARCH(A,M+1,H,v)
关于时间复杂度为的证明,水平有限,没能给出详细过程;但是,简单分析下,从迭代版可知,时间复杂度主要取决于while循环迭代的次数,而长度为n的数组,在最坏情况下,只能当问题规模缩减为1时才能求解,所以,问题规模由n以每次缩减一半规模的速度降至1,只用缩减lgn的量级的次数就可以实现。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

加油!!!奋斗

0 0
原创粉丝点击