我想查找使用n节点将min-heap转换为max-heap时的最大比较数。我认为使用O(n)将min-heap转换为max-heap。这意味着没有办法重新创建堆。
答案 0 :(得分:1)
作为一个粗略的下界,给定一个具有(最小或最大)堆属性的树,我们事先没有想过叶子上的值如何相互比较。在最大堆中,叶子上的值都可能小于内部节点处的所有值。如果堆具有完整二叉树的拓扑,那么即使找到min也需要至少大约n / 2次比较,其中n是树节点的数量。
答案 1 :(得分:0)
如果你有一个已知大小的最小堆,那么你可以通过从后到前填充数组来创建其元素的二进制最大堆,其中通过从最小堆迭代删除根节点获得的值直到它很累。在某些情况下甚至可以这样做。使用根节点为元素0且节点i的子节点为元素2i和2i + 1的规则,将为新数组表示的堆自动满足(max-)堆条件。
然而,从大小为m的最小堆中的每次删除都需要最多log(m)个元素比较来恢复堆条件。我认为这相当于整个工作的O(n log n)比较。我怀疑你可以在不增加条件的情况下以更低的复杂度做任何事情。特别是,如果您不执行真正的堆删除(导致恢复堆条件的成本),那么我认为您需要支付相当的额外成本,以确保最终最终得到堆。