Algorithm 具有恒定时间递增键操作的最小优先级队列

Algorithm 具有恒定时间递增键操作的最小优先级队列,algorithm,heap,priority-queue,Algorithm,Heap,Priority Queue,我已经搜索了一段时间,寻找一个最小堆实现变体,它不是提供摊销O(1)来减少密钥,而是提供O(1)来增加密钥。(代价为o(log(n)),因为正如所观察到的,这两件事不可能同时进行) 实际上,我有一个固定大小的元素集,我想在键上执行增量,或者用一个更大的元素替换最小的元素。因此,另一种满足这一点的方法也很好 有谁知道一个具有恒定摊销时间递增键操作的堆变化吗 谢谢 我认为您优化得太快了。我建议您使用配对堆启动并运行应用程序,然后对其进行评测。关于数据和堆结构将如何执行,您还不知道的事情太多了 二项式

我已经搜索了一段时间,寻找一个最小堆实现变体,它不是提供摊销O(1)来减少密钥,而是提供O(1)来增加密钥。(代价为o(log(n)),因为正如所观察到的,这两件事不可能同时进行)

实际上,我有一个固定大小的元素集,我想在键上执行增量,或者用一个更大的元素替换最小的元素。因此,另一种满足这一点的方法也很好

有谁知道一个具有恒定摊销时间递增键操作的堆变化吗


谢谢

我认为您优化得太快了。我建议您使用配对堆启动并运行应用程序,然后对其进行评测。关于数据和堆结构将如何执行,您还不知道的事情太多了

二项式堆、斐波那契堆、配对堆和许多其他变体很难分析,因为它们的行为在很大程度上取决于操作的组合、操作的顺序和数据的性质。例如,在配对堆中,如果节点没有子节点,则递增键为O(1)。节点是否有子节点取决于节点在堆中的位置以及调用了多少次reduce key或remove first

我怀疑您是否会找到一个具有O(1)移除和对数插入的堆结构。偶数表示其他所有值都是O(1),表示删除。然而,请注意,尽管Brodal队列是渐近最优的,但用Brodal自己的话来说,它“相当复杂”,“在实践中不实用”


让你的程序运行。配置它。然后决定是否需要更高性能的优先级队列结构。

实际上,您指向的链接表明,您不能同时进行的三个操作是
O(1)
for
insert
find min
increase key
减少键
操作没有进入。因此,其他一项行动将不得不增加。我怀疑这是可能的

但也就是说,斐波那契堆确实提供了摊销随机
O(1)
密钥增加。也就是说,对于一半的元素,你不需要移动它。对于一个季度,你必须移动它一次。对于1/8,必须移动两次,以此类推。最坏情况
O(log(n))
仅当您增加底部元素时才支付。因此,增加一个随机元素的平均成本是
O(1)


你甚至可以把堆做得更好。当您增加一个元素的值时,您可以将它标记为已增加,并使其实际冒泡为惰性。除非它到达底部,否则你根本不需要移动它。因此,根据使用情况,大多数情况下,您不必为移动物品支付任何费用。

我不确定是否存在这种变体。我的建议是实施一个,并对其进行分析。配对堆很容易实现,虽然它的渐近行为不如斐波那契堆好,但实际上它的性能通常更好。如果您能向我们提供有关您的应用程序的更多信息,如大小和典型的操作组合,我们可能会为您提供更好的建议。好的,谢谢!我会考虑的。我现在正在启动这个项目,所以我仍然无法分析它,但我会在稍后的阶段尝试。关于我的应用程序,它是针对数据流上的算法,所以我需要对每个元素执行这个增加键操作。这就是为什么我一直在寻找一个恒定时间的操作。堆的大小将是一个用户指定的参数,我仍然无法确定它的上限。我一直认为,如果对最小元素执行递增键操作,则需要找到新的最小元素。在固定时间内不太可能做到这一点(这与为什么在大多数堆实现中remove min操作是对数的原因类似)。所以,也许我应该尝试找到一个具有常数时间删除和对数插入的实现。你认为有可能吗@吉姆·米塞洛凯,谢谢。我没有读到我指向的链接。我将考虑使用斐波那契堆将元素标记为增加的方法。