没有内置的动态数组吗?

时间:2014-12-15 02:30:13

标签: go

我刚刚开始接收go,我正在审视数据结构。我习惯在list中使用pythonstd::vector中的C++等动态数组,但我在go中看不到任何类似内容。关于动态数组的好处是它具有添加新元素的O(1)时间复杂度,以及用于索引的O(1)时间复杂度。

首先我认为slice就是它,但后来我意识到当我使用append函数时,整个切片正在复制,因此它是一个O(N)操作而不是动态数组中的O(1)。

然后我遇到了list,但这是一个双向链表,这意味着索引是O(N),而不是O(1)。

我错过了我要找的数据结构吗?

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。)

因此,切片正是您所需要的。