如何找到最大堆中1到n个不同元素中第3个最小元素的可能索引? 我知道最小的元素会在树叶中的任何地方。 第二小的将是从n/2到n的任何地方,大于3的时候n 但我不知道要计算第三小的值。有什么建议么?最大堆中第3小元素的索引
3
A
回答
1
第三小元素至多有两个后代,这意味着它的子(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
水平低于k
n - 2ki+1
后裔;总计:
n-1
后代。
如果
n ≥ 2k(i+1) and n < 2k+1i
,然后i
有:- 正是
2k+1-1
后裔。
- 正是
粗略地说,这意味着最后2k
元件没有在堆中的底层阵列的所述第一部分1/2k
发现。
相关问题
- 1. 在Haskell中查找大元素的最小元素索引
- 2. 4D阵列中最小/最大元素的索引
- 3. 从最小到最大的元素索引
- 4. IndexOutOfBoundsException:索引:3,大小:3
- 5. 从最小或最大堆中删除根元素的算法
- 6. IndexOutOfBoundsException:索引:3,大小:0
- 7. 具有相同元素的最大和最小堆
- 8. 时间复杂度,以获得最大的堆最小元素
- 9. 矩阵的最大值,最大元素的索引
- 10. 增加数组大小并在最后索引插入元素
- 11. 查找与Excel中另一列的索引(最小/最大元素)对应的列中的元素
- 12. 选择最大元素后打印数组元素的索引
- 13. 在大小为N的数组的每k个元素中查找最小元素和第二小元素
- 14. 如何查看parquet元数据中的最小/最大索引?
- 15. 构建最小/最大二元堆
- 16. 我可以用O(lgn)时间找到第二大元素,并且最小堆?
- 17. 如何获得matlab中数组中最小元素的索引?
- 18. 算法找不到。大小为n的子集,其中每个元素都小于其前一个元素,索引是第一个元素是最少的
- 19. Nexus的最大堆大小?
- 20. 关于堆(最大堆和最小堆)
- 21. 如何实现最小堆排序来查找第k个最小元素?
- 22. 2D阵列的最小/最大元素
- 23. shell脚本中的数组的最大元素及其索引
- 24. 排列中第k个最大元素
- 25. 找到一个2维列表的第二列的最大元素的索引
- 26. 如何在awk中找到最小元素的索引?
- 27. 查找数组中的最小元素索引
- 28. 如何获得双数组中最小元素的索引?
- 29. 插入元素二进制最小堆
- 30. 在最大值中选择偶数索引处的元素
在一个真正[二进制最大堆(http://en.wikipedia.org/wiki/Binary_heap),最小的(N + 1)/ 2个节点将是叶,如果我记错我的数据结构。因此,您的第三小值将是其中一个节点或其中一个节点的直接父节点。我无法想象在O(1)时间内能够提取该值的封闭形式算法,即使假设堆已经完全构建。 – WhozCraig 2013-03-10 00:53:38