数据结构与算法02

464 阅读2分钟

时间复杂度

时间复杂度是算法中一个很重要的概念,是用与衡量一个算法运行快慢的标准。最坏时间复杂度用大O(n)表示

   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
        sum = sum + i;
   }
   return sum;
 }

例如上面这段代码,它的最坏时间复杂度就为O(n)。那么,这个结果是如何得出的呢。这段代码从第一行开始执行,然后到了for循环,此时代码执行了两次,然后for循环是从i=1,直到i>n,程序才会跳出for循环,那么程序在这个for循环中执行了n次。然后接着看for循环中的语句,这个语句随着for循环执行了n次。最后就到了return语句,此时代码结束运行。那么把他们加起来就是O(2n+2)。在时间复杂度的计算中,我们引入了一个很重要的概念就是数量级,这句话是什么意思呢。O(2n+2)这个时间复杂度中有两个常数,把这两个常数忽略,就得到了O(n)。举个例子,当n→∞时,不论是2n还是10n,100n,都等于n,这是因为n就是无穷大了,那么不论n乘上任何常数都是无穷大。除非n*n或者n乘或除任何含有n的的式子。O(logn)、O(n)、O(nlogn)、O(n²)这是几个常见的时间复杂度。

空间复杂度

空间复杂度就是在算法运算的过程中,是否使用了额外空间来储存或辅助数据进行运算。

void print(int n) {
  int i = 0;
  int[] a = new int[n];
  for (i; i <n; ++i) {
    a[i] = i * i;
  }

  for (i = n-1; i >= 0; --i) {
    print out a[i]
  }
}

例如上面这段代码,第一行声明了一个i的变量,第二行我们开辟了一个大小为n的数组来进行辅助存储数据,那么这段代码的空间复杂度就为O(n+1),和时间复杂度一样,对于常数,我们依然可以忽略,那么最终的空间复杂度就为O(n).