个人主页:丷从心·
系列专栏:算法
1.1|算法与程序
算法
性质
-
确定性:组成算法的每条指令是清晰的,无歧义的
-
有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
程序
- 程序可以不满足有限性
1.2|算法复杂性分析
算法复杂性
-
分别用 N N N、 I I I和 A A A表示算法要解的问题的规模、算法的输入和算法本身,用 C C C表示复杂性,有 C = F ( N , I , A ) C = F(N , I , A) C=F(N,I,A)
-
通常 A A A隐含在复杂性函数名当中
时间复杂性
- T ( N , I ) T(N , I) T(N,I)是算法在一台抽象的计算机上运行所需要的时间,设此抽象的计算机提供的元运算有 k k k种,分别记为 O 1 O_{1} O1, O 2 O_{2} O2, ⋯ \cdots ⋯, O k O_{k} Ok,每执行一次这些元运算所需要时间分别为 t 1 t_{1} t1, t 2 t_{2} t2, ⋯ \cdots ⋯, t k t_{k} tk
- 对于给定的算法 A A A,经统计,用到元运算 O i O_{i} Oi的次数为 e i ( i = 1 , 2 , ⋯ , k ) e_{i} (i = 1 , 2 , \cdots , k) ei(i=1,2,⋯,k),对于每个 i ( 1 ≤ i ≤ k ) i (1 \leq i \leq k) i(1≤i≤k), e i e_{i} ei是 N N N和 I I I的函数,即 e i = e i ( N , I ) e_{i} = e_{i}(N , I) ei=ei(N,I),因此有 T ( N , I ) = ∑ i = 1 k t i e i ( N , I ) T(N , I) = \displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , I)} T(N,I)=i=1∑ktiei(N,I)
最坏情况下的时间复杂性
-
T max ( N ) = max I ∈ D N T ( N , I ) = max I ∈ D N ∑ i = 1 k t i e i ( N , I ) = ∑ i = 1 k t i e i ( N , I ∗ ) = T ( N , I ∗ ) T_{\max}(N) = \max\limits_{I \in D_{N}}{T(N , I)} = \max\limits_{I \in D_{N}}{\displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , I)}} = \displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , I^{*})} = T(N , I^{*}) Tmax(N)=I∈DNmaxT(N,I)=I∈DNmaxi=1∑ktiei(N,I)=i=1∑ktiei(N,I∗)=T(N,I∗)
-
D N D_{N} DN是规模为 N N N的合法输入的集合, I ∗ I^{*} I∗是 D N D_{N} DN中使 T ( N , I ) T(N , I) T(N,I)达到 T max ( N ) T_{\max}(N) Tmax(N)的合法输入
最好情况下的时间复杂性
-
T min ( N ) = min I ∈ D N T ( N , I ) = min I ∈ D N ∑ i = 1 k t i e i ( N , I ) = ∑ i = 1 k t i e i ( N , I ~ ) = T ( N , I ~ ) T_{\min}(N) = \min\limits_{I \in D_{N}}{T(N , I)} = \displaystyle\min\limits_{I \in D_{N}}{\displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , I)}} = \displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , \tilde{I})} = T(N , \tilde{I}) Tmin(N)=I∈DNminT(N,I)=I∈DNmini=1∑ktiei(N,I)=i=1∑ktiei(N,I~)=T(N,I~)
-
I ~ \tilde{I} I~是 D N D_{N} DN中使 T ( N , I ) T(N , I) T(N,I)达到 T min ( N ) T_{\min}(N) Tmin(N)的合法输入
平均情况下的时间复杂性
-
T a v g ( N ) = ∑ I ∈ D N P ( I ) T ( N , I ) = ∑ I ∈ D N P ( I ) ∑ i = 1 k t i e i ( N , I ) T_{\mathrm{avg}}(N) = \displaystyle\sum\limits_{I \in D_{N}}{P(I) T(N , I)} = \displaystyle\sum\limits_{I \in D_{N}}{P(I) \displaystyle\sum\limits_{i = 1}^{k}{t_{i} e_{i}(N , I)}} Tavg(N)=I∈DN∑P(I)T(N,I)=I∈DN∑P(I)i=1∑ktiei(N,I)
-
P ( I ) P(I) P(I)是在算法的应用中出现输入 I I I的概率
渐进复杂性
-
当 N N N单调增大且趋于 ∞ \infty ∞时, T ( N ) T(N) T(N)一般也将单调增大且趋于 ∞ \infty ∞
-
对于 T ( N ) T(N) T(N),如果存在 T ~ ( N ) \tilde{T}(N) T~(N),当 N → ∞ N \rightarrow \infty N→∞时,使得 ( T ( N ) − T ~ ( N ) ) / T ( N ) → 0 (T(N) - \tilde{T}(N)) / T(N) \rightarrow 0 (T(N)−T~(N))/T(N)→0,就说 T ~ ( N ) \tilde{T}(N) T~(N)是 T ( N ) T(N) T(N)当 N → ∞ N \rightarrow \infty N→∞时的渐进性态,或称 T ~ ( N ) \tilde{T}(N) T~(N)为算法 A A A当 N → ∞ N \rightarrow \infty N→∞的渐进复杂性
-
T ~ ( N ) \tilde{T}(N) T~(N)是 T ( N ) T(N) T(N)中略去低阶项留下的主项,比 T ( N ) T(N) T(N)简单
O表示法
- 设 f ( N ) f(N) f(N)和 g ( N ) g(N) g(N)是定义在正数集上的正函数,如果存在正的常数 C C C和自然数 N 0 N_{0} N0,使得当 N ≥ N 0 N \geq N_{0} N≥N0时有 f ( N ) ≤ C g ( N ) f(N) \leq C g(N) f(N)≤Cg(N),则称函数 f ( N ) f(N) f(N)当 N N N充分大时上有界,且 g ( N ) g(N) g(N)是它的一个上界,记为 f ( N ) = O ( g ( N ) ) f(N) = O(g(N)) f(N)=O(g(N))
运算规则
- O ( f ) + O ( g ) = O ( max ( f , g ) ) O(f) + O(g) = O(\max(f , g)) O(f)+O(g)=O(max(f,g))
证明
- 设 F ( N ) = O ( f ) F(N) = O(f) F(N)=O(f),存在正常数 C 1 C_{1} C1和自然数 N 1 N_{1} N1,使得对所有的 N ≥ N 1 N \geq N_{1} N≥N1,有 F ( N ) ≤ C 1 f ( N ) F(N) \leq C_{1} f(N) F(N)≤C1f(N)
- 设 G ( N ) = O ( g ) G(N) = O(g) G(N)=O(g),存在正常数 C 2 C_{2} C2和自然数 N 2 N_{2} N2,使得对所有的 N ≥ N 2 N \geq N_{2} N≥N2,有 G ( N ) ≤ C 2 g ( N ) G(N) \leq C_{2} g(N) G(N)≤C2g(N)
- 令 C 3 = max { C 1 , C 2 } C_{3} = \max\set{C_{1} , C_{2}} C3=max{C1,C2}, N 3 = max { N 1 , N 2 } N_{3} = \max\set{N_{1} , N_{2}} N3=max{N1,N2}, h ( N ) = max { f , g } h(N) = \max\set{f , g} h(N)=max{f,g},则对所有的 N ≥ N 3 N \geq N_{3} N≥N3,有 F ( N ) ≤ C 1 f ( N ) ≤ C 1 h ( N ) ≤ C 3 h ( N ) F(N) \leq C_{1} f(N) \leq C_{1} h(N) \leq C_{3} h(N) F(N)≤C1f(N)≤C1h(N)≤C3h(N), G ( N ) ≤ C 2 g ( N ) ≤ C 2 h ( N ) ≤ C 3 h ( N ) G(N) \leq C_{2} g(N) \leq C_{2} h(N) \leq C_{3} h (N) G(N)≤C2g(N)≤C2h(N)≤C3h(N)
- O ( f ) + O ( g ) = F ( N ) + G ( N ) ≤ C 3 h ( N ) + C 3 h ( N ) = 2 C 3 h ( N ) = O ( h ) = O ( max ( f , g ) ) O(f) + O(g) = F(N) + G(N) \leq C_{3} h(N) + C_{3} h(N) = 2 C_{3} h(N) = O(h) = O(\max(f , g)) O(f)+O(g)=F(N)+G(N)≤C3h(N)+C3h(N)=2C3h(N)=O(h)=O(max(f,g))
Ω表示法
-
如果存在正的常数 C C C和自然数 N 0 N_{0} N0,使得当 N ≥ N 0 N \geq N_{0} N≥N0时有 f ( N ) ≥ C g ( N ) f(N) \geq C g(N) f(N)≥Cg(N),则称函数 f ( N ) f(N) f(N)当 N N N充分大时下有界,且 g ( N ) g(N) g(N)是它的一个下界,记为 f ( N ) = Ω ( g ( N ) ) f(N) = \Omega(g(N)) f(N)=Ω(g(N))
-
当 f ( N ) f(N) f(N)对自然数的不同无穷子集有不同的表达式,且有不同的阶时,不能很好地刻画 f ( N ) f(N) f(N)的下界,例如 f ( N ) = { 100 , N 为正偶数 6 N 2 , N 为正奇数 f(N) = \begin{cases} 100 , & N 为正偶数 \\ 6 N^{2} , & N 为正奇数 \end{cases} f(N)={100,6N2,N为正偶数N为正奇数,按上述定义,只能得到 f ( N ) = Ω ( 1 ) f(N) = \Omega(1) f(N)=Ω(1),这是一个平凡的下界,对算法分析没有什么价值
θ表示法
- 定义 f ( N ) = θ ( g ( N ) ) f(N) = \theta(g(N)) f(N)=θ(g(N))当且仅当 f ( N ) = O ( g ( N ) ) f(N) = O(g(N)) f(N)=O(g(N))且 f ( N ) = Ω ( g ( N ) ) f(N) = \Omega(g(N)) f(N)=Ω(g(N)),称 f ( N ) f(N) f(N)与 g ( N ) g(N) g(N)同阶
o表示法
- 如果对于任意给定的 ε > 0 \varepsilon > 0 ε>0,都存在正整数 N 0 N_{0} N0,使得当 N ≥ N 0 N \geq N_{0} N≥N0时有 f ( N ) / g ( N ) < ε f(N) / g(N) < \varepsilon f(N)/g(N)<ε,则称函数 f ( N ) f(N) f(N)当 N N N充分大时的阶比 g ( N ) g(N) g(N)低,记为 f ( N ) = o ( g ( N ) ) f(N) = o(g(N)) f(N)=o(g(N))
1.3|NP完全性理论
判定形式的旅行售货员问题
- 对于给定的带权图 G = ( V , E ) G = (V , E) G=(V,E)和一个正数 d d d,判定图 G G G中是否存在总费用不超过 d d d的周游路线
P类问题
- 所有可以在多项式时间内求解的判定问题构成 P P P类问题
NP类问题
- 非确定性算法将问题求解分为猜测和验证两个阶段
- 猜测阶段是非确定性的
- 验证阶段是确定性的
- 设算法 A A A是解一个判定问题 Q Q Q的非确定性算法,如果算法 A A A的验证阶段可以在多项式时间内完成,则称算法 A A A是一个多项式时间非确定性算法,也称问题 Q Q Q是非确定性多项式时间可解的
- 所有非确定性多项式时间可解的判定问题构成 N P NP NP类问题
NP完全问题——NPC问题
- 性质:如果一个 N P C NPC NPC问题能在多项式时间内得到解决,那么 N P NP NP中的每个问题都可以在多项式时间内求解
- 第一个 N P C NPC NPC问题是布尔表达式的可满足性问题,即 C o o k Cook Cook定理:布尔表达式的可满足性问题 S A T SAT SAT是 N P NP NP完全的
- 对于任何问题 Q Q Q,只要能证明 Q ∈ N P Q \in NP Q∈NP,而且可以在多项式时间内将 S A T SAT SAT变换为问题 Q Q Q,便有 Q ∈ N P C Q \in NPC Q∈NPC
- N P NP NP完全问题树中任一结点表示的问题可以在多项式时间内变换为它的任一后裔节点表示的问题