是否可以在不重新分配的情况下实现动态数组?
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),因此它不适用于非常一般的情况(对于某些值,任何固定大小都会有些大或有些小)。
【讨论】:
以上是关于是否可以在不重新分配的情况下实现动态数组?的主要内容,如果未能解决你的问题,请参考以下文章