找到max-heap中k个最大元素的位置

时间:2018-04-03 19:57:28

标签: algorithm position max heap

在这里做一些算法作业:(

我需要找出一个等式来找到max-heap数组中所有可能的位置,其中给定的第k个元素可能是。

i.e. the largest element (k=1) is at position n=1.
The second largest element (k=2) can be at positions n=2\3.
Element k=3 can also be in positions n=2\3.
...
The 6th largest element (k=6) can be in positions n=4 up to n=7.
etc.

没有真正想出一个可靠的计算。

任何意见都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

第六大元素可以更多更远。最极端的情况是前六个元素是根和一系列右子元素。每个孩子都在节点2n+1,其中n是父节点。最右边序列的索引序列是1,3,7,15,31,63(a.k.a.2 ^ 6-1)。其他较小的值填充每个分支的左侧。

最早的位置是,如果相同的值碰巧是根的左子,而所有其他的则转到右分支:它出现在位置2.再次,根据需要显示较小的值。

因此,可能值的范围是2到2 ^ n-1。 您剩下的问题是确定哪个剩余位置可以包含第6个最大元素。

绘制一个适当深度的树 - 更好的是,只做4级深度,并使用第4大元素。比如,使用99,98,98,96,然后使用"其他"值可以是1到11.在这棵树的任何地方你都可以{em}

将树再展开一层。 现在您无法放置96的漏洞在哪里?

这会让你没有被卡住吗?

答案 1 :(得分:2)

n个项目的堆具有log 2 (n)的高度(称为h),向上舍入。假设一个完整的最小堆,第k个项目几乎可以在任何地方,受到以下限制。

  1. 第一项(k == 1)必须位于根目录。
  2. 最大项目(k == n)必须位于叶级别。
  3. 第k个节点的级别不能大于k。
  4. 第k个节点的级别不能小于(h-log 2 (n-k)+1)。
  5. 考虑一个包含7个级别的完整堆。堆本身有127个节点。第二级的每个节点都是63个节点的完整堆。因此,第二级的每个项目必须低于它62个较小的值。第96个最小的项目不可能在第二个级别,因为没有62个更大的值来填充它的树。

    这些规则可以帮助您进行顺序搜索,但它并不能为您带来很多好处。 7级堆中的第96个最小项目可以达到级别3,并且远低于级别7.节点不可能只有三个位置。

    如果您正在使用最大堆,请将上面的“最小”更改为“最大”。