算法导论作业2.2

算法导论作业2.2

2.2-1

Θ ( n 3 ) \Theta(n^3) Θ(n3)

2.2-2

算法过程:
从A[1~n]中找比A[1]小的与A[1]交换
从A[2~n]中找比A[2]小的与A[2]交换

从A[n-1,n]中找比A[n-1]小的与A[n-1]交换
第一个问题:
该算法的循环不变式是A[1~i],
初始:当i=1的时候,从整个数组中选出最小的数字放在A[1],此时成立
保持:在其中i等于任意值的时候,A[1~i]总是升序,此性质成立
终止:当i=n-1的时候,A[1~n-1]是升序的同时,由于之前选出的都是每一次循环的最小值,也就是A[n]的值为该数组的最大值,因此,此时序列变得有序,算法正确。
第二个问题:
因为只对前n-1个元素进行排序之后,整个序列就有序了。
第三个问题:
算法伪代码:

for i=1 to A.length-1
	for j=i+1 to A.length
		if A[j] < A[i]
			tmp=A[i]
			A[i]=A[j]
			A[j]=tmp

上述共8行代码,用ci表示第i行代码,最坏情况是数组初始为逆序,if下面所有语句要执行,反之,是顺序,if下面所有语句不用执行。
最坏情况有:
T ( n ) = c 1 n + c 2 ∑ j = 2 n ( n − j + 2 ) + ( c 3 + c 4 + c 5 + c 6 ) ∑ j = 2 n ( n − j + 1 ) = c 1 n + c 2 n ( n + 1 ) 2 + ( c 3 + c 4 + c 5 + c 6 ) n ( n − 1 ) 2 \begin{aligned}T(n) &=c_1n+c_2\sum^{n}_{j=2}{(n-j+2)}+(c_3+c_4+c_5+c_6)\sum^{n}_{j=2}{(n-j+1)}\\ &=c_1n+c_2\frac{n(n+1)}{2}+(c_3+c_4+c_5+c_6)\frac{n(n-1)}{2} \end{aligned} T(n)=c1n+c2j=2n(nj+2)+(c3+c4+c5+c6)j=2n(nj+1)=c1n+c22n(n+1)+(c3+c4+c5+c6)2n(n1)
所以算法时间为: Θ ( n 2 ) \Theta(n^2) Θ(n2)
最好情况有:
T ( n ) = c 1 n + c 2 ∑ j = 2 n ( n − j + 2 ) + c 3 ∑ j = 2 n ( n − j + 1 ) = c 1 n + c 2 n ( n + 1 ) 2 + c 3 n ( n − 1 ) 2 \begin{aligned}T(n) &=c_1n+c_2\sum^{n}_{j=2}{(n-j+2)}+c_3\sum^{n}_{j=2}{(n-j+1)}\\ &=c_1n+c_2\frac{n(n+1)}{2}+c_3\frac{n(n-1)}{2} \end{aligned} T(n)=c1n+c2j=2n(nj+2)+c3j=2n(nj+1)=c1n+c22n(n+1)+c32n(n1)
所以算法时间为: Θ ( n 2 ) \Theta(n^2) Θ(n2)

2.2-3

在2.1-3中的伪代码如下:

for i=1 to A.length
	if A[i]==v:
		print i
		break
print NIL

平均查找长度:
查找元素等概率为数组任意元素的时候,当为第i为个元素时,循环查找i个元素才能找到,所以平均查找元素为:
1 n ∑ i = 1 n i = 1 n ∗ n ( n + 1 ) 2 = n + 1 2 \frac{1}{n}\sum^{n}_{i=1}{i}=\frac{1}{n}*\frac{n(n+1)}{2}=\frac{n+1}{2} n1i=1ni=n12n(n+1)=2n+1
所以平均查找长度为n+1次;

将用ci表示伪代码第i行语句执行时间,
平均情况时:
在第i次查找到时,语句执行总时间如下:
( c 1 + c 2 ) i + c 3 + c 4 + c 5 (c_1+c_2)i+c_3+c_4+c_5 (c1+c2)i+c3+c4+c5
那么总时间为:
T ( n ) = 1 n ∑ i = 1 n ( ( c 1 + c 2 ) i + c 3 + c 4 + c 5 ) = c 3 + c 4 + c 5 + ( c 1 + c 2 ) 1 n ∑ i = 1 n i = ( c 1 + c 2 ) ∗ n + 1 2 + c 3 + c 4 + c 5 \begin{aligned}T(n) &=\frac{1}{n}\sum^{n}_{i=1}{((c_1+c_2)i+c_3+c_4+c_5)}\\ &=c_3+c_4+c_5+(c_1+c_2)\frac{1}{n}\sum^{n}_{i=1}{i}\\ &=(c_1+c_2)*\frac{n+1}{2}+c_3+c_4+c_5 \end{aligned} T(n)=n1i=1n((c1+c2)i+c3+c4+c5)=c3+c4+c5+(c1+c2)n1i=1ni=(c1+c2)2n+1+c3+c4+c5
所以算法时间为 Θ ( n ) \Theta(n) Θ(n)
最坏情况:
最坏情况为无论多少次,都是查找到最后一个元素才找到。
语句执行总时间为:
( c 1 + c 2 ) n + c 3 + c 4 + c 5 (c_1+c_2)n+c_3+c_4+c_5 (c1+c2)n+c3+c4+c5

2.2-4

目前体会就是:从大的角度来说,尽量降低算法的时间复杂度,从小的角度来说尽量减少不必要的语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值