go - Golang中追加的大O

标签 go append complexity-theory slice

Go 的内置 append 函数的复杂度是多少?使用 + 进行字符串连接怎么样?

我想通过 append 两个不包括该元素的 slice 来从 slice 中删除一个元素,例如。 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表示如果目的地有足够的容量,则该 slice 被重新 slice 。我希望“重新 slice ”是一个恒定的时间操作。我也希望这同样适用于使用 + 的字符串连接。

最佳答案

这一切都取决于使用的实际实现,但我基于标准 Go 和 gccgo。

slice

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

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

字符串

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

关于go - Golang中追加的大O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332227/

相关文章:

go - 如何从 gRPC 获取方法扩展

algorithm - 什么算法计算一组集合中公共(public)元素的频率?

java - 在 O(n) 的文档中返回 10 个最常用的词

c# - HashSet<T>(IEqualityComparer<T>) 的查找时间复杂度是多少?

http - 服务器发送的事件(SSE)-自动重新连接

循环中的 GO 例程 - 函数调用

go - Beego or 不等于运算符

javascript - JQuery 函数仅打印出未定义

java - 用于 append 组合框的 ActionListener

Python 使用追加写入元组错误