我想知道C ++中make_heap的算法是什么,复杂度是3 * N?只有通过插入元素才能构建堆的方法才有O(N Log N)的复杂性。非常感谢!
答案 0 :(得分:15)
您将堆表示为数组。 i
'元素下方的两个元素位于2*i+1
和2*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次比较。(比较根与每个孩子,看它是否需要下降,然后如果根比两个孩子都大,那么孩子们互相比较。 )