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=2∑n(n−j+2)+(c3+c4+c5+c6)j=2∑n(n−j+1)=c1n+c22n(n+1)+(c3+c4+c5+c6)2n(n−1)
所以算法时间为:
Θ
(
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=2∑n(n−j+2)+c3j=2∑n(n−j+1)=c1n+c22n(n+1)+c32n(n−1)
所以算法时间为:
Θ
(
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}
n1∑i=1ni=n1∗2n(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=1∑n((c1+c2)i+c3+c4+c5)=c3+c4+c5+(c1+c2)n1i=1∑ni=(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
目前体会就是:从大的角度来说,尽量降低算法的时间复杂度,从小的角度来说尽量减少不必要的语句