时间复杂度和空间复杂度

128 阅读1分钟

1,时间复杂度 (算法执行次数)

排序的时间复杂度为 O(NlogN)

O(1) : 传入参数对算法执行次数没有影响

func O1(){
    a := 1
    b := 1
    fmt.Println(a + b)
}

O(N) : 与传入的参数大小直接相关,存在循环。

func On(nums []int){
    for _, v := range nums {
        fmt.Println(v)
    }
}

O(logN): 执行时间 log 以2 底 N次方。

func OlogN(num){
    for i := 1; i < num;{
        i = i * 2
    }
}

O(M+N):两个并列for循环

func OMN(num1,num2 int){
    for i := 1; i < num1; i++ {
        
    }
    for j := 1; j < num2; j++ {
        
    }
}

O(NlogN):嵌套循环,其中一层循环次数为 OlogN

func ONLogN(num1,num2 int) {
    total := 0
    for i := 0; i < num1; i++ {
        for j:= 0; j < num2; {
            j = j * 2
        }
    }
    fmt.Println(total)
}
​

O(N^2): 嵌套循环

func ON2(num int) {
    total := 0
    for i := 0; i < num1; i++ {
        for j:= 0; j < num2; {
            total = j + i
        }
    }
    fmt.Println(total)
}

2,空间复杂度 (存储空间与输入值之间的关系)

解释:占空间的 为变量。 语句不占空间。 所以主要需要寻找的就是变量。

大部分都为 O(1) O(n) 递归会存在一个为O(N)栈,所以为O(N)

O(1): 只有一个变量。并且只在一个变量上进行操作

func test(num int){
    total = 0
    for i := 0; i < num; i++ {
        total += i
    }
    return total
}

O(N):进行切片扩容操作。

func test(nums []int){
    var array []int
    for _, v := range nums {
        array = append(array,v)
    }
}