第1章 算法概述
(一)算法与程序
1.算法
算法是解决问题的一种方法或过程
算法是由若干条指令组成的有穷序列
算法满足:
①输入:有零个或多个输入
②输出:至少有一个输出
③确定性:每条指令是清晰无歧义的
④有限性:每条指令执行次数和执行时间是有限的
2.程序
程序是算法用某种程序设计语言的具体实现
算法必须满足①~④,而程序不一定满足④
操作系统是在无限循环中执行的程序而不是算法,操作系统的各种任务由特定的子程序实现,子程序既是程序也是算法
数据结构+算法=程序
(二)算法复杂性分析
1.算法的复杂性
算法复杂性=算法所需要的计算机资源
n n n:问题的规模、输入数据的大小
时间复杂度 T ( n ) T(n) T(n):需要的时间资源,对应CPU
空间复杂度 S ( n ) S(n) S(n):需要的空间资源,对应内存
2.算法的渐进复杂性
当 n → ∞ n\rightarrow\infty n→∞,有 T ( n ) − t ( n ) T ( n ) → 0 \frac{T(n)-t(n)}{T(n)}\rightarrow0 T(n)T(n)−t(n)→0,称 t ( n ) t(n) t(n)是 T ( n ) T(n) T(n)的渐进性态,为算法的渐进复杂性
数学上, t ( n ) t(n) t(n)是 T ( n ) T(n) T(n)的渐进表达式,为 T ( n ) T(n) T(n)略去低阶项留下的主项( n → ∞ n\rightarrow \infty n→∞时,变化最快的项)
例如: T ( n ) = 4 N 2 + 3 N − 1 T(n)=4N^2+3N-1 T(n)=4N2+3N−1,则 t ( n ) = 4 n 2 t(n)=4n^2 t(n)=4n2
3.算法的时间复杂性
I I I:问题的规模为 n n n的实例 p ( I ) p(I) p(I):实例 I I I出现的概率
最坏情况下的时间复杂性
T m a x ( n ) = m a x { T ( I ) ∣ s i z e ( I ) = n } T_{max}(n)=max\{T(I)|size(I)=n\} Tmax(n)=max{T(I)∣size(I)=n}
最好情况下的时间复杂性
T m i n ( n ) = m i n { T ( I ) ∣ s i z e ( I ) = n } T_{min}(n)=min\{T(I)|size(I)=n\} Tmin(n)=min{T(I)∣size(I)=n}
平均情况下的时间复杂性
T a v g ( n ) = ∑ s i z e ( I ) = n p ( I ) T ( I ) T_{avg}(n)=\sum_{size(I)=n}p(I)T(I) Tavg(n)=∑size(I)=np(I)T(I)
4.渐近分析的记号
(1)渐近上界记号 O \Omicron O
O ( g ( n ) ) = { f ( n ) ∣ 存 在 正 常 数 c 和 n 0 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ f ( n ) ≤ c g ( n ) } \Omicron(g(n))=\{f(n)|存在正常数c和n_0使得对所有n\geq{n}_0有:0\leq{f(n)}\leq{cg(n)}\} O(g(n))={f(n)∣存在正常数c和n0使得对所有n≥n0有:0≤f(n)≤cg(n)}
如: 3 N + 10 = O ( N ) 3N+10=\Omicron(N) 3N+10=O(N)
如: 4 N 2 + 3 N − 1 = O ( N 2 ) 4N^2+3N-1=\Omicron(N^2) 4N2+3N−1=O(N2)
(2)渐近下界记号 Ω \Omega Ω
Ω ( g ( n ) ) = { f ( n ) ∣ 存 在 正 常 数 c 和 n 0 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ c g ( n ) ) ≤ f ( n ) } \Omega(g(n))=\{f(n)|存在正常数c和n_0使得对所有n\geq{n}_0有:0\leq{cg(n))}\leq{f(n)}\} Ω(g(n))={f(n)∣存在正常数c和n0使得对所有n≥n0有:0≤cg(n))≤f(n)}
如: 3 N + 10 = Ω ( 1 ) 3N+10=\Omega(1) 3N+10=Ω(1)
如: 4 N 2 + 3 N − 1 = Ω ( N 2 ) 4N^2+3N-1=\Omega(N^2) 4N2+3N−1=Ω(N2)
(3)非紧上界记号 ο \omicron ο
ο ( g ( n ) ) = { f ( n ) ∣ 对 于 任 何 正 常 数 c , 存 在 正 数 n 0 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ f ( n ) ≤ c g ( n ) } \omicron(g(n))=\{f(n)|对于任何正常数c,存在正数n_0使得对所有n\geq{n}_0有:0\leq{f(n)}\leq{cg(n)}\} ο(g(n))={f(n)∣对于任何正常数c,存在正数n0使得对所有n≥n0有:0≤f(n)≤cg(n)}
等价于当 n → ∞ n\rightarrow\infty n→∞有 f ( n ) g ( n ) → 0 \frac{f(n)}{g(n)}\rightarrow0 g(n)f(n)→0
如: 4 N 2 + 3 N − 1 = ο ( N 3 ) 4N^2+3N-1=\omicron(N^3) 4N2+3N−1=ο(N3)
(4)非紧下界记号 ω \omega ω
ω ( g ( n ) ) = { f ( n ) ∣ 对 于 任 何 正 常 数 c , 存 在 正 数 n 0 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ c g ( n ) ) ≤ f ( n ) } \omega(g(n))=\{f(n)|对于任何正常数c,存在正数n_0使得对所有n\geq{n}_0有:0\leq{cg(n))}\leq{f(n)}\} ω(g(n))={f(n)∣对于任何正常数c,存在正数n0使得对所有n≥n0有:0≤cg(n))≤f(n)}
等价于当 n → ∞ n\rightarrow\infty n→∞有 f ( n ) g ( n ) → ∞ \frac{f(n)}{g(n)}\rightarrow\infty g(n)f(n)→∞
如: 4 N 2 + 3 N − 1 = ω ( N ) 4N^2+3N-1=\omega(N) 4N2+3N−1=ω(N)
(5)紧渐近界记号 Θ \Theta Θ
Θ ( g ( n ) ) = { f ( n ) ∣ 存 在 正 常 数 c 1 、 c 2 和 n 0 使 得 对 所 有 n ≥ n 0 有 : c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) } \Theta(g(n))=\{f(n)|存在正常数c_1、c_2和n_0使得对所有n\geq{n}_0有:c_1g(n)\leq{f(n)}\leq{c_2g(n)}\} Θ(g(n))={f(n)∣存在正常数c1、c2和n0使得对所有n≥n0有:c1g(n)≤f(n)≤c2g(n)}
Θ ( g ( n ) ) = O ( g ( n ) ) ⋂ Ω ( g ( n ) ) \Theta(g(n))=\Omicron(g(n))\bigcap\Omega(g(n)) Θ(g(n))=O(g(n))⋂Ω(g(n))
如: 4 N 2 + 3 N − 1 = Θ ( N 2 ) 4N^2+3N-1=\Theta(N^2) 4N2+3N−1=Θ(N2)
5.渐近分析记号在等式和不等式中的意义
f ( n ) = Θ ( g ( n ) ) ⇔ f ( n ) ∈ Θ ( g ( n ) ) f(n)=\Theta(g(n))\Leftrightarrow f(n)\in{\Theta(g(n))} f(n)=Θ(g(n))⇔f(n)∈Θ(g(n))
一般来说, Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))表示 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))中的某个函数
如: 4 n 2 + 3 n − 1 = 4 n 2 + Θ ( n ) 4n^2+3n-1=4n^2+\Theta(n) 4n2+3n−1=4n2+Θ(n)表示 4 n 2 + 3 n − 1 = 4 n 2 + f ( n ) 4n^2+3n-1=4n^2+f(n) 4n2+3n−1=4n2+f(n), f ( n ) f(n) f(n)是 Θ ( n ) \Theta(n) Θ(n)中的某个函数
O 、 ο 、 Ω 、 ω \Omicron、\omicron、\Omega、\omega O、ο、Ω、ω同理
6.渐近分析中函数比较
f ( n ) = O ( g ( n ) ) ≈ a ≤ b f(n)=\Omicron(g(n))\approx a\leq b f(n)=O(g(n))≈a≤b
f ( n ) = Ω ( g ( n ) ) ≈ a ≥ b f(n)=\Omega(g(n))\approx a\geq b f(n)=Ω(g(n))≈a≥b
f ( n ) = ο ( g ( n ) ) ≈ a < b f(n)=\omicron(g(n))\approx a< b f(n)=ο(g(n))≈a<b
f ( n ) = ω ( g ( n ) ) ≈ a > b f(n)=\omega(g(n))\approx a>b f(n)=ω(g(n))≈a>b
f ( n ) = Θ ( g ( n ) ) ≈ a = b f(n)=\Theta(g(n))\approx a= b f(n)=Θ(g(n))≈a=b
7.渐近分析记号的性质
(1)传递性
f ( n ) = Θ ( g ( n ) ) , g ( n ) = Θ ( h ( n ) ) ⇒ f ( n ) = Θ ( h ( n ) ) f(n)=\Theta(g(n)),g(n)=\Theta(h(n))\Rightarrow f(n)=\Theta(h(n)) f(n)=Θ(g(n)),g(n)=Θ(h(n))⇒f(n)=Θ(h(n))
f ( n ) = O ( g ( n ) ) , g ( n ) = O ( h ( n ) ) ⇒ f ( n ) = O ( h ( n ) ) f(n)=\Omicron(g(n)),g(n)=\Omicron(h(n))\Rightarrow f(n)=\Omicron(h(n)) f(n)=O(g(n)),g(n)=O(h(n))⇒f(n)=O(h(n))
f ( n ) = Ω ( g ( n ) ) , g ( n ) = Ω ( h ( n ) ) ⇒ f ( n ) = Ω ( h ( n ) ) f(n)=\Omega(g(n)),g(n)=\Omega(h(n))\Rightarrow f(n)=\Omega(h(n)) f(n)=Ω(g(n)),g(n)=Ω(h(n))⇒f(n)=Ω(h(n))
f ( n ) = ο ( g ( n ) ) , g ( n ) = ο ( h ( n ) ) ⇒ f ( n ) = ο ( h ( n ) ) f(n)=\omicron(g(n)),g(n)=\omicron(h(n))\Rightarrow f(n)=\omicron(h(n)) f(n)=ο(g(n)),g(n)=ο(h(n))⇒f(n)=ο(h(n))
f ( n ) = ω ( g ( n ) ) , g ( n ) = ω ( h ( n ) ) ⇒ f ( n ) = ω ( h ( n ) ) f(n)=\omega(g(n)),g(n)=\omega(h(n))\Rightarrow f(n)=\omega(h(n)) f(n)=ω(g(n)),g(n)=ω(h(n))⇒f(n)=ω(h(n))
(2)反身性
f ( n ) = Θ ( f ( n ) ) f(n)=\Theta(f(n)) f(n)=Θ(f(n))
f ( n ) = O ( f ( n ) ) f(n)=\Omicron(f(n)) f(n)=O(f(n))
f ( n ) = Ω ( f ( n ) ) f(n)=\Omega(f(n)) f(n)=Ω(f(n))
(3)对称性
f ( n ) = Θ ( g ( n ) ) ⇔ g ( n ) = Θ ( f ( n ) ) f(n)=\Theta(g(n))\Leftrightarrow g(n)=\Theta(f(n)) f(n)=Θ(g(n))⇔g(n)=Θ(f(n))
(4)互对称性
f ( n ) = O ( g ( n ) ) ⇔ g ( n ) = Ω ( f ( n ) ) f(n)=\Omicron(g(n))\Leftrightarrow g(n)=\Omega(f(n)) f(n)=O(g(n))⇔g(n)=Ω(f(n))
f ( n ) = ο ( g ( n ) ) ⇔ g ( n ) = ω ( f ( n ) ) f(n)=\omicron(g(n))\Leftrightarrow g(n)=\omega(f(n)) f(n)=ο(g(n))⇔g(n)=ω(f(n))
(5)算术运算(以 O \Omicron O为例)
O ( f ( n ) ) + O ( g ( n ) ) = O ( m a x { f ( n ) , g ( n ) } ) \Omicron(f(n))+\Omicron(g(n))=\Omicron(max\{{f(n),g(n)}\}) O(f(n))+O(g(n))=O(max{f(n),g(n)})
O ( f ( n ) ) + O ( g ( n ) ) = O ( f ( n ) + g ( n ) ) \Omicron(f(n))+\Omicron(g(n))=\Omicron({f(n)+g(n)}) O(f(n))+O(g(n))=O(f(n)+g(n))
O ( f ( n ) ) ∗ O ( g ( n ) ) = O ( f ( n ) ∗ g ( n ) ) \Omicron(f(n))*\Omicron(g(n))=\Omicron({f(n)*g(n)}) O(f(n))∗O(g(n))=O(f(n)∗g(n))
O ( c f ( n ) = O ( f ( n ) ) \Omicron(cf(n)=\Omicron(f(n)) O(cf(n)=O(f(n))
g ( n ) = O ( f ( n ) ) ⇒ O ( f ( n ) ) + O ( g ( n ) ) = O ( f ( n ) ) g(n)=\Omicron(f(n))\Rightarrow \Omicron(f(n))+\Omicron(g(n))=\Omicron(f(n)) g(n)=O(f(n))⇒O(f(n))+O(g(n))=O(f(n))
8.渐近记号的关系
9.渐近关系的快速判断
f ( n ) = Θ ( g ( n ) ) ⇔ lim n → ∞ f ( n ) g ( n ) = c ( f ( n ) 与 g ( n ) 同 阶 ) f(n)=\Theta(g(n))\Leftrightarrow \lim\limits_{n\rightarrow\infty}\frac{f(n)}{g(n)}=c(f(n)与g(n)同阶) f(n)=Θ(g(n))⇔n→∞limg(n)f(n)=c(f(n)与g(n)同阶)
f ( n ) = ο ( g ( n ) ) ⇔ lim n → ∞ f ( n ) g ( n ) = 0 ( f ( n ) 比 g ( n ) 低 阶 ) f(n)=\omicron(g(n))\Leftrightarrow \lim\limits_{n\rightarrow\infty}\frac{f(n)}{g(n)}=0(f(n)比g(n)低阶) f(n)=ο(g(n))⇔n→∞limg(n)f(n)=0(f(n)比g(n)低阶)
f ( n ) = ω ( g ( n ) ) ⇔ lim n → ∞ f ( n ) g ( n ) = ∞ ( f ( n ) 比 g ( n ) 高 阶 ) f(n)=\omega(g(n))\Leftrightarrow \lim\limits_{n\rightarrow\infty}\frac{f(n)}{g(n)}=\infty(f(n)比g(n)高阶) f(n)=ω(g(n))⇔n→∞limg(n)f(n)=∞(f(n)比g(n)高阶)
f ( n ) = O ( g ( n ) ) ⇔ O ( g ( n ) ) 为 Θ ( g ( n ) ) 和 ο ( g ( n ) ) 中 阶 数 更 低 的 那 个 f(n)=\Omicron(g(n))\Leftrightarrow \Omicron(g(n))为\Theta(g(n))和\omicron(g(n))中阶数更低的那个 f(n)=O(g(n))⇔O(g(n))为Θ(g(n))和ο(g(n))中阶数更低的那个
f ( n ) = Ω ( g ( n ) ) ⇔ O ( g ( n ) ) 为 Θ ( g ( n ) ) 和 ω ( g ( n ) ) 中 阶 数 更 高 的 那 个 f(n)=\Omega(g(n))\Leftrightarrow \Omicron(g(n))为\Theta(g(n))和\omega(g(n))中阶数更高的那个 f(n)=Ω(g(n))⇔O(g(n))为Θ(g(n))和ω(g(n))中阶数更高的那个
求渐近表达式的一般步骤:去除低阶项只保留最高阶项,再去掉最高级项的系数
10.常见的时间复杂度的渐近阶排序
O ( n − 1 ) < O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) \Omicron(n^{-1})<\Omicron(1)<\Omicron(logn)<\Omicron(\sqrt{n})<\Omicron(n)<\Omicron(nlogn)<\Omicron(n^2)<\Omicron(n^3)<\Omicron(2^n)<\Omicron(n!)<\Omicron(n^n) O(n−1)<O(1)<O(logn)<O(n)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
11.算法渐近复杂性分析中常用函数
(1)单调函数
单调递增: m ≤ n ⇒ f ( m ) ≤ f ( n ) m\leq n\Rightarrow f(m)\leq f(n) m≤n⇒f(m)≤f(n)
单调递减: m ≤ n ⇒ f ( m ) ≥ f ( n ) m\leq n\Rightarrow f(m)\geq f(n) m≤n⇒f(m)≥f(n)
严格单调递增: m < n ⇒ f ( m ) < f ( n ) m<n\Rightarrow f(m)< f(n) m<n⇒f(m)<f(n)
严格单调递减: m < n ⇒ f ( m ) > f ( n ) m<n\Rightarrow f(m)> f(n) m<n⇒f(m)>f(n)
(2)取整函数
x − 1 < ⌊ x ⌋ ≤ x ≤ ⌈ x ⌉ < x + 1 x-1<\lfloor x\rfloor \leq x\leq \lceil x \rceil<x+1 x−1<⌊x⌋≤x≤⌈x⌉<x+1
⌊ n 2 ⌋ + ⌈ n 2 ⌉ = n \lfloor \frac{n}{2}\rfloor+\lceil\frac{n}{2}\rceil=n ⌊2n⌋+⌈2n⌉=n
对于 n ≥ 0 , a , b > 0 n\geq0,a,b>0 n≥0,a,b>0,有:
⌈ ⌈ n a ⌉ b ⌉ = ⌈ n a b ⌉ \lceil\frac{\lceil \frac{n}{a}\rceil}{b}\rceil=\lceil\frac{n}{ab}\rceil ⌈b⌈an⌉⌉=⌈abn⌉
⌊ ⌊ n a ⌋ b ⌋ = ⌊ n a b ⌋ \lfloor\frac{\lfloor \frac{n}{a}\rfloor}{b}\rfloor=\lfloor\frac{n}{ab}\rfloor ⌊b⌊an⌋⌋=⌊abn⌋
⌈ a b ⌉ ≤ a + ( b − 1 ) b \lceil \frac{a}{b}\rceil\leq \frac{a+(b-1)}{b} ⌈ba⌉≤ba+(b−1)
⌊ a b ⌋ ≥ a − ( b − 1 ) b \lfloor \frac{a}{b}\rfloor\geq \frac{a-(b-1)}{b} ⌊ba⌋≥ba−(b−1)
(3)多项式函数
p ( n ) = a 0 + a 1 n + a 2 n 2 + . . . + a d n d , a d > 0 p(n)=a_0+a_1n+a_2n^2+...+a_dn^d,a_d>0 p(n)=a0+a1n+a2n2+...+adnd,ad>0
p ( n ) = Θ ( n d ) p(n)=\Theta(n^d) p(n)=Θ(nd)
f ( n ) = O ( n k ) ⇔ f ( n ) 有 界 f(n)=\Omicron(n^k)\Leftrightarrow f(n)有界 f(n)=O(nk)⇔f(n)有界
f ( n ) = O ( 1 ) ⇔ f ( n ) ≤ c f(n)=\Omicron(1)\Leftrightarrow f(n)\leq c f(n)=O(1)⇔f(n)≤c
k ≥ d ⇒ p ( n ) = O ( n k ) k\geq d\Rightarrow p(n)=\Omicron(n^k) k≥d⇒p(n)=O(nk)
k ≤ d ⇒ p ( n ) = Ω ( n k ) k\leq d\Rightarrow p(n)=\Omega(n^k) k≤d⇒p(n)=Ω(nk)
k > d ⇒ p ( n ) = ο ( n k ) k>d\Rightarrow p(n)=\omicron(n^k) k>d⇒p(n)=ο(nk)
k < d ⇒ p ( n ) = ω ( n k ) k<d\Rightarrow p(n)=\omega(n^k) k<d⇒p(n)=ω(nk)
(4)指数函数
( a m ) n = ( a n ) m = a m n (a^m)^n=(a^n)^m=a^{mn} (am)n=(an)m=amn
a m a n = a m + n a^ma^n=a^{m+n} aman=am+n
a > 1 , n b = ο ( a n ) a>1,\quad n^b=\omicron(a^n) a>1,nb=ο(an)
e x = 1 + x + x 2 2 ! + x 3 3 ! + . . . = ∑ i = 0 ∞ x i i ! e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+...=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!} ex=1+x+2!x2+3!x3+...=i=0∑∞i!xi
∣ x ∣ ≤ 1 , 1 + x ≤ e x ≤ 1 + x + Θ ( x 2 ) |x|\leq1,\quad 1+x\leq e^x\leq1+x+\Theta(x^2) ∣x∣≤1,1+x≤ex≤1+x+Θ(x2)
lim n → ∞ ( 1 + x n ) n = e x \lim\limits_{n\rightarrow\infty}{(1+\frac{x}{n})}^n=e^x n→∞lim(1+nx)n=ex
(5)对数函数
log n = log 2 n , lg n = log 10 n , ln n = log e n \log n= \log_2 n,\quad \lg n=\log_{10}n,\quad \ln n= \log_{e}n logn=log2n,lgn=log10n,lnn=logen
a > 0 , b > 0 , c > 0 : a>0,b>0, c>0: a>0,b>0,c>0:
a = b l o g b a a = b^{log_b a} a=blogba
l o g c ( a b ) = l o g c a + l o g c b log_c(ab)=log_ca+log_cb logc(ab)=logca+logcb
l o g c ( a b ) = l o g c a − l o g c b log_c(\frac{a}{b})=log_ca-log_cb logc(ba)=logca−logcb
l o g b ( a n ) = n l o g b a log_b(a^n)=nlog_ba logb(an)=nlogba
l o g b ( a ) = l o g c a l o g c b log_b(a)=\frac{log_ca}{log_cb} logb(a)=logcblogca
l o g b ( a ) = 1 l o g a b log_b(a)=\frac{1}{log_ab} logb(a)=logab1
a l o g b c = c l o g b a a^{log_bc}=c^{log_ba} alogbc=clogba
a > 0 , l o g b n = ο ( n a ) a>0,\quad log^bn=\omicron(n^a) a>0,logbn=ο(na)
x > − 1 , x 1 + x ≤ l n ( 1 + x ) ≤ x x>-1,\quad \frac{x}{1+x}\leq ln(1+x)\leq x x>−1,1+xx≤ln(1+x)≤x
∣ x ∣ ≤ 1 , l n ( 1 + x ) = x − x 2 2 + x 3 3 − x 4 4 + . . . |x|\leq1, \quad ln(1+x)=x-\frac{x^2}{2}+\frac{x^3}{3}-\frac{x^4}{4}+... ∣x∣≤1,ln(1+x)=x−2x2+3x3−4x4+...
(6)阶乘函数
n ! = 1 × 2 × 3... × n n!=1\times2\times3...\times n n!=1×2×3...×n
n ! = { 1 , n = 1 n ( n − 1 ) ! , n > 1 n!=\begin{cases} 1,\;\qquad\qquad n=1\\ n(n-1)!,\quad n>1\\ \end{cases} n!={1,n=1n(n−1)!,n>1
n ! = ο ( n n ) n!=\omicron(n^n) n!=ο(nn)
n ! = ω ( 2 n ) n!=\omega(2^n) n!=ω(2n)
(三)算法分析的基本法则
1.计算时间选择
(1)for/while循环
循环体内计算时间*循环次数
(2)嵌套循环
循环体内计算时间*所有循环次数
(3)顺序语句
各语句计算时间相加
(4)if-else语句
if语句计算时间和else语句计算时间的较大者
2.最优算法
问题的计算时间下界为 Ω ( f ( n ) ) \Omega(f(n)) Ω(f(n)),则计算时间复杂性为 O ( f ( n ) ) \Omicron(f(n)) O(f(n))的算法是最优算法
如:排序问题的计算时间下界为 Ω ( n l o g n ) \Omega(nlogn) Ω(nlogn),计算时间复杂性为 O ( n l o g n ) \Omicron(nlogn) O(nlogn)(堆排序)的排序算法是最优算法
(四)NP完全性理论
1.P类问题与NP类问题
说明 | |
---|---|
易处理的问题 | 需要多项式时间算法求解的问题 |
难处理的问题 | 需要超多项式时间才能求解的问题 |
不可解问题 | 任何计算机无论耗费多长时间都不能解决的问题 |
如:图灵停机问题——不能给出一个判断任意一个图灵机是否停机的一般方法 同理还有: 理发师悖论:村里有个理发师,该理发师有条原则:村里的人如果不自己理发,理发师就给这个人理发,否则不给这个 人理发,那么理 发师能否给自己理发是不可解的。 停机测试悖论:计算机有个测试程序,该测试程序有条原则:计算机里的程序如果不递归调用自己,测试程序就调用它,否则不调它, 那么测试程序能否自己递归调用自己是不可解的。 | |
非确定性问题 | 问题的答案无法直接计算得到,只能通过判断猜算的正确与否得到 |
多项式非确定性问题:判断猜算正确与否的算法可以在多项式时间内算出来 完全多项式非确定性问题:该问题的所有可能答案能在多项式时间内进行正确与否的验算 | |
如:旅行售货员问题(TSP) G=(V,E)是一个带权图,图中各边的权为费用,周游路线是包含V中每个顶点的一条回路 最优化形式的TSP问题——在G中找出费用最小的周游线路——较难 判定形式的TSP问题——判断G中是否存在总费用不超过d的周游线路——较易 | |
非确定性算法:将问题分解为猜想和验证两个阶段 猜测:给出问题的一个猜想——非确定性 验证:验证猜测阶段给出解的正确性——确定性 |
P、NP、NPC、NP-Hard问题
说明 | |
---|---|
P | 可以在多项式时间解决的问题 (确定性计算模型下的易解问题类) |
NP | 目前无多项式时间解决的算法,但可以在多项式时间内验证候选答案是否正确 (NP类问题是非确定性计算模型下的易验证问题类) |
NPC | ①本身是NP问题 ②任何一个NP问题都可以在多项式时间规约到该问题 |
NP-Hard | ①本身不能确定是NP问题 ②任何一个NP问题都可以在多项式时间规约到该问题 |
P
⊆
N
P
P\subseteq NP
P⊆NP
N
P
C
⊆
N
P
−
H
a
r
d
NPC\subseteq NP-Hard
NPC⊆NP−Hard
2.NP完全问题(NPC)
如果一个NP完全问题(NPC)能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内求解
目前还没有一个NP完全问题(NPC)有多项式时间算法
3.一些典型的NP完全问题
4.NP完全问题的近似算法
(1)只对问题的特殊实例求解
(2)只求近似解
(3)用动态规划法或分支限界法求解
(4)用概率算法求解
(5)用启发式方法求解