在这里做一些算法作业:(
我需要找出一个等式来找到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.
没有真正想出一个可靠的计算。
任何意见都会受到赞赏。
答案 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个项目几乎可以在任何地方,受到以下限制。
考虑一个包含7个级别的完整堆。堆本身有127个节点。第二级的每个节点都是63个节点的完整堆。因此,第二级的每个项目必须低于它62个较小的值。第96个最小的项目不可能在第二个级别,因为没有62个更大的值来填充它的树。
这些规则可以帮助您进行顺序搜索,但它并不能为您带来很多好处。 7级堆中的第96个最小项目可以达到级别3,并且远低于级别7.节点不可能只有三个位置。
如果您正在使用最大堆,请将上面的“最小”更改为“最大”。