binary-heap - 堆数据结构

标签 binary-heap

试图想出一个下界,比如最大堆中第 n 大键的位置。假设堆排列在数组中。我认为上限的 min(2^n-2, array size -1) 是否总是下限为 0?

最佳答案

对问题的初步调查揭示了 n 与上下界之间的以下关系(假设堆中有 14 个元素)

n   lb  up
1   1   1
2   2   3
3   2   7
4   2   14
9   3   14
10  4   14
12  5   14
13  6   14
14  8   14

要确定可能大于堆数组特定位置的元素的数量,请计算以该位置为根的子树的大小。这两个数字然后通过公式相关
# of elements possible larger  = total number of elements - size of subtree - 1 

编辑:
请注意,计算是反向执行的。给定数组/堆中的位置,可以确定如果堆已排序,则该值将位于哪个位置。给定节点,堆可以分为三个分区:
  • 保证大于当前元素的元素(父元素,父元素,...)
  • 保证小于当前元素的元素(以当前元素为根的子树)
  • 剩余元素可以大于或小于当前元素。

  • 如果我们查看一个包含 14 个元素的示例堆,并且想要确定第 6 个位置中可能值的范围,则这些组如下:
  • 第 1 组包含两个元素 (3, 1)
  • 第 2 组包含两个元素 (12, 13)
  • 第 3 组包含其余九个元素(不包括当前值)(2, 4, 5, 7, 8, 9, 10, 11, 14)

  • 因此,下限是 3(第一组元素的数量 + 1),而上限是 11(第一组元素的数量 + 第三组元素的数量 + 1)。

    关于binary-heap - 堆数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2492884/

    相关文章:

    haskell - 纯函数式语言中的高效堆

    algorithm - 为什么 'complete binary tree' 或 'binary heap' 的最后一层可能是部分空的?有充分的理由吗?

    data-structures - 当我们有二叉搜索树时,为什么还需要二叉堆?

    algorithm - 如何判断堆的第k大元素是否大于x

    c - 如何在作为二叉堆实现的优先级队列中保留相同优先级元素的顺序?

    algorithm - 证明堆中位数的水平

    algorithm - 向已包含 n 个元素的二叉堆插入 n 个元素的渐近时间复杂度

    java - 在线性时间内从两个大小为 N 的二叉堆构造一个大小为 2N 的二叉堆?

    algorithm - 查找二叉堆的最后一个元素

    binary-tree - B堆中的模式是什么?