algorithm - 二进制计数器摊销分析

标签 algorithm analysis amortized-analysis

我想您已经知道,如果数组中的所有条目都从 0 开始,并且在每一步我们都将计数器递增 1(通过翻转 0 和 1),那么 k 递增的摊销成本为 O(k)。

但是,如果数组以 n 开头会怎样?我虽然 k 增量的复杂度现在可能是 O(log(n) + k),因为在开始时 1 的最大数量是 log(n)。

有什么建议吗?

提前致谢

最佳答案

你是对的。证明这一点的方法不止一种,其中一种是具有潜在功能。 This link (和许多其他人)解释潜在的方法。然而,教科书上通常要求势函数的初值为0,我们就归纳为不是0的情况。

对于二进制计数器来说,计数器的势函数是设置为1的位数。当你递增时,你花费k+1次将k个1翻转为0,一个0翻转为1。势减少k -1。所以这个增量的摊销时间 = ActualTime+(PotentialAfter-PotentialBefore) = k+1-(k-1) = 2(常量)。

现在查看维基百科链接中的“摊销时间与实际时间之间的关系”部分。

TotalAmortizedTime = TotalActualTime + SumOfChangesToPotential

由于 SumOfChangesToPotential 是伸缩的,因此它等于 FinalPotential-InitialPotential。所以:

TotalAmortizedTime = TotalActualTime + FinalPotential-InitialPotential

给出:

TotalActualTime = TotalAmortizedTime - FinalPotential + InitialPotential <= TotalAmortizedTime + InitialPotential

因此,正如您所说,从 n 开始的 k 个增量序列的总时间是 O(log n + k)。

关于algorithm - 二进制计数器摊销分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191641/

相关文章:

python - 如何使用 aubio 找到 .wav 的速度?

c# - 排序算法在处理较大的数据集时会导致堆栈溢出?

algorithm - Haskell 上枚举总和和乘积类型的通用算法?

vim - vim 的生产力分析器

algorithm - 关于斐波那契堆的设计与分析的问题

algorithm - 最小堆的摊销分析?

complexity-theory - 需要 O(1) 摊销时间的操作在最坏情况下可以有 O(n^2) 时间吗?

c++ - 为什么快速排序会引发异常 “write access violation”

algorithm - 使用递归算法通过字符矩阵查找文本路径

sql - 从 SQL 分析时间相关的事件日志