有没有办法最初构建一个二项式堆,其中n个给定元素的最坏情况复杂度低于O(n log n),即使用n次连续插入? (我知道插入的摊销成本是O(1),因此构建的平均时间复杂度更小。)对于二进制堆,有一个更有效的构建实现,它将所有n个元素放在二叉树中并执行heapify / siftDown在元素的前半部分以相反的顺序排列。只是想知道:对于二项式堆有什么类似的巧妙存在吗?
答案 0 :(得分:2)
实际上,将所有n个值插入堆中只需要时间O(n)。虽然二项式堆插入的最坏情况运行时为O(log n),但平均值低于该值。
以下是使用摊销分析查看此内容的一种方法。在二项式堆中的每棵树上放置一个功劳。无论何时进行插入,如果涉及将不同的树合并在一起,实际运行时间为Θ(1 + k)。我们还将在执行此操作的过程中花费k个积分,每个树合并一个,因此摊销成本为O(1)。因此,任何一系列n次插入空二项式堆,假设没有插入删除,将花费时间O(n)。即使您不像二进制堆那样事先知道元素的数量n,这也可以工作。
或者,您可以使用延迟二项式堆,其中插入采用最坏情况时间O(1)并且删除是分摊O(log n)。在这种情况下,一系列n次插入也将花费O(n)时间。
希望这有帮助!