Big O Notation是一种表示算法的时间和空间复杂度的方法
1)时间复杂度:算法完成执行所花费的时间
2)空间复杂度:算法占用的内存
表示算法时间复杂度的表达式(符号)
O(1)
:恒定时间复杂度
O(log n)
:对数时间复杂度。如果log(n) = x
那么它与10^x
相同
O(n)
:线性时间复杂度。时间随着输入的数量呈线性增加。例如,如果一个输入需要1ms,那么4个输入需要4ms来执行算法
O(n^2)
:指数时间复杂度。主要发生在嵌套循环的情况下
O(n!)
:阶乘时间复杂度。这是最坏的情况,应避免
解决问题的方法或说解决问题的步骤、程序或规则集称为算法
例如:搜索引擎算法用于查找与搜索字符串相关的数
function oddArray(arr) {
let result = [];
function helperRecursiveFn(arr) {
// 判断数组长度是否为0
if(arr.length === 0) {
return; // 1
// 判断数组中的元素是否为奇数
} else if(arr[0] % 2 !== 0) {
// 把得到的奇数添加到result数组里面
result.push(arr[0]); // 2
}
helperRecursiveFn(arr.slice(1)); // 3
}
helperRecursiveFn(arr);
return result;
}
oddArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
// OutPut -> [1, 3, 5, 7, 9]
这里的递归函数是helperRecursiveFn
。
-
如果数组长度为0,则返回。
-
如果元素是奇数,则将元素推送到
result
数组。 -
使用切片数组的第一个元素调用
helperRecursiveFn
。每次都会切片数组的第一个元素,因为已经检查过它是奇数还是偶数。
例如:第一次用[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
调用helperRecursiveFn
。下一次将用[2, 3, 4, 5, 6, 7, 8, 9, 10]
调用helperRecursiveFn
,直到数组长度为0。