A \emph{resizable array} is an array that can \emph{grow} and \emph{shrink} by the addition or removal of items from its end, or both its ends, while still supporting constant-time \emph{access} to each item stored in the array given its \emph{index}. Since the size of an array, i.e., the number of items in it, varies over time, space-efficient maintenance of a resizable array requires dynamic memory management. A standard doubling technique allows the maintenance of an array of size~$N$ using only $O(N)$ space, with $O(1)$ amortized time, or even $O(1)$ worst-case time, per operation. Sitarski and Brodnik et al.\ describe much better solutions that maintain a resizable array of size~$N$ using only $N+O(\sqrt{N})$ space, still with $O(1)$ time per operation. Brodnik et al.\ give a simple proof that this is best possible. We distinguish between the space needed for \emph{storing} a resizable array, and accessing its items, and the \emph{temporary} space that may be needed while growing or shrinking the array. For every integer $r\ge 2$, we show that $N+O(N^{1/r})$ space is sufficient for storing and accessing an array of size~$N$, if $N+O(N^{1-1/r})$ space can be used briefly during grow and shrink operations. Accessing an item by index takes $O(1)$ worst-case time while grow and shrink operations take $O(r)$ amortized time. Using an exact analysis of a \emph{growth game}, we show that for any data structure from a wide class of data structures that uses only $N+O(N^{1/r})$ space to store the array, the amortized cost of grow is $\Omega(r)$, even if only grow and access operations are allowed. The time for grow and shrink operations cannot be made worst-case, unless $r=2$.
翻译:\ emph{ (emph{ explate) 是一个阵列, 可以从端端端或端端中添加或删除项目, 或者两个端中, 支持恒定时间\ emph{ 访问} 存储于阵列中的每个项目, 因为它的 emph{ index} 。 由于阵列的大小, 即其中的项目数量随时间变化而变化, 空间可变阵列的维护需要动态的内存管理。 标准的双倍技术允许仅使用 O( N) 美元空间, 或两个端端端中的项目, 或两个端端端端端中的项目, 只要使用 $N+( sqrt{ N) 的空格, 空格的节节能维护一个大小的内值, 以美元计数中的内值 。 标准双倍的阵列技术允许仅使用 $( N) = N$( N) 的内存内, 的内存内存内存和内存内存的内存中的任何时间, 提供一个最短的内存 。