我刚刚开始接收go
,我正在审视数据结构。我习惯在list
中使用python
或std::vector
中的C++
等动态数组,但我在go
中看不到任何类似内容。关于动态数组的好处是它具有添加新元素的O(1)时间复杂度,以及用于索引的O(1)时间复杂度。
首先我认为slice
就是它,但后来我意识到当我使用append函数时,整个切片正在复制,因此它是一个O(N)操作而不是动态数组中的O(1)。
然后我遇到了list,但这是一个双向链表,这意味着索引是O(N),而不是O(1)。
我错过了我要找的数据结构吗?
答案 0 :(得分:10)
首先我认为
slice
就是它,但是[n]我意识到当我使用append函数时,整个切片被复制,然后它就是O(N)操作而不是动态数组中的O(1)。
这不正确。
Per Go编程语言规范,append
检查支持切片的数组的容量,如果没有足够的空间,则只分配新内存(复制切片)支持阵列。 [link]我没有在规范中看到任何指定应该分配多少内存的内容,但是根据您链接到的博客文章,新的内存块将是当前大小的1.5倍。切片。这意味着,在重新分配/复制插入后,下一个 n / 2插入将不需要重新分配/复制。总体效果是摊销O(1)时间。这与您在其他语言中提到的示例使用的方法相同(Python中为list
,C ++中为std::vector
。)
因此,切片正是您所需要的。