算法复杂性
算法复杂性 === 算法运行时所需要的计算机资源的量
通常指的是空间、时间资源
影响时间复杂性的因素
影响时间复杂性的因素有: 问题规模nnn、输入序列III、算法本身AAA
- 问题规模:如果相同的序列和算法的前提下,在10个数字中找一个数字和在10万个数字中找一个数字,两者消耗的时间不一样。
-
输入序列:如果相同的规模和算法的前提下,第一个就是要找的数字和最后一个是要找的数字,两者消耗的时间不一样。
-
算法本身:如果相同的序列和规模的前提下,算法效率高的和算法效率低的,两者消耗的时间不一样。
如:
顺序查找:最少111次 ; 最多nnn次
折半查找:最少111次 ; 最多lognlog nlogn次
影响空间复杂性的因素
一般请情况下,在算法使用的数据结构时需要借助大量的辅助空间来帮助完成算法。所以辅助变量影响空间复杂性。如:
- 顺序查找:借助1个循环变量完成。
- 冒泡排序:借助2个循环变量,1个交换的临时变量。
复杂度的表示形式有:
- O(1)O(1)O(1) O(logn)O(logn)O(logn)
- O(n)O(n)O(n) O(nlogn)O(nlogn)O(nlogn)
- O(n2)O(n^2)O(n2) O(2n)O(2^n)O(2n)
- O(nn)O(n^n)O(nn) O(n!)O(n!)O(n!)
算法的渐进复杂性态的引进
设算法的运行时间为T(n)T(n)T(n) ,如果存在T∗(n)T^*(n)T∗(n) , nnn 趋于无穷大使得
limn→∞T(n)−T∗(n)T(n)=0 \lim_{n→∞}\cfrac{T(n)-T^*(n)}{T(n)}=0 n→∞limT(n)T(n)−T∗(n)=0
就称T∗(n)T^*(n)T∗(n)为算法的渐进性态 或 渐进时间复杂性。
当 nnn 很大很大时候T∗(n)T^*(n)T∗(n)就可以代替该算法的时间复杂度,如:
假设算法A的运行的时间表达式T1(n)T_1(n)T1(n)为:
T1(n)=30n4+20n3+40n2+46n+100T_1(n)= 30 n{^4} + 20 n{^3} + 40n{^2} + 46 n+ 100T1(n)=30n4+20n3+40n2+46n+100
令:T1∗(n)=30n4T_1{^*}(n)= 30 n{^4}T1∗(n)=30n4
则:
limn→∞T1(n)−T1∗(n)T1(n)=limn→∞20n3+40n2+46n+10030n4+20n3+40n2+46n+100=0
\lim_{n→∞}\cfrac{T_1(n)-T_1{^*}(n)}{T_1(n)}= \lim_{n→∞}\cfrac{20 n{^3} + 40n{^2} + 46 n+ 100}{30 n{^4} + 20 n{^3} + 40n{^2} + 46 n+ 100}=0
n→∞limT1(n)T1(n)−T1∗(n)=n→∞lim30n4+20n3+40n2+46n+10020n3+40n2+46n+100=0
这样用T1∗(n){T_1}{^*}(n)T1∗(n)代替T1(n)T_1(n)T1(n)简化了时间表达式,便于衡量算法的时间复杂度。
在问题的规模nnn很大很大时,T1∗(n)=30n4≈n4{T_1}{^*}(n)=30{n^4}≈{n^4}T1∗(n)=30n4≈n4
渐进意义下的记号 O、Ω、θO、Ω、θO、Ω、θ
n,f(n)≥0,g(n)≥0n , f(n)≥0,g(n)≥0n,f(n)≥0,g(n)≥0
渐进上界记号 OOO
若存在两个正常数 ccc 和 n0n_0n0 ,使得 n≥n0n≥n_0n≥n0,都有T(n)≤cf(n)T(n)≤cf(n)T(n)≤cf(n),则称T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n)),即f(n)f(n)f(n)是T(n)T(n)T(n)的上界。
例子:
用OOO表示T(n)=10n+4T(n)=10n+4T(n)=10n+4的阶。
- 存在c=12,n0=12c=12 , n_0=12c=12,n0=12,使得 n≥n0n≥n_0n≥n0 都有:
- T(n)=10n+4≤12nT(n) = 10n+4≤12nT(n)=10n+4≤12n成立
- 令f(n)=nf(n) = nf(n)=n,可得T(n)≤cf(n)=12nT(n)≤cf(n)=12nT(n)≤cf(n)=12n
- T(n)=O(f(n))=O(n)T(n) = O(f(n))= O(n)T(n)=O(f(n))=O(n)
例子:
用OOO表示T(n)=n2+nT(n)=n{^2}+nT(n)=n2+n的阶。
- 存在c=2,n0=1c=2 , n_0=1c=2,n0=1,使得 n≥n0n≥n_0n≥n0 都有:
- T(n)=n2+n≤2n2T(n) = n{^2}+n≤2n{^2}T(n)=n2+n≤2n2成立
- 令f(n)=n2f(n) = n{^2}f(n)=n2,可得T(n)≤cf(n)=2n2T(n)≤cf(n)=2n{^2}T(n)≤cf(n)=2n2
- T(n)=O(f(n))=O(n2)T(n) = O(f(n))= O(n{^2})T(n)=O(f(n))=O(n2)
存在c、n0c 、 n_0c、n0即是说只要找到就行,数值不唯一。
渐进下界记号 ΩΩΩ
若存在两个正常数 ccc 和 n0n_0n0 ,使得 n≥n0n≥n_0n≥n0,都有T(n)≥cf(n)T(n)≥cf(n)T(n)≥cf(n),则称T(n)=Ω(f(n))T(n)=Ω(f(n))T(n)=Ω(f(n)),即f(n)f(n)f(n)是T(n)T(n)T(n)的下界。与OOO相对
例子:
用ΩΩΩ表示T(n)=30n4+20n3+40n2+46n+100T(n)= 30 n{^4} + 20 n{^3} + 40n{^2} + 46n+ 100T(n)=30n4+20n3+40n2+46n+100
- 存在c=30,n0=1c=30 ,n_0=1c=30,n0=1,使得n≥n0n≥n_0n≥n0都有T(n)≥30n4T(n)≥30n^4T(n)≥30n4
- 构造f(n)=n4f(n)=n{^4}f(n)=n4,可得T(n)≥cf(n)=30n4T(n)≥cf(n)=30n^4T(n)≥cf(n)=30n4,
- 即T(n)=Ω(f(n))=Ω(n4)T(n)=Ω(f(n))=Ω(n^4)T(n)=Ω(f(n))=Ω(n4)
渐进精确界记号 θθθ
若存在3个正常数 c1、c2c_1、c_2c1、c2 和 n0n_0n0 ,使得 n≥n0n≥n_0n≥n0,都有c2f(n)≤T(n)≤c1f(n)c_2f(n)≤T(n)≤c_1f(n)c2f(n)≤T(n)≤c1f(n),则称T(n)=θ(f(n))T(n)=θ(f(n))T(n)=θ(f(n))。
例子:
用θθθ表示T(n)=20n2+8n+10T(n)=20n^2+8n+10T(n)=20n2+8n+10的阶
①①① 求得上界:
存在c1=29,n0=10c_1=29,n_0=10c1=29,n0=10,使得n≥n0n≥n_0n≥n0都有:
T(n)≤20n2+8n+n=20n2+9n≤20n2+9n2=29n2T(n)≤20n^2+8n+n=20n^2+9n≤20n^2+9n^2=29n^2T(n)≤20n2+8n+n=20n2+9n≤20n2+9n2=29n2。
构造f(n)=n2f(n)=n^2f(n)=n2,可得T(n)≤c1f(n)=29n2T(n)≤c_1f(n)=29n^2T(n)≤c1f(n)=29n2,即T(n)=O(f(n))=O(n2)T(n)=O(f(n))=O(n^2)T(n)=O(f(n))=O(n2);
②②② 求得下界:
存在c2=20,n0=10c_2=20,n_0=10c2=20,n0=10,使得n≥n0n≥n_0n≥n0都有T(n)≥20n2T(n)≥20n^2T(n)≥20n2
构造f(n)=n2f(n)=n^2f(n)=n2,可得T(n)≥c2f(n)T(n)≥c_2f(n)T(n)≥c2f(n)即T(n)=Ω(f(n))=Ω(n2)T(n)=Ω(f(n))=Ω(n^2)T(n)=Ω(f(n))=Ω(n2)
③③③ 求得精确界:
存在c1=29、c2=20c_1=29、c_2=20c1=29、c2=20和n0=10n_0=10n0=10,使得你≥n0你≥n_0你≥n0都有:
20n2≤T(n)≤29n220n^2≤T(n)≤29n^220n2≤T(n)≤29n2 可得T(n)=θ(f(n))=θ(n2)T(n)=θ(f(n))=θ(n^2)T(n)=θ(f(n))=θ(n2)。
本文详细介绍了算法复杂性,包括时间复杂性和空间复杂性的影响因素,如问题规模、输入序列和算法本身。通过举例说明了不同查找算法的时间复杂度,并探讨了如何表示和衡量算法复杂度。此外,还阐述了渐进复杂性态的概念,以及O、Ω、θ符号在表示算法复杂性上的应用。通过对具体算法的分析,展示了如何使用这些符号来简化和比较算法的时间复杂度。
1878

被折叠的 条评论
为什么被折叠?



