【数据结构与算法】第二章:算法分析
四个定义:
大 O O 记法:如果存在正常数 c c 和n0n0使得当 N⩾n0 N ⩾ n 0 时 T(N)≤cf(N) T ( N ) ≤ c f ( N ) ,则记为 T(N)=O(f(N)) T ( N ) = O ( f ( N ) ) .如果存在正常数 c c 和n0n0使得当 N⩾n0 N ⩾ n 0 时 T(N)≥cg(N) T ( N ) ≥ c g ( N ) ,则记为 T(N)=Ω(f(N)) T ( N ) = Ω ( f ( N ) ) . T(N)=Θ(H(N)) T ( N ) = Θ ( H ( N ) ) ,当且仅当 T(N)=O(f(N)) T ( N ) = O ( f ( N ) ) 且 T(N)=Ω(f(N)) T ( N ) = Ω ( f ( N ) ) .如果 T(N)=O(f(N)) T ( N ) = O ( f ( N ) ) 且 T(N)≠Θ(f(N)) T ( N ) ≠ Θ ( f ( N ) ) ,则记作 T(N)=o(f(N)) T ( N ) = o ( f ( N ) ) .在大 O O 记法中, T(N) T ( N ) 是 f(N) f ( N ) 的一个下界, f(N) f ( N ) 是 T(N) T ( N ) 的一个上界.
性质:
如果 T1(N)=O(f(N)) T 1 ( N ) = O ( f ( N ) ) 且 T2(N)=O(g(N)) T 2 ( N ) = O ( g ( N ) ) 那么a) T1(N)+T2(N)=max(O(f(N)),O(g(N))) T 1 ( N ) + T 2 ( N ) = m a x ( O ( f ( N ) ) , O ( g ( N ) ) ) b) T1(N)∗T2(N)=O(f(N)∗g(N)) T 1 ( N ) ∗ T 2 ( N ) = O ( f ( N ) ∗ g ( N ) ) 如果 T(N) T ( N ) 是一个 k k 次多项式,那么有 T(N)=Θ(Nk) T ( N ) = Θ ( N k ) .对于任意常数k, logkN=O(N) l o g k N = O ( N ) .常见增长率
函数名称 c c 常数 c c 常数 logN l o g N 对数 log2N l o g 2 N 对数平方根 N N 线性 NlogN N l o g N log2N l o g 2 N 对数平方根注,一般而言 Tavg(N)≤Tworst(N) T a v g ( N ) ≤ T w o r s t ( N )
给定正整数 A1,A2,...AN A 1 , A 2 , . . . A N 求 ∑jk=iAk ∑ k = i j A k 的最大值(若所给的整数均为负数,则最大子序列的和为0). 输入样例: -2, 11, -4, 13, -5, -2 输出结构: 20 (从 A2 A 2 到 A4 A 4 )
如果一个算法用常数时间 (O(1)) ( O ( 1 ) ) 将问题的大小削减为其一部分(通常是 12) 1 2 ) ,那么该算法的时间复杂度就是 (O(logN)) ( O ( l o g N ) ) .另一方面,如果使用常数时间只是把问题减少一个常数 (比如O(1)) ( 比 如 O ( 1 ) ) ,那么这个算法就是 (O(1)) ( O ( 1 ) ) 的.
对分查找 给定一个整数 X X 和整数 A1,A2,...AN A 1 , A 2 , . . . A N ,后者已经预先排序并在内存中,求使得 Ai=X A i = X 的下标 i i ,如果X不在数据中,则返回 i=1 i = 1 .
最简单的便是线性查找,时间复杂度为 (O(N)) ( O ( N ) ) ,
对分查找 int BinarySearch( int A[], int X, int N){ int Low, Mid, High; Low = 0; High = N - 1; while( Low <= High){ Mid = (Low + High) / 2; if( A[Mid] == X) return Mid; else if( A[Mid] < X) Low = Mid + 1; else if( A[Mid] > X) High = Mid - 1; } return NotFound; } 欧几里得算法 欧几里得算法是计算最大公因数的算法.两个数的最大公因数Gcd是同时整除二者的最大整数.例如Gcd(50,15)=5. 对于正整数M,N.假设M>N则必然有 M mod N < M/2. //假设M>N unsigned int Gcd( unsigned int M , unsigned int N){ unsigned int Rem; while( N > 0){ Rem = M % N; M = N; N = Rem; } return M; } 幂运算 假设机器的内存足够大.计算 XN X N 的一般方法是使用N-1次乘法. long int Pow( long int X, unsigned int N){ if( N == 0) return 1; if( N == 1) return X; if( N % 2 == 0) //X是偶数 return Pow( X*X, N/2); else return Pow( X*X, N/2) * X; }