提案。在Stack的调整大小数组实现中, 从的任何操作序列的平均数组访问次数 在最坏的情况下,空数据结构是不变的。
证明草图:对于导致数组增长的每个push()(例如从大小N到
大小为2N),考虑最近造成的N/2 - 1
push()操作
对于来自N/2 + 2 to N
的k,堆栈大小增长到k。平均4N阵列访问
使用N / 2阵列访问(每次推送一个)来增长阵列,我们得到平均成本
每个操作9个数组访问。证明使用的数组访问次数
M操作的任何序列与M的比例更复杂。
(算法第4版第1.4章)
我完全不了解Proof Sketch。请帮助我理解这一点。
答案 0 :(得分:1)
我认为这是一种摊销分析,你收取像push()这样的请求,这些请求不是直接由于它们而造成的,然后表明没有人必须支付太高的账单,这意味着平均成本完成的工作很少。
在这种情况下,你必须在空间不足时复制整个数组,但是当你这样做时,你需要加倍大小,所以你不要经常复制 - 例如大小为1,2,4,8,1 ......这里我们将每个数组副本计入自上次数组副本以来已完成的push()操作。这意味着如果除了push()之外什么都不做,那么每个push()只会为它之后发生的第一个数组副本获取账单,所以如果每次推送的账单(分成多个push()操作)很小( )那么摊销成本很小。
如果阵列在空间不足并且尺寸增加一倍之前大小为N,那么本文称这需要4N操作,这听起来很合理,而且我们并不关心常数因素。自上次加倍以来,这会分散在所有操作上。最后一次加倍是从大小N / 2到大小N,因此大约有N / 2。这会让你通过N / 2 push()操作分成4N操作,这样每次推送都会获得8的共享账单。不要忘记push()涉及数组写入,无论它是否触发大小加倍,你得到一个每次推送()的平均成本为9次。