时间复杂度和空间复杂度

145 阅读2分钟

时间复杂度

时间复杂度是一个函数,它定性描述该算法的运行时间

时间复杂度是用来估计程序的运行时间的,描述算法大概运行时间的趋势。

假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n)O(f(n))。

时间复杂度用O表示。

时间复杂度:1> log2n >n >nlog2n >n^2

O(1)

每次执行程序时,每行代码只会被执行一次。

let i=0;
i+=1;

O(n)

循环n次,for循环中的代码会被执行n次

for(let i=0;i<n;i+=1){
    console.log(i)
}

O(1)+O(n)=O(n)

代码先后排列,时间复杂度相加,则整体的时间复杂度为较大的时间复杂度(忽略增长趋势较小的时间复杂度)

let i=0;
i+=1;
for(let i=0;i<n;i+=1){
    console.log(i)
}

O(n)*O(n)=O(n^2)

代码嵌套,时间复杂度相乘,将括号中的值相乘

for(let i=0;i<n;i+=1){
    for(let i=0;i<n;i+=1){
    console.log(i)
}
}

O(logN)

while中的代码循环了logN次(2的多少次方大于或等于N)

let i=1;
while(i<n){
    console.log(i);
    i*=2;
 }

空间复杂度

空间复杂度是程序运城过程中临时占用的存储空间大小的量度。

O(1)

只声明了单个变量,单个变量占用的内存为1

let i=0;
i+=1;

O(n)

循环使变量i的值发生变化,为数组中添加了n个不同的变量值,占用了n个内存单元。

const list=[];
for(let i=0;i<n;i+=1){
    list.push(i);
}

O(n^2)

该代码结果为一个矩阵,本质为一个二维数组,存储了n^2个变量值,占用n^2个内存空间。

const matrix=[];
for(let i=0;i<n;i+=1){
    matrix.push([]);
    for(let j=0;j<n;j+=1){
        matrix[i].push(j);
    }
}