如何在1到n个不同元素的最大堆中找到第3个最小元素的可能索引? 我知道最小的元素会在叶子的任何地方。 第二个最小值为n / 2到n,n大于3 但我不知道计算第三小。有什么建议吗?
答案 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
处取一些元素。它的直系孩子是2i
和2i+1
;它的孙子是4i, 4i+1, 4i+2, 4i+3
,一般来说,k
等级的后代是2ki, 2ki+1, ..., 2ki + 2ki-1
;总之,[2ki, ..., 2k(i+1)-1 ]
。当然,这些范围是非重叠的(实际上,除非i
是1
,否则它们甚至不连续)。因此,如果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
个元素。