时间复杂度与空间复杂度(上)

时间复杂度与空间复杂度(上)_第1张图片

1、时间复杂度:算法的执行时间与数据规模之间的增长关系

    function sum(n) {
      //1个时间
      let sum=0
      //1个时间
      let i=0
      //i++执行n次,需要n个时间
      for(;i

T(n)=O(2n+2)

    function doubleSum(n) {
      //1
      let sum=0
      //1
      let i=0
      //1
      let j=0
      //n
      for(;i

T(n)=(2n^2+2n+3)


2、综上:代码执行的时间T(n)与代码执行的次数n成正比,即 T(n)=O(f(n))
T(n):代码执行的时间
n:数据规模的大小(即代码执行的次数)
f(n):代码执行次数的总和
O():表示T(n)与f(n)成正比
注意:大O 时间复杂度 并不代表代码真正执行的时间,而是表示 代码执行时间随数据规模增长的变化趋势。


3、细化:
T(n)=O(2n+2)
最大量级为 n
即T(n)=O(n)

T(n)=(2n^2+2n+3)
最大量级为 n^2
即T(n)=O(n^2)

注意:即使+3、+1000、+10000,这些都是已知的常量,与n无关,即使会对代码执行时间有影响,但对O(n)是没有影响的,因为O(n)表示的是数据规模的增长趋势


4、如何分析一段代码的时间复杂度?
(1)关注循环执行次数最多的一段代码
(2)复杂度等于量级最大的那段代码的复杂度
(3)嵌套代码的复杂度等于嵌套内外代码复杂度的乘积


5、复杂度量级:
(1)多项式量级
O(1)
O(logn)
O(n)
O(nlogn)
O(n^k)


(2)非多项式量级
O(2^n)
O(n!) //n!=nx(n-1)x(n-2)x....3x2x1


6、时间复杂度分析
(1)O(1):
只要代码中不存在循环语句、递归语句、即使有上万行代码,时间复杂度也是O(1)

(2)O(logn)

    let i=1
    while(i<=n){
      // 1   2   4   8   16   32 ...
      //2^0 2^1 2^2 2^3 2^4  2^5 ... 2^x
      i=i*2
    }
    //当i>n停止,即 2^x=n , x=log2^n 即 logn

当i>n停止,即 2^x=n , x=log2^n 即 logn

(3)O(nlogn)
归并排序、快速排序的时间复杂度都是O(nlogn)

(4)O(m+n)

    function sum1(n,m) {
      let sum1=0
      let i=0
      for(;i

T(n)=O(m+n)


7、空间复杂度
算法的存储空间与数据规模之间的增长关系

 let array=new Array(n)

如上,空间复杂度为O(n)


8、大O复杂度图表

时间复杂度与空间复杂度(上)_第2张图片

(完)

你可能感兴趣的:(时间复杂度与空间复杂度(上))