第三讲 算法的复杂度分析与最优算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章引论
算
2
增长阶
例:
sum=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
sum++;
3
增长阶
T(n)=O(n2)
4
算法分析的基本法则
非递归算法:
(1)for / while 循环
循环体内计算时间*循环次数;
(2)嵌套循环
循环体内计算时间*所有循环次数;
(3)顺序语句
各语句计算时间相加;
(4)if-else语句
if语句计算时间和else语句计算时间的较大者。
5
递归算法复杂性分析
(
=
)
9
10
最优算法
问
例
堆
如何证明算法A是最优算法?
1.分析算法的最差情况复杂度W
A
(n),
2.建立算法A所解决的问题的复杂度下界W
[A](n) 。
即对于所有规模为n的输入,证明与算法A同类的所有算法(包括已知的和未知的)的最差情况复杂度≥W[A](n) ,
3.If W
A (n) = Θ( W
[A]
(n) )则算法A是最优算法。
11
例:查找最大元素
Algorithm A (顺序查找算法)
int findMax(int[] E, int n)
1. int max;
2. max = E[0]; // Assume the first is max.
3. for (index = 1; index < n; index++)
4. if (max < E[index])
5. max = E[index];
6. return max;
12
W A(n)
算法的基本运算是将数组中的元素两两进行比较,每个元素都至少比较一次,因此该算法的最差情况以及最佳情况和平均情况下的复杂度都一样。所以这个算法的最差情况复杂度为:
W A(n) = n-1 ∈Θ(n)
13
W[A](n)
所有通过比较方式进行查找的算法构成类[A],
推导W[A](n)
因为考虑的是这类算法的最差情况复杂度,不妨设输
入数组的元素是互不相同的。
既然n元数组中的元素各不相同,所以数组的最大元素
只能有一个,即其余的n−1个元素都不会是最大元素。
而对于这n−1个元素中的每一个来说,要判定它不是数
组的最大元素,至少得找到一个比它更大的元素,因
此需要至少一次比较。所以为了找出最大元素,算法
至少需要n−1次比较,即W[A](n) = n –1。
由W A(n) = W[A](n), 算法A 是最优算法.
14
增长阶比较
15
增长阶比较(n<15)
16
补充:算法渐近复杂性分析中常用函数
(1)单调函数
单调递增:m≤n⇒f(m) ≤f(n);
单调递减:m≤n⇒f(m) ≥f(n);
严格单调递增:m< n⇒f(m) < f(n);
严格单调递减:m< n⇒f(m) > f(n).
(2)取整函数
⎣x ⎦:不大于x的最大整数;
⎡x⎤:不小于x的最小整数。
17
取整函数的若干性质
x-1 < ⎣x ⎦≤x ≤⎡x⎤< x+1;
⎣n/2⎦+ ⎡n/2 ⎤= n;
对于n≥0,a,b>0,有:
⎡⎡n/a⎤/b⎤= ⎡n/ab⎤;
⎣⎣n/a ⎦/b ⎦= ⎣n/ab⎦;
⎡a/b⎤≤(a+(b-1))/b;
⎣a/b ⎦≥(a-(b-1))/b;
f(x)= ⎣x ⎦, g(x)= ⎡x⎤为单调递增函数。
18
(3)多项式函数
p(n)= a
+a1n+a2n2+…+a d n d;a d>0;
p(n) = Θ(n d);
f(n) = O(n k) ⇔f(n)多项式有界;
f(n) = O(1) ⇔f(n) ≤c;
k ≥d⇒p(n) = O(n k) ;
k ≤d⇒p(n) = Ω(n k) ;
k >d⇒p(n) = o(n k) ;
k < d⇒p(n) = ω(n k) .
19
22
(5)对数函数log n = log 2n ;lg n = log 10n ;ln n = log e n ;log k n = (log n )k ;
log log n = log(log n );for a>0,b>0,c>0
a
b b a log =
24(6)阶乘函数
00
)!1(1!>=⎩⎨⎧−=n n n n n n
n "321!⋅⋅=
The End
25