(二) 时间/空间复杂度计算

203 阅读1分钟

@TOC

时间复杂度是什么?

一个函数,用大O表示,比如O(1)、O(n)、O(logN)...... 定性(大概)描述该算法的运行时间 在这里插入图片描述

O(1)

let i = 0;
i += 1

执行了一次

O(n)

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

执行了n次

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

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

相加忽略增长趋势更小的时间复杂度,取增长趋势更大的时间复杂度

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

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

相乘就执行相乘

O(logN)

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

2的多少次方为n?logN

空间复杂度是什么?

一个函数,用大O表示,比如O(1)、O(n)、O(n^2)...... 算法在运行过程中临时占用存储空间大小的量度

O(1)

let i = 0;
i += 1

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

O(n)

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

给list添加了n个值,相当于占用了n个内存单元

O(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)
	}
}

矩阵,行列,二维数组

思考题

1、如果一段代码中有3个循环,它们的循环次数都是n,那么这段代码的时间复杂度是 O(3n) 还是 O(n)? 2、假设每天睡觉前,你都会数2的次方,1、2、4、8……,每次你都数到 n 才睡着,那么你数了几个数?时间复杂度是多少?