时间复杂度
1、简化方法:
O(常数):O(1)
O(an+b):O(n)
O(n^m+n^n+...): 假设m最大,则为O(n^m)
2、常见时间复杂度例子
O(1):
function foo(){
let n = 1
let b = n * 100
if(b === 100){
console.log("开始吃糖")
}
console.log("我吃了1颗糖")
console.log("我吃了2颗糖")
......
console.log("我吃了10000颗糖")
}
O(n):只有一层循环或递归等
function foo1(n){
for( let i = 0; i < n; i++){
console.log("我吃了一颗糖")
}
}
function foo2(n){
while( --n > 0){
console.log("我吃了一颗糖")
}
}
function foo3(n){
console.log("我吃了一颗糖")
--n > 0 && foo3(n)
}
O(n²):嵌套循环
function foo1(n){
for( let i = 0; i < n; i++){
for( let j = 0; j < n; j++){
console.log("我吃了一颗糖")
}
}
}
function foo2(n){ n^2+n=>n^2
for( let k = 0; k < n; k++){
console.log("我吃了一颗糖")
}
for( let i = 0; i < n; i++){
for( let j = 0; j < n; j++){
console.log("我吃了一颗糖")
}
}
}
O(logn):需要通过a^x=y这样的表达式,得出x的情况
logn的底数不是固定的,可能为2可能为3...
function foo1(n){
let day = 0
while(n > 1){
n = n/2
day++
}
return day
}
function foo2(n){
for(let i = 0; i < n; i *= 2){
console.log("一天")
}
}
O(nlogn): O(logn)的基础上再加个循环
如二分法外围再套个循环
时间复杂度排序:
空间复杂度:
算法执行过程中,需要开辟多少空间
O(1):不会因为算法里的执行,导致额外的空间增长,就算是一万行,空间复杂度也是 O(1)
function foo(){
let n = 1
let b = n * 100
if(b === 100){
console.log("开始吃糖")
}
console.log("我吃了1颗糖")
console.log("我吃了2颗糖")
......
console.log("我吃了10000颗糖")
}
O(n):
n的数值越大,算法需要分配的空间就需要越多
function foo(n){
let arr = []
for( let i = 1; i < n; i++ ) {
arr[i] = i
}
}
O(n^2):
function foo(n){
let arr = []
for( let i = 1; i < n; i++ ) {
let arr2=[];
for( let j = 1; j < n; j++ ) {
arr2.push(j)
}
arr.push(arr2);
}
}