调整数组大小:应该做多少?

时间:2016-05-25 01:13:55

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

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

6 个答案:

答案 0 :(得分:3)

一方面,你不想经常这样做,特别是在大数据集上。 另一方面,你不想浪费太多记忆。通常好的策略可能是将大小乘以2(或1.5,如果你更关心内存而不是性能)。随着增长倍增,它将适应可能的增长,并且将是可预测的增长业务数量。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

但如果你懒得看here进行简短的解释

答案 3 :(得分:1)

您希望将数组大小乘以某个常数(例如1.75),它实际上并不重要。

通过乘法,您实现堆栈的方式是添加元素需要Amortized Constant Time

示例:

开始:

  • 数组大小:2
  • 作业:0
  • 总分配:0
  • 每次加入的平均分配数:n / a

添加第一个元素:

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

添加第二个元素:

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

添加第3个元素:

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

添加第4个元素:

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

添加第5个元素:

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

添加第6个元素:

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

...当你继续时,每个添加的平均分配将保持在2

答案 4 :(得分:0)

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

答案 5 :(得分:0)

只是尺寸的两倍,这是传统方法。