例如, 假设Tp1 ( N ) = 106N , Tp2 ( N ) = N2. 即使看起来( N2 ) 比( N )增长得更快,但当N < 106, P2仍然比P1快.
复杂度的渐进表示法
常用函数增长表
输入规模n 8 1 3 8 24 64 512
函数 1 log2 n n n log2 n n2 n3
Note: 1. 将常数或低阶项放进大O是非常不好的习惯——低阶项一
般被忽略,常数也可以丢弃掉(要求的精度是很低的);
2. 能够通过计算极限limf(N)/g(N)来确定两个函数的相对增长 率; 3. 不要说成f(N)<=O(g(N)),因为定义已经隐含有不等式了。
Note: 当我们比较两个程序的复杂度时,确保N足够大。
结论对 N 2k 程序在教材 同样正确 p.40
应用实例:最大子列和问题
算法 4
“在线”算法
int MaxSubsequenceSum( const int A[ ], int N ) { 该算法的核心思想是基于下面的事实: int ThisSum, MaxSum, j; /* 1*/ ThisSum = MaxSum = 0; 1 3 3 2 2 4 4 6 1 6 1 /* 2*/ for ( j = 0; j < N; j++ ) { 如果整数序列 {a1, a2 , …, /* 3*/ ThisSum += A[ j ]; an}的最大和子列是 {ai, ai+1, …, aj} , l 那么必定有 对任意 /* 4*/ if ( ThisSum >0 MaxSum ) i ≤ l ≤ j 都成立。 a . k i k /* 5*/ MaxSum = ThisSum; /* 6*/ else if ( ThisSum < 0 ) 因此,一旦发现当前子列和为负,则可以重新开始考察一个新 /* 7*/ ThisSum = 0; 的子列。 } /* end for-j */ -2 4 1 -6 3 -1 5 /* 8*/ return MaxSum; }