我正在尝试使用 slice 在Go中实现一个非常简单的队列。这是我必须排入五个值然后丢弃前两个值的代码:

package main

import (
    "fmt"
)

var (
    localQ  []int
)

func main() {
    fmt.Printf("%v %v\n", localQ, len(localQ))
    for i := 0; i< 5; i++ {
        localQ = enqueue(localQ, i)

        fmt.Printf("%v %v\n", localQ, len(localQ))
    }

    localQ = dequeue(localQ, 2)

    fmt.Printf("%v %v\n", localQ, len(localQ))
}

func enqueue(q []int, n int) ([]int) {
    q = append(q, n)

    return q
}

func dequeue(q []int, s int) ([]int) {

    r := q[s:]

    q = nil

    return r
}

有关出队功能的两个问题:

1-我正在尝试确保将弹出的物品丢弃并进行垃圾收集。此功能是否导致它们被垃圾回收?

2- r := q[s:]的时间和空间复杂度是多少?我知道每个 slice 下都有一个数组。是否要复制数组值?还是只是被复制的指针?

最佳答案

此功能是否导致它们被垃圾回收?

如果应用程序加入足够数量的元素以导致重新分配 slice 支持数组,则先前的支持数组(及其元素)将有资格进行收集。

r:= q [s:]的时间和空间复杂度是多少?

这是O(1)操作。该操作不会在堆上分配内存。

10-08 04:44