【问题标题】:Resizing an array: How much should it be done?调整数组大小:应该做多少?
【发布时间】:2023-04-05 15:56:01
【问题描述】:

我正在使用数组实现堆栈。当我将项目推入堆栈时,它需要在某个时候增长。所以我想知道它应该调整多少?我应该用一个常数调整它的大小吗? 请告诉我。

【问题讨论】:

  • 您可以使用 ArrayList 代替数组,并将调整大小留给框架。

标签: java arrays data-structures stack dynamic-arrays


【解决方案1】:

您应该调整的大小实际上取决于您要添加到数组中的内容。此外,您应该通过常量调整它的大小,这样您就不必通过更复杂的方法来调整数组的大小。

【讨论】:

  • 您是否建议将数组加倍?
  • 将数组加倍在某些时候是多余的,并且大小会呈指数增长,我建议一次增加数组大小的 1.5 倍。
【解决方案2】:

IIRC .net 框架会在必要时尝试将 list 的大小增加一倍,这对您来说也是一个好方法。

【讨论】:

    【解决方案3】:

    只是两倍大小,这是传统方法。

    【讨论】:

    • 你能告诉我为什么吗?
    • 因为在大多数情况下,我们将其增加 2 倍、3 倍或 1.5 倍都不是什么大问题。我们只是希望当我们达到极限时它会更大,而且你知道 2 在计算机科学界总是很受欢迎,而 1.5 似乎很复杂,如果超过 2 也有点浪费空间。所以选择 2。跨度>
    【解决方案4】:

    这几乎完全取决于您的堆栈需要做什么以及用途是什么,但在通用堆栈上,一旦达到限制,将堆栈加倍通常是最有利的。这可以很容易地使用摊销分析来显示。我很确定你会在互联网的某个地方找到这方面的证据:P

    但如果你很懒,请查看 here 以获得简要说明

    【讨论】:

      【解决方案5】:

      一方面,您不想经常这样做,尤其是在处理大量数据时。 另一方面,您不想浪费太多内存。通常好的策略可能是将大小乘以 2(或 1.5,如果您更关心内存而不是性能)。随着翻倍,它将适应可能的增长,并且将是可预测的增长操作数量。

      【讨论】:

      • 可能是一个你可以通过构造函数设置的标志来告诉类你是想要性能还是内存?例如 1-10 int 值,范围从 10% 到例如 1000% 大小增加
      【解决方案6】:

      您想将数组大小乘以某个常数(例如 1.75),这并不重要。

      通过乘法,您正在以这样一种方式实现堆栈,即添加一个元素需要Amortized Constant Time

      例子:

      开始:

      • 数组大小:2
      • 作业:0
      • 作业总数:0
      • 每次添加的平均分配:不适用

      添加第一个元素:

      • 数组大小:2
      • Assignments: 1: //向数组添加值
      • 作业总数:1
      • 每次添加的平均分配:1

      添加第二个元素:

      • 数组大小:2
      • Assignments: 2: //向数组添加值
      • 作业总数:2
      • 每次添加的平均分配:1

      添加第三个元素:

      • 数组大小:4 // 双数组
      • Assignments: 3: // 将旧值复制到新数组 + 添加新值
      • 作业总数:5
      • 每次添加的平均分配:5/3 ~ 2

      添加第四个元素:

      • 数组大小:4 // 双数组
      • Assignments: 1: // 将旧值复制到新数组 + 添加新值
      • 作业总数:6
      • 每次添加的平均分配:5/4 ~ 2

      添加第 5 个元素:

      • 数组大小:8 // 双数组
      • Assignments: 5: // 将旧值复制到新数组 + 添加新值
      • 作业总数:11
      • 每次添加的平均分配:11/5 ~ 2

      添加第 6 个元素:

      • 数组大小:8 // 双数组
      • Assignments: 1: // 将旧值复制到新数组 + 添加新值
      • 作业总数:12
      • 每次添加的平均分配:12/6 = 2

      ...随着您继续,每次添加的平均分配将保持在 2 左右

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        • 2011-04-27
        相关资源
        最近更新 更多