多数情况:贪心>动态规划【同阶,但是系数不同】
增长的记号: O渐近上界,o f比g低阶,Ω渐近下界,ω f比g高阶,Θ渐近紧界
算法效率评价的指标:
算法对计算机资源的使用:
1.计算资源(时间)
2.存储资源(内存)
计算机资源的计量方法:
设输入数据/问题规模为n。假设算法要用到:
- (1)m种元运算;
- (2)每种元运算执行的时间为t1,t2,…,tm;
- (3)每种元运算执行的次数为e1,e2,…,em;
- (4)元运算与问题规模的关系:∀ ei (n),1≤i≤m。
若用T(n)表示对资源占用的时间,成为时间复杂性函数,则有
【 时间复杂度 = m种元运算的 执行时间*执行次数 的和】
qwl:
问题:
算法:
- 算法时间复杂度:针对指定基本运算,计数算法所做运算次数。
- 基本运算:比较,加法,乘法,置指针,交换。
- 输入规模:输入串编码长度。常用下述参数度量:数组元素多少,调度问题的任务个数,图的顶点数与边数。
- 算法基本运算次数 可表为 输入规模的函数。
- 给定问题和基本运算就决定了一个算法类。
输入规模:
基本运算:
算法的两种时间复杂度:
例子:元运算的提取及占用资源时间的计算:
【例2-1】输出n*n三角矩阵,,试分析该算法的时间复杂度。
次数最多 ---4
k++算一个
printf 算一个
j<=i判断次数多一次
j++
次数次多 ---5
i<n
i++
j=0
for循环一整个
printf("\n")
最少(一次)---5
定义
赋值
scanf
i=0
for循环一整个
数学基础:
函数的渐近的界
算法A的时间复杂性函数:T(n)
问题规模:n
渐近态:T'(n)
存在T'(n) 使得n足够大时:(T-T')/T -> 0
增长的阶:
描述算法的效率——增长率。
忽略低阶项,保留最高阶项。
忽略常系数。
利用O(n^2)表示插入排序的最坏运行时间。——表示增长率和n^2相同
渐进效率:
- 输入规模非常大
- 忽略低阶项和常系数
- 只考虑最高阶(增长的阶)
定义2.1
设
f
和
g
是定义域为自然数集N上的函数。
(1)
若
∃
c>0
和
n
0
>0
使得所有 n
≥ n0
,
有
0 ≤ f(n) ≤ c*g (n )成立, 则称
f(n)
的渐近上界是
g(n),
记作
:
f(n)=Ο(g(n))
。
(2)
若
∃
c>0
和
n
0
>0
使得所有的n
≥ n0
,
有
0 ≤ c*g(n) ≤ f(n) ,则 称
f(n)
的渐近下界是
g(n),
记作
:
f(n)=Ω(g(n))
。
- 描述运行时间的最好情况。---最小,最起码。
- 对所有输入都正确。
- 可以用来描述问题
- 如,排序问题的时间复杂性是Ω(n)
(3)
若对于
∀ c>0
都存在非负整数
n
0
,
使得当
n≥ n
0
时有0 ≤ f(n)
<
c*g (n)
成立,则称函数
f(n)
当
n
充分大时,比
g(n)低阶,记为 f(n)=o(g(n))
。
(4)
若
∀c>0
都存在
n
0
>0
,使得当n≥ n0时有0 ≤ c*g (n )
<
f(n) 成立,则称函数f(n) 比
g(n)
高阶,记为
f(n)=ω(g(n))。
(5)
若
f(n)=Ο(g(n)) 且
f(n)=Ω(g(n))时,则记
f(n)
= Θ(g (n )), 称g(n)是
f(n)
的渐近的紧的界。
f(n)
与
g(n)同阶。
c
2
g(n)≤f(n)≤c
1
g(n)
例:素数测试{qwl}
思考题:
【例2-2】设有函数f(n)=n**2+3n+1,当n足够大时,试证明下述内容:
(1)
f(n)=O(n**
2
)
和
f(n)=O(n**
3
)
成立;
(2)
f(n)=o(n**
2
)
不成立。
证明:
(1)
f(n)=n**
2
+3n+1< n**
2
+3n**
2
+n**
2
=5n**
2
,
则存在
c=5
使得当
n≥1时, f(n)=O(n**
2
)
成立。
又因为
5n**
2
≤5n**
3
,所以,存在
c=5
使得当
n≥1
时,
f(n)=O(n**
3
)
成立。
(2)
要使
n**
2
+3n+1<n**
2
,
就要使
1+3/n+1/n
2
<1
,显然这不成立。
也就是说,找不到一个
n
0
,当
n≥n
0
且
c为任意小时,使得 f(n)=o(n
2
)
成立。
定理
2.1(
传递性
)
设
f
、
g
、
h
是定义域为自然数集合,
如果
f=O(g)
且
g=O(h)
,那么
f=O(h)
;
如果
f=Ω(g)
且
g=Ω(h)
,那么
f=Ω(h)
;
如果
f=Θ(g)
且
g=Θ(h)
,那么
f=Θ(h)
。
定理
2.2
有f=O(h)
和
g=O(h)
,那么
f+g=O(h)
。
证明:根据定义,
存在某个常数
c
1
和
n
1
,对所有的
n≥n
1
有
f(n)≤c
1
h(n)
。
存在某个常数
c
2
和
n
2
,对所有的
n≥n
2
,有
g(n)≤c
2
h(n)
。则有
f(n)+ g(n) ≤c
1
h(n)+c
2
h(n)=(c
1
+ c
2
)h(n)
,
令
c=c
1
+c
2
,
n
0
=max{n
1
,n
2
}
,当
n≥n0
时,有
f(n) +g(n) ≤ch(n),因此 f+g=O(h)
。
推广:
f
1
+f
2
+…+f
m
=O(h)
m要远小于问题规模n
注意:
定义
1,2
中的
c,n
0
是存在的
定义
2,3
中
c
是任意小的
(ε)
,
必须找到
n
0
定义
5(
请注意那个眼神
)
常用的渐进函数及其渐近的界
证明不同底的对数 是同阶:1用定义 2.一比是常数
重要结果:
1.多项式函数的阶 低于 指数函数的阶——反复洛必达
1.多项式函数的阶 高于 对数函数的阶
对数低于多项式;多项式低于指数
对数函数的阶低于幂函数的阶
利用极限求函数渐近的界
比如汉诺塔是 2^n
有用的求和级数及推导方法: