一尘不染

Golang附加的大O

go

Go内置append函数的复杂性是什么?字符串串联使用+呢?

我想通过附加两个切片(不包括该元素)从切片中删除一个元素。http://play.golang.org/p/RIR5fXq-
Sf

nums := []int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println(append(nums[:4], nums[5:]...))

=> [0 1 2 3 5 6 7]

http://golang.org/pkg/builtin/#append表示,如果目的地有足够的容量,则该分片为resliced。我希望“切片”是一个恒定时间的操作。我也希望同样适用于使用的字符串连接+


阅读 220

收藏
2020-07-02

共1个答案

一尘不染

所有这些都取决于所使用的实际实现,但是我将其基于标准Go和gccgo。

切片

切片意味着更改结构中的整数(切片是具有三个字段的结构:长度,容量和指向后备内存的指针)。

如果分片没有足够的容量,则append将需要分配新的内存并复制旧的内存。对于具有<1024个元素的片,它将使容量加倍;对于具有>
1024个元素的片,它将使容量增加1.25倍。

弦乐

由于字符串是不可变的,因此与每个字符串串联+将创建一个新字符串,这意味着复制旧字符串。因此,如果您要循环执行N次,则将分配N个字符串,并在N次左右复制内存。

2020-07-02