Skip to content

时间与空间复杂度

复杂度描述算法的资源消耗如何随输入规模增长:

  • 时间复杂度: 执行需要多少步骤
  • 空间复杂度: 需要多少额外内存

📊复杂度对比

10
选择要对比的复杂度:
O(1)
1
1 纳秒
O(log n)
3
3 纳秒
O(n)
10
10 纳秒
O(n log n)
33
33 纳秒
O(n²)
100
100 纳秒
💡

当 n 较小时,各复杂度差异不明显。试试增加 n 到 20 或更大!


复杂度名称n=10n=100n=1000典型算法
O(1)常数111数组访问、哈希查找
O(log n)对数3710二分查找
O(n)线性101001,000遍历数组
O(n log n)线性对数336649,966快排、归并排序
O(n²)平方10010,0001,000,000冒泡排序、嵌套循环
O(2ⁿ)指数1,02410³⁰💥斐波那契递归
O(n!)阶乘3,628,800💥💥全排列暴力

function getFirst(arr) {
return arr[0]; // 无论数组多大,只访问一次
}
function findMax(arr) {
let max = arr[0];
for (let i = 1; i < arr.length; i++) { // 遍历 n 次
if (arr[i] > max) max = arr[i];
}
return max;
}
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) { // n 次
for (let j = 0; j < arr.length - i; j++) { // n 次
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
}
function binarySearch(arr, target) {
let left = 0, right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) left = mid + 1; // 每次排除一半
else right = mid - 1;
}
return -1;
}

复杂度说明示例
O(1)原地操作冒泡排序、变量交换
O(n)额外数组归并排序的临时数组
O(log n)递归栈快排的递归深度
O(n²)二维数组动态规划表

  • O(1): 一步到位,跟数据量无关
  • O(log n): 每次砍半(二分思想)
  • O(n): 看一遍全部数据
  • O(n log n): 最优排序的极限
  • O(n²): 两层嵌套循环
  • O(2ⁿ): 爆炸增长,慎用!