算法复杂度

63 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

他们说很多公司通过数据结构与算法去鉴别是否为优秀工程师(考虑鉴别成本+成功率)

科普:算法复杂度

什么是复杂度?

即复杂的程度----程序执行时需要的计算量内存空间(和代码是否简洁无关)指的是计算机cpu和内存占用多少。

复杂度是一个数量级(方便记忆,推广),不是具体的数字

一般针对一个具体的算法,而非一个完整的系统。

image.png

1.O(1)可数的。几次几次。

2.O(logn)随着原始数据输入,趋近于平缓。好现象

3.O(n)一条分割线。也行

4.O(nlogn)计算量增加时,曲线增大越来越明显。

5.O(n*2)这个不太好,增的非常非常快,不是我们想看到的

时间复杂度?

O(1)一次就够。

function fn(){
//O(1)
return obj.a;  //1
return obj.a+obj.b+obj.c; //3
}

O(logn)数据量的对数(数量级)

//O(logn)
二分查找

O(n)和传输的数据量一样。

//O(n)
function fn(arr=[]){
for(let i = 0;i<arr.length;i++){
    console.log(n)
  }
}

O(nlogn)数据量*数据量的对数。

    //O(n*logn)
    一个for循环+一个二分查找
}

O(n*2)数据量的平方。 算法基本不可用

//O(n*2)
function(arr=[][]){
      for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr.length; j++) {
            console.log(n)
        }
    }
}

空间复杂度?

程序执行时需要的内存空间。

function fn(arr=[]){
    //以下代码空间复杂度为O(1)
    const a = arr[1]
    
    //以下代码空间复杂度为O(n)
    const arr2 = [];
    for(let i =0;i<arr.length;i++){
       arr2[i] = arr[i]+10;
    }
}

image.png

如果没有复杂度的概念和敏感度,写程序是非常危险的。

他们说前端有些重时间 轻空间。

还说普通tree diff算法是O(n*3)

react优化vdom tree ---------O(n)

所以,过段时间我重新学习一下react.