【数据结构与算法】时间复杂度和空间复杂度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38371360/article/details/86179695

此文为FishC大佬《数据结构与算法》第三、四、五讲时间复杂度的笔记整理。

判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。

算法时间复杂度

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n))

它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

如果分析一个算法的时间复杂度呢?

  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项
  • 循环的时间复杂度 = 循环体的复杂度 * 该循环运行的次数
  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数
  • 得到的最终结果就是大O阶

常数阶、平方阶都比较简单,下面来看下对数阶。

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

2^x = n \rightarrow x = log_2n  所以这个循环的时间复杂度为O(logn)

n++;
function(n);
for (i = 0; i < n; i++) {
	function(i);
}
for (i = 0; i < n; i++) {
	for (j = i; j < n; j++) {
		printf("%d",j)
	}
}

时间复杂度为: 1 + n^2 +n^2+n^2 \rightarrow n^2

 常用的时间复杂度所耗费的时间从小到大依次是:

\large O\left ( 1 \right )<O\left(logn \right )<O\left(n \right )<O\left(nlogn \right )<O\left(n^2 \right )<O\left(n^3 \right )<O\left(2^n \right )<O\left(n! \right )<O\left(n^n \right )

猜你喜欢

转载自blog.csdn.net/weixin_38371360/article/details/86179695