【发布时间】:2023-04-05 15:56:01
【问题描述】:
我正在使用数组实现堆栈。当我将项目推入堆栈时,它需要在某个时候增长。所以我想知道它应该调整多少?我应该用一个常数调整它的大小吗? 请告诉我。
【问题讨论】:
-
您可以使用 ArrayList 代替数组,并将调整大小留给框架。
标签: java arrays data-structures stack dynamic-arrays
我正在使用数组实现堆栈。当我将项目推入堆栈时,它需要在某个时候增长。所以我想知道它应该调整多少?我应该用一个常数调整它的大小吗? 请告诉我。
【问题讨论】:
标签: java arrays data-structures stack dynamic-arrays
您应该调整的大小实际上取决于您要添加到数组中的内容。此外,您应该通过常量调整它的大小,这样您就不必通过更复杂的方法来调整数组的大小。
【讨论】:
IIRC .net 框架会在必要时尝试将 list 的大小增加一倍,这对您来说也是一个好方法。
【讨论】:
只是两倍大小,这是传统方法。
【讨论】:
这几乎完全取决于您的堆栈需要做什么以及用途是什么,但在通用堆栈上,一旦达到限制,将堆栈加倍通常是最有利的。这可以很容易地使用摊销分析来显示。我很确定你会在互联网的某个地方找到这方面的证据:P
但如果你很懒,请查看 here 以获得简要说明
【讨论】:
一方面,您不想经常这样做,尤其是在处理大量数据时。 另一方面,您不想浪费太多内存。通常好的策略可能是将大小乘以 2(或 1.5,如果您更关心内存而不是性能)。随着翻倍,它将适应可能的增长,并且将是可预测的增长操作数量。
【讨论】:
您想将数组大小乘以某个常数(例如 1.75),这并不重要。
通过乘法,您正在以这样一种方式实现堆栈,即添加一个元素需要Amortized Constant Time。
例子:
开始:
添加第一个元素:
添加第二个元素:
添加第三个元素:
添加第四个元素:
添加第 5 个元素:
添加第 6 个元素:
...随着您继续,每次添加的平均分配将保持在 2 左右
【讨论】: