如何实现C ++中的make_heap具有3N的复杂性?

时间:2011-02-20 14:23:19

标签: c++ algorithm heap

我想知道C ++中make_heap的算法是什么,复杂度是3 * N?只有通过插入元素才能构建堆的方法才有O(N Log N)的复杂性。非常感谢!

1 个答案:

答案 0 :(得分:15)

您将堆表示为数组。 i'元素下方的两个元素位于2*i+12*i+2位置。如果数组有n个元素,那么从最后开始,取出每个元素,让它“落”到堆中的正确位置。这是O(n)运行。

为什么呢?那么对于n/2元素来说,没有孩子。对于n/4,有一个高度为1的子树。对于n/8,有一个高度为2的子树。对于n/16一个高度为3的子树。依此类推。所以我们得到了系列n/22 + 2*n/23 + 3*n/24 + ... = (n/2)(1 * (1/2 + 1/4 + 1/8 + . ...) + (1/2) * (1/2 + 1/4 + 1/8 + . ...) + (1/4) * (1/2 + 1/4 + 1/8 + . ...) + ...) = (n/2) * (1 * 1 + (1/2) * 1 + (1/4) * 1 + ...) = (n/2) * 2 = n。所以总数“看看我是否需要再摔倒一次,如果是这样,我会摔倒哪种方式?比较来到n。但是你可以从离散化中得到完全的结果,所以你总是得到比n套交换要弄清楚。每个交换需要最多3次比较。(比较根与每个孩子,看它是否需要下降,然后如果根比两个孩子都大,那么孩子们互相比较。 )