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

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

有没有办法做到这一点?

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

谢谢!

【问题讨论】:

标签: arrays algorithm memory-management dynamic-arrays


【解决方案1】:

我最终得到了以下结果:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 2015-01-12
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多