Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二元计数器摊销分析_Algorithm_Analysis_Amortized Analysis - Fatal编程技术网

Algorithm 二元计数器摊销分析

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(通过翻转0和1),那么k个增量的摊销成本是O(k)

但是,如果数组以n开头会发生什么?我认为可能k增量的复杂性现在是O(log(n)+k),因为在开始时,1的最大数量是log(n)

有什么建议吗


提前谢谢

你说得对。证明这一点的方法不止一种,其中一种是用势函数。(和许多其他人)解释潜在的方法。然而,教科书通常要求势函数的初始值为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都是正确的