在Bloch写的书中写道:
class Stack{
private Object[] elements;
// Code omitted
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
// Ensure space for at least one more element
private void ensureCapacity() {
if (elements.length==size) {
elements = Arrays.copyOf(elements, 2*size + 1);
}
}
}
他为什么要使用
2 *大小+ 1
将数组的大小增加1?
答案 0 :(得分:2)
当堆栈变满时,它的大小加倍。
0 - > 2 * 0 + 1 = 1
1 - > 1 * 2 + 1 = 3
3 - > 3 * 2 + 1 = 7
7 - > 7 * 2 + 1 = 15
这是动态数组的功能。通过在每次达到最大容量时加倍,可以减少在空间不足时复制整个阵列的大复杂性。
在数据结构中存储n个元素所花费的时间是O(2n),它实际上是O(n),它与固定大小的数组相同,不需要处理复制成本。
如果您希望看到这个奇妙想法的证明和直观解释,请观看lecture by Prof. Skiena from the 41 minute mark。
答案 1 :(得分:0)
因为否则你需要专门处理空案例:如果你总是加倍容量,那么从空数组到单元素数组是不可能的。当然,您可以“如果尺寸为string filePath=@"C:\sample.txt"; // or something like this
string[] lines=System.IO.File.ReadAllLines(filePath);
,则为0
;否则为1
”;但2 * size
处理它时没有条件(2 * size + 1
到0
,1
到1
,3
到3
...... )。线索可以在评论中找到:
7
(“至少还有一个元素”,无论/**
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
*/
是什么)。
答案 2 :(得分:0)
"旧物品" (数组中的元素)将被复制到此行中的新数组中:
elements = Arrays.copyOf(elements,2 * size + 1); 至于旧的元素数组,它最终会被垃圾收集,因为没有更多的引用指向它。