算法的时间复杂度定义为:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。
根据定义,求解算法的时间复杂度的具体步骤是:
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
如何推导大o阶呢?我们给出了下面 的推导方法:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最髙阶项。
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。
简单的说,就是保留求出次数的最高次幂,并且把系数去掉。 如T(n)=2n^2+n+1 =O(n^2)
举个例子。
#include "stdio.h"int main(){ int i, j, x = 0, sum = 0, n = 100; /* 执行1次 */ for( i = 1; i <= n; i++) /* 执行n+1次 */ { sum = sum + i; /* 执行n次 */ for( j = 1; j <= n; j++) /* 执行n*(n+1)次 */ { x++; /* 执行n*n次 */ sum = sum + x; /* 执行n*n次 */ } } printf("%d", sum); /* 执行1次 */}
按照上面推导“大O阶”的步骤,我们来看
第一步:“用常数 1 取代运行时间中的所有加法常数”,
则上面的算式变为:执行总次数 =3n^2 + 3n + 1
(直接相加的话,应该是T(n) = 1 + n+1 + n + n*(n+1) + n*n + n*n + 1 = 3n^2 + 3n