Algorithm 二元计数器摊销分析
我想您已经知道,如果数组中的所有条目都从0开始,并且在每一步我们将计数器增加1(通过翻转0和1),那么k个增量的摊销成本是O(k) 但是,如果数组以n开头会发生什么?我认为可能k增量的复杂性现在是O(log(n)+k),因为在开始时,1的最大数量是log(n) 有什么建议吗Algorithm 二元计数器摊销分析,algorithm,analysis,amortized-analysis,Algorithm,Analysis,Amortized Analysis,我想您已经知道,如果数组中的所有条目都从0开始,并且在每一步我们将计数器增加1(通过翻转0和1),那么k个增量的摊销成本是O(k) 但是,如果数组以n开头会发生什么?我认为可能k增量的复杂性现在是O(log(n)+k),因为在开始时,1的最大数量是log(n) 有什么建议吗 提前谢谢你说得对。证明这一点的方法不止一种,其中一种是用势函数。(和许多其他人)解释潜在的方法。然而,教科书通常要求势函数的初始值为0。让我们概括一下,情况并非如此 对于二进制计数器,计数器的势函数是设置为1的位数。当你递增
提前谢谢你说得对。证明这一点的方法不止一种,其中一种是用势函数。(和许多其他人)解释潜在的方法。然而,教科书通常要求势函数的初始值为0。让我们概括一下,情况并非如此 对于二进制计数器,计数器的势函数是设置为1的位数。当你递增时,你会花费k+1的时间将K1翻转为0,并将一个0翻转为1。电位降低k-1。因此,该增量的摊销时间=实际时间+(电位后电位前)=k+1-(k-1)=2(常数) 现在看看维基百科链接中的“摊销时间和实际时间之间的关系”一节
TotalAmortizedTime = TotalActualTime + SumOfChangesToPotential
由于变化电位的总和是伸缩的,所以它等于最终电位的初始电位。因此:
TotalAmortizedTime = TotalActualTime + FinalPotential-InitialPotential
其中:
TotalActualTime = TotalAmortizedTime - FinalPotential + InitialPotential <= TotalAmortizedTime + InitialPotential
TotalActualTime=Total摊销时间-最终电位+初始电位这是不正确的;摊余成本为O(k)。抱歉(非常)晚的评论和否决票;我在另一个问题的链接中看到了这个答案。(正如您自己所注意到的,单个增量的摊余成本是恒定的。)他问“数组以n开头”时会发生什么。假设对于一些大的d和k=1,n=2^d-1,即,只有一个增量操作。操作将需要时间ω(d),它不是O(k)。是的,根据“摊销”的定义,“摊销”复杂性不能预测进行单个计算的成本。你提供了一个“最坏情况”复杂性的例子。我所说的对任何k都是正确的