最大堆中第3个最小元素的索引

时间:2013-03-10 00:20:03

标签: c++ algorithm sorting heapsort

如何在1到n个不同元素的最大堆中找到第3个最小元素的可能索引? 我知道最小的元素会在叶子的任何地方。 第二个最小值为n / 2到n,n大于3 但我不知道计算第三小。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

第三小元素最多有两个后代,这意味着它的子(叶)是叶子,或者它是叶子。 (为了证明这一点,你还必须证明一个只有一个孩子的元素不可能像孩子一样非叶子。容易但乏味。)

正如您所注意到的,叶子的指数范围为[floor(n/2)+1, n]。如果n/2是一个整数,那么该元素只有一个子元素(它是一个叶子),所以添加它会给出可能包含第二大元素的索引范围。

第一个孩子在叶子范围[floor(n/2)+1,n]中的元素最多有两个孩子,而且没有非叶孩子。该范围与[ceil(n / 2),n]范围相邻,两个范围的并集为第三大元素提供了所有可能的位置。

i元素的第一个子元素具有索引2i,因此第一个子元素至少为floor(n/2)+1的第一个元素是floor(n/4)+1

因此,您可以找到第三大元素的可能指数是范围:[floor(n/4)+1,n]


这是另一种方法。在索引i处取一些元素。它的直系孩子是2i2i+1;它的孙子是4i, 4i+1, 4i+2, 4i+3,一般来说,k等级的后代是2ki, 2ki+1, ..., 2ki + 2ki-1;总之,[2ki, ..., 2k(i+1)-1 ]。当然,这些范围是非重叠的(实际上,除非i1,否则它们甚至不连续)。因此,如果i至少有一个级别为k的后代,则它还有一组完整的k' < k后代,其中有2k-2

从这一切,我们可以得出结论:

  • 如果n ≥ 2ki and n < 2k(i+1),则i有:

    • 2ki-2后代的某些级别低于k
    • n - 2ki+1级别k的后代;

    • 总计:n-1后代。

  • 如果n ≥ 2k(i+1) and n < 2k+1i,则i有:

    • 确切2k+1-1后代。

粗略地说,这意味着在堆的底层数组的第一个2k部分中找不到最后的1/2k个元素。