【问题标题】:Use potential method to find amortized running time?使用势能法求摊销运行时间?
【发布时间】:2020-02-28 17:33:23
【问题描述】:

所以这是我面临的一个挑战(从介绍到算法第 3 版):

假设我们在一个数据结构上执行一系列 n 操作 如果 i 是 2 和 1 的精确幂,则第 i 个操作的成本为 i 除此以外。使用潜力法确定摊余成本 每次操作。

在遇到这个之前,我以为我理解了潜在的方法;我已经尝试并试图解决它,但不能。我的困难是当我必须定义潜在的 $\phi(D_i)$(第 i 次操作后数据结构 $D$ 的潜力)。

我的基本想法是定义势函数,使得当 i 是 2 的因子时 $\phi(D_i) = i$。这样我就可以“支付”此操作的成本,甚至不必再分析 i 是 2 倍的情况。

但是,这可能是正确的想法,也可能不是正确的想法 - 请不要让它妨碍您的创造力/告诉我它是否错误以及正确的做法是什么:) 你们中的任何一个聪明的巫师都可以带我去吗通过步骤来解决这个任务?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    您的实际成本如下所示:

    1 2 1 4 1 1 1 8 1 1 1 1 1 1 1 16 ...
    

    您现在要做的是为未来的运营支付费用,以消除高峰。如果我们将每个尖峰分布在前一个尖峰之间的元素上,我们会得到:

    1 2 5/2 5/2 11/4 11/4 11/4 11/4 23/8 23/8 23/8 ....
    

    这仍然很复杂。但是我们想要一个上限,所以可以多付来得到一些简单的东西。所以对于间隔(2^n - 2^(n+1)](不包括第一个,包括最后一个)有2^n 数字。对于大多数元素,我们有1,然后我们必须分摊支付2^(n+1) 峰值。因此,如果我们为每个元素支付1 并为未来的峰值支付2,我们将覆盖它。这会导致以下付款:

    3 3 3 3 3 3 3 3 3 3....
    

    您的分析现在更容易了吗?

    故事的寓意。消除尖峰,更喜欢简单而不是准确性。这将使您的分析更容易。

    【讨论】:

    • 天哪,非常感谢。我在数学论坛上问过这个问题两次都没有答案。
    • 哦,只是为了确定一下:您将如何从您经历的初步逻辑中准确定义潜在功能?就像你应该把势函数写成一些变量的纯函数
    • @Dip CS 论坛可能会更好。在弄清楚什么会起作用后,我会将潜在功能定义为3。但原理就是我描述的。
    • 但是数据结构的潜力永远不会增加,而是始终保持不变。潜力不是随着操作数量的增加而增加,以至于在某些时候潜力足够“信用”来支付某些类型的操作吗?
    • @Dip 抱歉,请仔细检查定义,总潜力应为3n。所以每次付款都是3。是的,您现在正在考虑您将来可能需要做的工作,所以当您实际做这项工作时,它已经涵盖了。
    猜你喜欢
    • 2010-09-17
    • 2014-07-25
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2011-11-20
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多