您的位置:首页 > 其它

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

2017-05-11 21:54 204 查看
2.3-2

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

作答:

MERGE(A,p,q,r)
1	n1 = q - p + 1
2	n2 = r - q
3	let L[1..n1] and R[1..n2] be new arrays
4	for i = 1 to n1
5		L[i] = A[p+i-1]
6	for j = 1 to n2
7		R[j] = A[q+j]
8	i = 1
9	j = 1
10	k = q
11	while i <= n1 and j <= n2
12		if L[i] <= R[j]
13			A[k] = L[i]
14			i = i + 1
15		else A[k] = R[j]
16			j = j + 1
17		k = k + 1
18	if i <= n1
19		for i to n1
20			A[k] = L[i]
21			k = k + 1
22	else for j to n2
23			A[k] = R[j]
24			k = k + 1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.3-3

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

证明:

当k = 1时,

,由题中递归式得:

,该结果与待证明的式子结果相等:

,故成立;

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

成立;

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


,成立

所以,

对当k >= 1时均成立。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

INSERTION-SORT(A)		//假设排成不减序列
1	if A.length == 1	//假设输入的数组为有效输入
2		return
3	else INSERTION-SORT(A[1..A.length-1])	//规模缩减
4		INSERT(A[1..A.length-1],A[A.length])//结果合并
5	return

注:INSERT(A[1..i],v)函数实现将单个值插入到已排好序的数组A中

INSERT(A[1..i],v)	//i取值在整个A的长度范围内
1	j = i
2	while j >= 1 and A[j] > v
3		A[j+1] = A[j]
4		j = j - 1
5	A[j+1] = v		//将v插入到正确的位置
对于最坏情况时,INSERT函数的时间复杂度为:

,i为输入规模;

经简单分析得:
                           


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

2.3-5
分析:考查迭代递归算法,伪代码书写,分析算法时间复杂度;
作答:(假设输入A为单调不减序列)
(1)迭代版:
BINARY-SEARCH(A,v)
1 L = 1 //记录数组索引下界
2 H = A.length //记录数组索引上界
3 M = (L + H) / 2 //记录数组中间位置的索引
4 while L <= H
5 if A[M] == v
6 return M
7 elseif A[M] > v
8 H = M - 1
9 M = (L + H) / 2
10 elseif A[M] < v
11 L = M + 1
12 M = (L + H) / 2
13 return NIL(2)递归版:
//p,q记录要考查的子数组在A中的范围索引
//p表示下界,q表示上界
BINARY-SEARCH(A,p,q,v)
1 if p > q //递归出口1
2 return NIL
3 elseif p == q //递归出口2
4 if A[p] == v
5 return p
6 else return NIL
7 else L = p
8 H = q
9 M = (L + H) / 2
10 if A[M] == v
11 return M
12 elseif A[M] > v
13 return BINARY-SEARCH(A,L,M-1,v)
14 elseif A[M] < v
15 return BINARY-SEARCH(A,M+1,H,v)关于时间复杂度为

的证明,水平有限,没能给出详细过程;但是,简单分析下,从迭代版可知,时间复杂度主要取决于while循环迭代的次数,而长度为n的数组,在最坏情况下,只能当问题规模缩减为1时才能求解,所以,问题规模由n以每次缩减一半规模的速度降至1,只用缩减lgn的量级的次数就可以实现。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

加油!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息