微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为抽象队列数据结构创建潜在功能,以显示恒定的摊销时间复杂度

如何解决为抽象队列数据结构创建潜在功能,以显示恒定的摊销时间复杂度

考虑称为MaxQueue,Q的Queue的变体,该变体具有以下操作:

出队(Q):删除并返回Q的第一个元素

排队(Q,s):将整数s附加到Q的末尾

最大(Q):返回Q中最大的整数(但不删除它)

MaxQueue数据结构还包含一个称为“后缀maxima”的序列。如果x之后出现的所有元素的值都较小,则元素x是序列中的“后缀最大值”。

MaxQueue是使用单链接列表来实现的,该列表用带有指向队列前面和后面的附加指针的序列表示序列,并具有后缀最大值的双链接列表(后缀最大值的排列顺序与它们的顺序相同)。顺序)。

有关示例,请参见此链接https://ibb.co/f2KBtHN


问题:证明这三个操作的摊销时间复杂度均为O(1)。 (根据序列中的最大后缀数定义潜在函数


我真的不知道如何开始这个问题。我知道一个潜在的函数倾向​​于是a + bm的形式,其中a和b是常数,而n和m是根据问题设置的变量。提示建议以最大后缀的数量为基础,我认为应该在这些变量中反映出来,但是我不确定如何。

解决方法

潜在函数是根据数据结构的状态计算出的函数,该函数以无界开始,永远不会为负。

对于任何这样的函数,对于每个操作,对于任何常数K,摊销成本= O(实际成本+ K * change_in_potential)

之所以可行,是因为由于势函数不能为负,因此其初始值的界限限制了势的所有变化之和可以为负。最终,在许多操作中,实际成本将占主导地位。

因此,如果要证明所有操作的O(1)边界,则潜在功能必须:

    在恒定成本的操作过程中最多增加恒定的数量;和
  1. 在任何成本为c> O(1)的操作中减少Ω(c)。

因此,请查看您的操作,并找到状态的某些功能,这些功能不能为负,在恒定时间内超出您的每个工作单位都会减少,否则在每个操作中只会增加恒定量。

>

我想您会发现,您做的“额外工作”的每个单元都会减少后缀最大值序列的长度,并且每个操作只能增加一个项。因此,后缀最大值序列的长度是可行的势函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。