[英]How can std::make_heap be implemented while making at most 3N comparisons?
[英]How is make_heap in C++ implemented to have complexity of 3N?
我想知道C ++中make_heap的算法是什么,复杂度是3 * N? 只有通过插入元素才能构建堆的方法才有O(N Log N)的复杂性。 非常感谢!
您将堆表示为数组。 第i
个元素下面的两个元素位于2*i+1
和2*i+2
。 如果数组有n
元素,那么从最后开始,取出每个元素,让它“落”到堆中的正确位置。 这是O(n)
运行。
为什么? 那么n/2
的元素没有孩子。 对于n/4
有一个高度为1的子树。对于n/8
有一个高度为2的子树。对于n/16
,高度为3的子树。依此类推。 所以我们得到系列n/2 2 + 2*n/2 3 + 3*n/2 4 + ... = (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次比较。(比较每个孩子的根,看它是否需要摔倒,如果根比两个孩子都大,那么孩子们互相比较。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.