繁体   English   中英

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

[英]How is make_heap in C++ implemented to have complexity of 3N?

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

您将堆表示为数组。 i个元素下面的两个元素位于2*i+12*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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM