相关疑难解决方法(0)

`追加'复杂性

Go编程语言中这个循环的计算复杂性是多少?

var a []int
for i := 0 ; i < n ; i++ {
  a = append(a, i)
}
Run Code Online (Sandbox Code Playgroud)

并append以线性时间(重新分配内存和每个追加拷贝的一切),或在固定的时间里操作(比如在许多语言方式矢量类是implemnted)?

go

10
推荐指数
1
解决办法
2374
查看次数

Go 切片容量在追加时如何变化?

在服务器上运行示例The Go Tour(当前版本为 1.12.7),我发现如果新切片长度大于当前支持数组的长度,则切片的容量会加倍到 2 的下一个幂。

如果我在我的机器上运行相同的程序(Windows 上的版本为 1.10.3),切片容量将更改为下一个 2 的倍数。

为什么它们不同?是因为 Go 版本还是运行时实现?容量变化是确定性的吗?

远程服务器上的输出是这样的

len=0 cap=0 []
len=1 cap=2 [0]
len=2 cap=2 [0 1]
len=5 cap=8 [0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

本地机器上的输出是这样的

len=0 cap=0 []
len=1 cap=1 [0]
len=2 cap=2 [0 1]
len=5 cap=6 [0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

这是参考代码

package main

import "fmt"

func main() {
    var s []int
    printSlice(s)

    // append works on nil slices.
    s = append(s, 0)
    printSlice(s)

    // The slice grows as …
Run Code Online (Sandbox Code Playgroud)

go slice

8
推荐指数
1
解决办法
9728
查看次数

标签 统计

go ×2

slice ×1