算法分析
1、前提:计算机模型
使用RAM模型,即指令一条接一条执行,并没有并发操作。并且每条指令执行时间为常量
C
j
C_{j}
Cj。
2、实例:插入排序算法的分析。伪代码如下:
时间为每条指令运行时间总和。对应原始之积求和:
T
(
n
)
=
C
1
n
+
C
2
(
n
−
1
)
+
C
4
(
n
−
1
)
+
C
5
∑
j
=
2
n
t
j
+
C
6
∑
j
=
2
n
(
t
j
−
1
)
+
C
7
∑
j
=
2
n
(
t
j
−
1
)
+
C
8
(
n
−
1
)
T(n)=C_{1}n+C_{2}(n-1)+C_{4}(n-1)+C_{5}\sum_{j=2}^{n}t_{j}+C_{6}\sum_{j=2}^{n}(t_{j}-1)+C_{7}\sum_{j=2}^{n}(t_{j}-1)+C_{8}(n-1)
T(n)=C1n+C2(n−1)+C4(n−1)+C5j=2∑ntj+C6j=2∑n(tj−1)+C7j=2∑n(tj−1)+C8(n−1)
3、最好情况和最坏情况分析
最好情况:数组已经排好序,最短运行时间为
T
(
n
)
=
C
1
n
+
C
2
(
n
−
1
)
+
C
4
(
n
−
1
)
+
C
5
(
n
−
1
)
+
C
8
(
n
−
1
)
T(n) = C_{1}n+C_{2}(n-1)+C_{4}(n-1)+C_{5}(n-1)+C_{8}(n-1)
T(n)=C1n+C2(n−1)+C4(n−1)+C5(n−1)+C8(n−1)
=
(
C
1
+
C
2
+
C
4
+
C
5
+
C
8
)
n
−
(
C
2
+
C
4
+
C
5
+
C
8
)
=(C_{1}+C_{2}+C_{4}+C_{5}+C_{8})n-(C_{2}+C_{4}+C_{5}+C_{8})
=(C1+C2+C4+C5+C8)n−(C2+C4+C5+C8)
则可得:T(n)=an+b
因此最佳情况是关于n的线性函数。
最坏情况:数组反向排序,最长运行时间
T
(
n
)
=
C
1
+
C
2
(
n
−
1
)
+
C
4
(
n
−
1
)
+
C
5
(
n
(
n
−
1
)
2
−
1
)
+
C
6
(
n
(
n
−
1
)
2
)
+
C
7
(
n
(
n
−
1
)
2
)
+
C
8
(
n
−
1
)
T(n)=C_{1}+C_{2}(n-1)+C_{4}(n-1)+C_{5}(\frac{n(n-1)}{2}-1)+C_{6}(\frac{n(n-1)}{2})+C_{7}(\frac{n(n-1)}{2})+C_{8}(n-1)
T(n)=C1+C2(n−1)+C4(n−1)+C5(2n(n−1)−1)+C6(2n(n−1))+C7(2n(n−1))+C8(n−1)
T
(
n
)
=
(
C
5
2
+
C
6
2
+
C
7
2
)
n
2
+
(
C
1
+
C
2
+
C
4
+
C
5
2
−
C
6
2
−
C
7
2
)
n
−
(
C
2
+
C
4
+
C
5
+
C
8
)
T(n) = (\frac{C_{5}}{2}+\frac{C_{6}}{2}+\frac{C_{7}}{2})n^2+(C_{1}+C_{2}+C_{4}+\frac{C_{5}}{2}-\frac{C_{6}}{2}-\frac{C_{7}}{2})n-(C_{2}+C_{4}+C_{5}+C_{8})
T(n)=(2C5+2C6+2C7)n2+(C1+C2+C4+2C5−2C6−2C7)n−(C2+C4+C5+C8)
则可得:
T
(
n
)
=
a
n
2
+
b
n
+
c
T(n) = an^2+bn+c
T(n)=an2+bn+c
因此最长时间是关于n的2次函数。
4、增长量级:
最坏情况表示为:
T
(
n
)
=
a
n
2
+
b
n
+
c
T(n) = an^2+bn+c
T(n)=an2+bn+c
我们关心的是运行时间的增长率或增长量级,所以我们之考虑公式中的总要项(例如:
a
n
2
an^2
an2),因为当n很大时,低阶项相对来说不太总要。我们也忽略重要项的常数系,因为对于大的输入,在确定计算效率时常量因子不如增长率重要。所有只剩下重要项中的
n
2
n^2
n2,即最坏情况运行时间为
Θ
(
n
2
)
\Theta (n^2)
Θ(n2)。