什么是算法?
算法是解决特定问题的一系列明确的步骤或指令。它通常用于处理数据并执行计算,涵盖从简单的数学运算到复杂的数据处理和决策逻辑。一个好的算法应具备以下特征:
- 明确性:每一步都应该是明确的,没有歧义。
- 有限性:算法在有限的步骤内应该能结束。
- 输入:可以有零个或多个输入。
- 输出:至少有一个输出。
- 有效性:每一步都应能够在有限的时间内完成。
算法的时间复杂度和空间复杂度
时间复杂度是衡量算法执行时间的函数,通常表示为输入规模(n)的函数,用 大O符号 表示 。它反映了随着输入规模的增加,算法所需的时间增长速度。常见的时间复杂度有:
- O(1):常数时间复杂度:无论输入规模如何,算法的执行时间都是固定的。
- O(log n):对数时间复杂度:随着输入规模的增加,执行时间以对数形式增长,常见于二分查找等算法。
- O(n):线性时间复杂度:执行时间与输入规模成正比,常见于遍历数组等操作。
- O(n log n):线性对数时间复杂度:常见于高效排序算法,如归并排序和快速排序。
- O(n²):平方时间复杂度:执行时间与输入规模的平方成正比,常见于简单的排序算法,如冒泡排序和选择排序。
- O(2^n):指数时间复杂度:执行时间随着输入规模的增加呈指数增长,常见于某些递归算法。
- O(n!): 阶乘时间复杂度:执行时间随着输入规模的增加呈阶乘增长,常见于排列组合问题。
空间复杂度指的是算法执行所需要的内存空间,同样用 大O符号 表示。
大O表示法的基本概念
大O表示法 是一种描述算法复杂度的方式,它用来表示算法执行时间或内存空间随着输入规模增长而变化的趋势。
-
渐进上界:大O表示法主要用于描述一个函数的渐进上界。换句话说,它描述了当输入规模趋近于无穷大时,算法的运行时间或空间需求的上限。
-
忽略常数因子和低阶项:在使用大O表示法时,我们通常忽略常数因子和低阶项,因为它们在输入规模非常大时对算法的增长率影响较小。例如,O(2n) 和 O(n) 都被简化为 O(n)。
-
关注最坏情况:: 大O表示法通常描述的是算法在最坏情况下的复杂度。
举例说明
// 时间复杂度分析:这个算法需要便利执行100次,因此其时间复杂度是 O(n),其中 n 是循环次数。
for (let i = 0; i < 100; i++) {
console.log(i);
}
//这个函数只使用了固定大小的变量(如 `total`),因此其空间复杂度是 O(1)。
function calculateSum(numbers) {
let total = 0;
for (let i = 0; i < numbers.length; i++) {
total += numbers[i];
}
return total;
}
let numbers = [1, 2, 3];
let result = calculateSum(numbers);
console.log(result);