算法导论练习 2.2 Analyzing algorithms

1

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


2

选择排序的伪码:

for i = 1 to A.length - 1
	min = i
	for j = i to A.length
		if A[j] < min
			min = j
	swap(a[i], a[min])

最外层 for 的循环不变量:每次迭代开始时 A A A 的子数组 A [ 1 … i − 1 ] A[1\dots i-1] A[1i1] 是非递减排列的。

每次迭代开始时 A A A 的子数组 A [ 1 … i − 1 ] A[1\dots i-1] A[1i1] 是非递减排列的,且是数组 A A A 中最小的 i − 1 i-1 i1 个元素。

为什么只需要跑 n - 1 次?因为第 n - 1 次迭代结束后, A A A 的子数组 A [ 1 … A . l e n g t h − 1 ] A[1\dots A.length-1] A[1A.length1] 是非递减排列的,且 A [ A . l e n g t h ] A[A.length] A[A.length] 显然是数组中最大的数,所以 A A A 是非递减排列的。

时间复杂度:最好情况: Θ ( n 2 ) \Theta(n^2) Θ(n2),最坏情况: Θ ( n 2 ) \Theta(n^2) Θ(n2)


3

平均检查次数: 1 n ∑ i = 1 n i = n + 1 2 \frac{1}{n}\sum_{i=1}^ni=\frac{n+1}{2} n1i=1ni=2n+1,时间复杂度 Θ ( n ) \Theta(n) Θ(n)
最坏情况的检查次数: n n n,时间复杂度 Θ ( n ) \Theta(n) Θ(n)


4

把所有算法都按照最好情况下的输出来优化代码。

为所有算法都加上一个特殊情况,如果输入满足这种特殊情况的话就返回预先准备好的输出。


注:引用里的解答都是看这个网站写的:CLRS Solutions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值