最大堆中第三小元素的索引

index of 3rd smallest element in max heap

本文关键字:元素 索引      更新时间:2023-10-16

如何在1到n个不同元素的最大堆中找到第三个最小元素的可能索引?我知道最小的元素会在叶节点的任意位置。第二个最小值在n/2到n之间,当n大于3时但是我不知道怎么计算第三小。有什么建议吗?

第三小的元素最多有两个后代,这意味着它的子元素(ren)是叶子,或者它是叶子。(为了证明这一点,您还必须证明只有一个子元素的元素不可能有一个非叶元素作为子元素。(简单但乏味)

叶子,正如您几乎注意到的,在[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,否则它们甚至不是连续的)。因此,如果ik级别至少有一个后代,那么它也有所有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后代。

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