离散数学——函数增长
大 O O O 记法
定义:函数 f f f 和 g g g 都是实值函数,我们说 f ( x ) f(x) f(x) 是 O ( g ( x ) ) O(g(x)) O(g(x)) ,如果存在常数 C C C 和 k k k ,使得 ∣ f ( x ) ∣ ≤ C ∣ g ( x ) ∣ |f(x)| \leq C|g(x)| ∣f(x)∣≤C∣g(x)∣ 当 x > k x \gt k x>k 的时候。
这说明, f ( x ) f(x) f(x) 的增长速率没有 g ( x ) g(x) g(x) 乘以一个常数快。
注意,一对满足条件的 ( C , k ) (C,k) (C,k) 称为一个 见证 。注意如果 f ( x ) f(x) f(x) 是 O ( g ( x ) ) O(g(x)) O(g(x)) 那么满足条件的一对见证不止一个。
有时也写作是 f ( x ) = O ( g ( x ) ) f(x) = O(g(x)) f(x)=O(g(x)) ,有时也写作是 f ( x ) ∈ O ( g ( x ) ) f(x) \in O(g(x)) f(x)∈O(g(x)) 因为 O ( g ( x ) ) O(g(x)) O(g(x)) 也可以代表满足 f ( x ) = O ( g ( x ) ) f(x) = O(g(x)) f(x)=O(g(x)) 的所有 f ( x ) f(x) f(x) 构成的集合。
几类重要的大 O O O 估计
多项式估计是经常出现的估计函数,下面的定理给出了多项式估计的基本方法:
定理:让 f ( x ) = a n x n + … + a 1 x + a 0 f(x) = a_n x^n + \ldots + a_1 x + a_0 f(x)=anxn+…+a1x+a0 ,那么 f ( x ) = O ( x n ) f(x) = O(x^n) f(x)=O(xn) 。
其中,对于 n ! n! n! 的估计为:
n ! = 1 × 2 × … × n ≤ n × n × … × n = n n = O ( n n ) n! = 1 \times 2 \times \ldots \times n \leq n \times n \times \ldots \times n = n^n = O(n^n) n!=1×2×…×n≤n×n×…×n=nn=O(nn)
因此, log n ! = O ( n log n ) \log n! = O(n \log n) logn!=O(nlogn) 。
通过换底公式我们知道, log n = O ( n ) \log n = O(n) logn=O(n) 。
另外,指数增长永远大于多项式增长。两个指数增长满足 a > b > 1 a \gt b \gt 1 a>b>1 ,那么 b n = O ( a n ) b ^n = O(a^n) bn=O(an) 反之永远不成立。
组合函数的大 O O O 估计
下面的定理给出了两个函数相加的大 O 估计:
定理:若 f 1 ( x ) = O ( g 1 ( x ) ) f_1(x) = O(g_1(x)) f1(x)=O(g1(x)) 和 f 2 ( x ) = O ( g 2 ( x ) ) f_2(x) = O(g_2(x)) f2(x)=O(g2(x)) 那么 ( f 1 + f 2 ) ( x ) = O ( max ( ∣ g 1 ( x ) ∣ , ∣ g 2 ( x ) ∣ ) ) (f_1 + f_2)(x) = O(\max(|g_1(x)|,|g_2(x)|)) (f1+f2)(x)=O(max(∣g1(x)∣,∣g2(x)∣)) 。
当 g 1 g_1 g1 和 g 2 g_2 g2 相同时,有下面的推论:
推论: 若 f 1 ( x ) = O ( g ( x ) ) f_1(x) = O(g(x)) f1(x)=O(g(x)) 和 f 2 ( x ) = O ( g ( x ) ) f_2(x) = O(g(x)) f2(x)=O(g(x)) 那么 ( f 1 + f 2 ) ( x ) = O ( g ( x ) ) (f_1 + f_2)(x) = O(g(x)) (f1+f2)(x)=O(g(x)) 。
很显然,当两个函数相乘的时候的无穷大估计也是相乘:
定理:若 f 1 ( x ) = O ( g 1 ( x ) ) f_1(x) = O(g_1(x)) f1(x)=O(g1(x)) 和 f 2 ( x ) = O ( g 2 ( x ) ) f_2(x) = O(g_2(x)) f2(x)=O(g2(x)) 那么 ( f 1 f 2 ) ( x ) = O ( g 1 ( x ) g 2 ( x ) ) (f_1 f_2)(x) = O(g_1(x) g_2(x)) (f1f2)(x)=O(g1(x)g2(x)) 。
大 Ω \Omega Ω 和 大 Θ \Theta Θ 记法
另外两个相较于大 O O O 估计不常用的是大 Ω \Omega Ω 和 大 Θ \Theta Θ 记法。
定义:函数 f f f 和 g g g 都是实值函数,我们说 f ( x ) f(x) f(x) 是 Ω ( g ( x ) ) \Omega (g(x)) Ω(g(x)) ,如果存在常数 C C C 和 k k k ,使得 ∣ f ( x ) ∣ ≥ C ∣ g ( x ) ∣ |f(x)| \geq C|g(x)| ∣f(x)∣≥C∣g(x)∣ 当 x > k x \gt k x>k 的时候。
这表示,大 O O O 能给出函数增长的上界,而大 Ω \Omega Ω 能给出函数增长的下界。
定义:函数 f f f 和 g g g 都是实值函数,我们说 f ( x ) f(x) f(x) 是 Θ ( g ( x ) ) \Theta (g(x)) Θ(g(x)) ,如果 f ( x ) = O ( g ( x ) ) , f ( x ) = Ω ( g ( x ) ) f(x) = O(g(x)),f(x) = \Omega (g(x)) f(x)=O(g(x)),f(x)=Ω(g(x)) ,也称 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 是 同序 的函数。
这说明,大 Θ \Theta Θ 记法给出了一个函数增长的准确界,同时如果 f ( x ) = Θ ( g ( x ) ) f(x) = \Theta (g(x)) f(x)=Θ(g(x)) 那么 g ( x ) = Θ ( f ( x ) ) g(x) = \Theta (f(x)) g(x)=Θ(f(x)) 。
定理:让 f ( x ) = a n x n + … + a 1 x + a 0 f(x) = a_n x^n + \ldots + a_1 x + a_0 f(x)=anxn+…+a1x+a0 ,那么 f ( x ) = Θ ( x n ) f(x) = \Theta (x^n) f(x)=Θ(xn) 。
P 和 NP 类问题
如果一个问题有多项式时间复杂度的算法,我们说这个问题是 容易的 。
如果这个问题不存在算法能够解决,那么称这个问题是 不可解的 。例如停机问题。
如果一个算法有多项式时间复杂度的算法,那么称为 P 问 题 P 问题 P问题 。
如果一个问题没有多项式时间复杂度的算法,但是对于验证一个答案,存在多项式时间的算法,称这个问题为 NP 问题 ,例如满足性问题。
如果任何一个 NP 问题都能通过一个多项式时间算法转换为某个 NP 问题,那么这个 NP 问题就称为 NPC 问题 。
NPC 问题的存在说明如果任何一个 NPC 问题是 P P P 类问题,那么所有的问题都是 P 类问题。
现在已知的 NPC 问题有 300 多个,但是满足性问题是第一个已知的 NPC 问题。