算法时间复杂度

169 阅读2分钟

定义

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间衡量度,计作:T(n) = O(f(n)),它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

推导大O阶方法

  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项。
  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数。

以上得到的结果就是大O阶。

例1:

int sum = 0, n = 100;  // 执行一次
sum = (1+n)*n/2;	   // 执行一次
printf("%d", sum)	   // 执行一次

运行次数函数是f(n)=3,根据第一个规则先把常数项3改为1,没有最高阶,故该算法的时间复杂度为O(1),可称之为“常数阶”。

例2:

int i;
for (i = 0; i < n; i++) {
	// 执行n次
}

分析循环结构可知算法的时间复杂度为O(n),可称之为“线性阶”。

例3:

int i = 1;
while (i < n) {
	i = i * 2;
}

每次循环乘以2后,都更接近n,2x2^{x} = n,得到x=log2nx=log_2{n},所以这个循环的复杂度为O(lognlogn),可称之为“对数阶”。

....

除此之外还有“平方阶”、“立方阶”、“指数阶”等。

常用的时间复杂度耗费时间从小到大依次是: O(1)<O(logn)<O(n)<O(nlogn)<O(n2n^{2})<O(n3n^{3})<O(2n2^{n})。

总结

大O阶的推导复杂在对数列的一些相关运算,更多的是考察数学知识的掌握。

《大话数据结构》算法篇学习记录。