是否可以在不重新分配的情况下实现动态数组?

Posted

技术标签:

【中文标题】是否可以在不重新分配的情况下实现动态数组?【英文标题】:Is it possible to implement a dynamic array without reallocation? 【发布时间】:2022-01-12 00:39:21 【问题描述】:

实现动态数组的默认方式是使用realloc。一旦len == capacity 我们使用realloc 来扩展我们的数组。这可能导致将整个数组复制到另一个堆位置。我不希望发生这种复制,因为我正在设计一个应该能够存储大量元素的动态数组,而运行此代码的系统将无法处理如此繁重的操作。

有没有办法做到这一点?

失去一些性能我很好 - O(logN) 用于搜索而不是 O(1) 是可以的。我在想我可以为此使用哈希表,但看起来我陷入了僵局,因为为了实现这样的哈希表,我首先需要一个动态数组。

谢谢!

【问题讨论】:

en.wikipedia.org/wiki/Rope_(data_structure) 【参考方案1】:

我最终得到了以下结果:

    实施可以增长的“小型动态数组”,但只能达到某个最大容量(例如 4096 个字)。 实现 rbtree 将它们组合在一起形成一个“大哈希映射”,其中“小数组”用作表,而一堆 rbtree 用作存储桶。 将此哈希图用作“大动态数组”的基础,使用索引作为键

当容量小于最大容量时,表会根据负载因子增长。一旦容量达到最大值,表将不再增长,新元素只是插入到桶中。这种结构理论上应该具有 O(log(N/k)) 复杂度。

【讨论】:

【参考方案2】:

并非如此,一般情况下不会。

当内存管理器无法增加当前分配,需要将内存块移动到其他地方时,就会发生复制。

您可以尝试的一件事是分配固定大小的块并保持指向块的动态数组。这样就不需要重新分配块,从而将大型有效负载保持在适当的位置。如果您需要重新分配,您只需重新分配应该便宜得多的引用数组(移动 8 个字节而不是 1 或更多 MB)。理想情况下,块大小约为 sqrt(N),因此它不适用于非常一般的情况(对于某些值,任何固定大小都会有些大或有些小)。

【讨论】:

以上是关于是否可以在不重新分配的情况下实现动态数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的动态数组可以在不调整大小的情况下工作? [复制]

如何调整动态分配的多态对象数组的大小?

函数在不删除动态数组的情况下工作。程序有效且没有错误

动态阵列的摊余时间

R:在没有预分配的情况下动态更新矩阵时的效率问题

数组和链表