函数增长和复杂性分类
渐进符号
-
Θ \mathit{\Theta} Θ 记号
Θ ( g ( n ) ) = { f ( n ) ∣ ∃ n 0 , c 1 , c 2 > 0 , s . t . ∀ n > n 0 , 0 ≤ c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) } \Large{\mathit{\Theta}(g(n))=\{f(n)|\exists n_0,c_1,c_2>0,\mathrm{s.t.} \forall n > n_0,0\le c_1g(n)\le f(n)\le c_2g(n) \}} Θ(g(n))={f(n)∣∃n0,c1,c2>0,s.t.∀n>n0,0≤c1g(n)≤f(n)≤c2g(n)}- 对于 Θ \mathit{\Theta} Θ 记号,要求 g ( n ) g(n) g(n)本身为渐进非负
- Θ \mathit{\Theta} Θ 记号一般用来表示一个算法对于某些输入的运行时间的确界
- 对于任意函数 f ( n ) ∈ Θ ( g ( n ) ) f(n)∈\mathit{\Theta}(g(n)) f(n)∈Θ(g(n)),那么 c 2 g ( n ) c_2g(n) c2g(n) 和 c 1 g ( n ) c_1g(n) c1g(n) 分别是 f ( n ) f(n) f(n) 的上界和下界。所以θ记号渐进地给出了函数的上界和下界。
-
O O O 记号
O ( g ( n ) ) = { f ( n ) ∣ ∃ n 0 , c > 0 , s . t . ∀ n > n 0 , 0 ≤ f ( n ) ≤ c g ( n ) } \Large{\mathit{O}(g(n))=\{f(n)|\exists n_0,c>0,\mathrm{s.t.} \forall n > n_0, 0\le f(n)\le cg(n) \}} O(g(n))={f(n)∣∃n0,c>0,s.t.∀n>n0,0≤f(n)≤cg(n)}- O O O 记号表示的是一个渐进上界
- 当用它来表示算法的最坏情况运行时间界限时,就隐含地给出了对于任意输的时间的上界,即 f ( n ) = Θ ( g ( n ) ) f(n)=\mathit{\Theta}(g(n)) f(n)=Θ(g(n))隐含着 f ( n ) = O ( g ( n ) ) f(n)=\mathit{O}(g(n)) f(n)=O(g(n))。
-
o o o 记号
o ( g ( n ) ) = { f ( n ) ∣ ∀ c > 0 , ∃ n 0 , s . t . ∀ n > n 0 , 0 ≤ f ( n ) < c g ( n ) } \Large{\mathit{o}(g(n))=\{f(n)|\forall c>0,\exists n_0,\mathrm{s.t.} \forall n > n_0, 0\le f(n)< cg(n) \}} o(g(n))={f(n)∣∀c>0,∃n0,s.t.∀n>n0,0≤f(n)<cg(n)}- o o o 记号表示的是一个非渐进紧确的上界
-
Ω \mathit{\Omega} Ω 记号
Ω ( g ( n ) ) = { f ( n ) ∣ ∃ n 0 , c > 0 , s . t . ∀ n > n 0 , 0 ≤ c g ( n ) ≤ f ( n ) } \Large{\mathit{\Omega}(g(n))=\{f(n)|\exists n_0,c>0,\mathrm{s.t.} \forall n > n_0, 0\le cg(n)\le f(n) \}} Ω(g(n))={f(n)∣∃n0,c>0,s.t.∀n>n0,0≤cg(n)≤f(n)}- Ω \mathit{\Omega} Ω 记号表示的是一个渐进下界
-
ω \mathit{\omega} ω 记号
ω ( g ( n ) ) = { f ( n ) ∣ ∀ c > 0 , ∃ n 0 , s . t . ∀ n > n 0 , 0 ≤ c g ( n ) < f ( n ) } \Large{\mathit{\omega}(g(n))=\{f(n)|\forall c>0,\exists n_0,\mathrm{s.t.} \forall n > n_0, 0\le cg(n)< f(n) \}} ω(g(n))={f(n)∣∀c>0,∃n0,s.t.∀n>n0,0≤cg(n)<f(n)}- ω \mathit{\omega} ω 记号表示的是一个非渐进紧确的下界
-
性质
- O ( g 1 ( n ) ) + O ( g 2 ( n ) ) = O ( m a x { g 1 ( n ) , g 2 ( n ) } ) O(g_1(n))+O(g_2(n))=O(\mathrm{max}\{g_1(n),g_2(n)\} ) O(g1(n))+O(g2(n))=O(max{g1(n),g2(n)})。对 Θ \mathit{\Theta} Θ 记号和 Ω \mathit{\Omega} Ω 记号同样成立。
- O ( g 1 ( n ) ) ⋅ O ( g 2 ( n ) ) = O ( g 1 ( n ) ⋅ g 2 ( n ) ) O(g_1(n))·O(g_2(n))=O(g_1(n)·g_2(n)) O(g1(n))⋅O(g2(n))=O(g1(n)⋅g2(n))。对 Θ \mathit{\Theta} Θ 记号和 Ω \mathit{\Omega} Ω 记号同样成立。
阶的计算
-
常见的复杂度关系:
c < l o g n < n < n l o g n < n a < a n < n ! \Large{c<\mathrm{log}n<n<n\mathrm{log}n<n^a<a^n<n!} c<logn<n<nlogn<na<an<n!- 其中 c c c 是常数, a a a 是大于 1 的常数
-
递归算法复杂度计算
-
常用主定理计算
T ( n ) = a T ( n b ) + f ( n ) \large{T(n)=aT(\frac{n}{b})+f(n)} T(n)=aT(bn)+f(n) -
三种情况下的 T ( n ) T(n) T(n)
- ∃ ε , s . t . f ( n ) = O ( n l o g b a − ε ) \exist \varepsilon ,s.t.f(n)=O(n^{\mathrm{log}_ba-\varepsilon}) ∃ε,s.t.f(n)=O(nlogba−ε),则 T ( n ) = Θ ( n l o g b a ) T(n)=\mathit{\Theta}(n^{\mathrm{log}_ba}) T(n)=Θ(nlogba)
- f ( n ) = Θ ( n l o g b a ) f(n)=\mathit{\Theta}(n^{\mathrm{log}_ba}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n l o g b a l o g n ) T(n)=\mathit{\Theta}(n^{\mathrm{log}_ba}\mathrm{log}n) T(n)=Θ(nlogbalogn)
- ∃ ε , s . t . f ( n ) = Ω ( n l o g b a + ε ) \exist \varepsilon ,s.t.f(n)=\mathit{\Omega}(n^{\mathrm{log}_ba+\varepsilon}) ∃ε,s.t.f(n)=Ω(nlogba+ε),且 ∀ c < 1 , ∃ n , s . t . a f ( n b ) ≤ c f ( n ) \forall c<1,\exist n,s.t.af(\frac{n}{b})\le cf(n) ∀c<1,∃n,s.t.af(bn)≤cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\mathit{\Theta}(f(n)) T(n)=Θ(f(n))
-
当 f ( n ) f(n) f(n) 的执行时间是多项式时间,即 T ( n ) = a T ( n b ) + O ( n d ) T(n)=aT(\frac{n}{b})+O(n^d) T(n)=aT(bn)+O(nd) 时
- 若 d > l o g b a d>\mathrm{log}_ba d>logba 时,则 T ( n ) = O ( n d ) T(n)=O(n^d) T(n)=O(nd)
- 若 d = l o g b a d=\mathrm{log}_ba d=logba 时,则 T ( n ) = O ( n d l o g n ) T(n)=O(n^d \mathrm{log}n) T(n)=O(ndlogn)
- 若 d < l o g b a d<\mathrm{log}_ba d<logba 时,则 T ( n ) = O ( n l o g b a ) T(n)=O(n^{\mathrm{log}_ba}) T(n)=O(nlogba)
-
复杂性分类
-
图灵机
- 有
k
k
k 个磁带,每个磁带都有一个磁头,可以对磁带的某个位置进行读或写操作
- 有一个磁带是输入磁带,该磁带只能进行读操作。
- 剩下的 k − 1 k-1 k−1 个磁带是工作磁带,可以读也可以写。
- 有一个寄存器,可以存储当前机器的状态。
- 图灵机的状态集是有限的
- 读取 k k k 个磁带上磁头对应位置的内容
- 修改 k − 1 k-1 k−1 磁带上磁头对应位置的内容
- 改变寄存器中的状态
- 每个磁头移动一个位置或保持不变
- 机器有一套确定的规则
- 如果确定了当前状态以及 k k k 个磁头位置的内容,则机器执行的步骤是确定的
- 有
k
k
k 个磁带,每个磁带都有一个磁头,可以对磁带的某个位置进行读或写操作
-
复杂度计算
-
P \mathrm{P} P 复杂度类:存在相应的确定性图灵机可以在输入长度的多项式时间内计算出结果
-
N P \mathrm{NP} NP 复杂度类:存在相应的确定性图灵机可以在输入长度的多项式时间内判断一个结果是否正确
- N P C ( N P − C o m p l e t e ) \mathrm{NPC(NP-Complete)} NPC(NP−Complete) 复杂度类也是 NP 的一个子集
-
所有属于 P \mathrm{P} P 的问题也属于 N P \mathrm{NP} NP ,因此 P \mathrm{P} P 是 N P \mathrm{NP} NP 的一个子集。
-