20算法的复杂度

Posted 苏悠莫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20算法的复杂度相关的知识,希望对你有一定的参考价值。


算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。

时间复杂度

时间复杂度描述一个算法对数据规模和执行时间之间的关系。

举个简单的例子,要从0加到n,我们会这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
   sum += i;
}
一共算了n次加法,那么就说这个时间复杂度是O(n)。当然O(n)的精确的概念是,是n的最高次方,比如,某个计算共计算了3n + 2次,那么这个时间复杂度也是O(n),因为3n + 2中的最高次方是n。

如果代码这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
   for(int j = 0; j <=n; ++j)
   {
      sum += (i + j);
   }
}

很显然一共算了n^2次加法,那么就说这个时间复杂度是O(n^2),和上面类似,如果某个算法计算了3*n^2 + n + 1次,其时间复杂度仍然是O(n^2),因为3*n^2 + n + 1中最高的次方是n^2

所谓O(1)就是计算的次数是个常量,我们还以上面从0加到n的例子来说,如果我们用等差数列的公式,那么,代码可以这么写:
int sum = n * (n + 1) / 2
不管n有多大(当然不能溢出了),通过上面的公式只需计算一次,也就说计算的次数是不变的,这种情况的时间复杂度就可以说成O(1)。 再比如如果某个计算,不管其他条件怎么变化,均只需计算5次即可得出结果,那么这种情况的时间复杂度,也是O(1)。

(摘)

空间复杂度

是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算时通常是反复调用同一个方法,递归n次,就需要n个空间。

一般情况下是不考虑空间复杂度的,空间复杂度并不是指所有的数据所占用的空间,而是使用的辅助空间的大小,比如两个矩阵的运算,在中间设置了一个中间矩阵来保存一些数据,这些空间叫做空间复杂度。空间复杂度的运算非常麻烦,一般简单的算法空间复杂度都是O(1),比较复杂的会告知空间复杂度,记住就好了。

(摘)

以上是关于20算法的复杂度的主要内容,如果未能解决你的问题,请参考以下文章

视频二次裁剪时间计算出原片的时间片段算法

关于代码片段的时间复杂度

视频二次裁剪时间计算出原片的时间片段算法

PAT 乙级 1049 数列的片段和

以下代码片段的时间复杂度是多少?

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?