在Golang追加的大O.

Kal*_*ope 11 complexity-theory append go slice

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]
Run Code Online (Sandbox Code Playgroud)

http://golang.org/pkg/builtin/#append说如果目的地有足够的容量,那么那个切片就是resliced.我希望"reslicing"是一个恒定的时间操作.我也希望使用相同的字符串连接+.

Dom*_*nef 22

这一切都取决于所使用的实际实现,但我基于标准Go以及gccgo.

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

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

字符串

由于字符串是不可变的,因此每个字符串连接+将创建一个新字符串,这意味着复制旧字符串.因此,如果您在循环中进行N次,则将分配N个字符串并将内存复制N次.

  • 换句话说,将元素附加到切片上是分摊O(1). (9认同)
  • 上).切片是可变的,字符串不是→它必须复制数据. (3认同)
  • 官方记录在任何地方吗? (2认同)