最大堆中第三小元素的索引
index of 3rd smallest element in max heap
如何在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
的某个元素。它的直接子节点是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
后代。
- 确切的
粗略地说,这意味着在堆的底层数组的第一个1/2k
部分中找不到最后一个2k
元素。
- 在对向量中查找元素的索引
- 当该数组的索引中没有元素时,指针指向什么?
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 如何在C++中递归地找到max元素的索引?
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 使用推力根据索引更改某些元素的值
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- CPtrList - 如何获取元素的索引?
- 获取结构 c++ 中元素的索引
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 矢量指针索引处的读取元素
- C++函数返回两个 char 数组的相同索引元素
- 特征:类似 numpy 的元素索引
- 如何在另一个数组中找到一个未排序数组的不同元素索引?
- C 无法使用嵌套环将数组的元素索引
- Opencv Mat的元素索引产生垃圾
- 在c++中,当元组的元素索引在运行时已知时,是否有可能获得该元素的类型?
- 按内容访问QVector元素索引
- C++ 矢量元素索引