【问题标题】:Common nodes between max and min heaps with same key value?具有相同键值的最大和最小堆之间的公共节点?
【发布时间】:2017-03-22 17:10:29
【问题描述】:

我的意思是说,对于两个堆的键值都为 1 到 n 的最大堆和最小堆而言,键值保持相同的位置数的最大可能性是多少?

用最简单的方式, 一个二元最大堆和一个二元最小堆,每个堆的键值为 1、2、3、4、5、6,使得数字 两个堆中的键值相同的位置尽可能多。有多少个职位 在这种情况下,它们是否相同?

【问题讨论】:

  • 很难理解。你能用更简单的方式问吗?

标签: algorithm sorting data-structures heapsort


【解决方案1】:

渐近地,至少有 n/3 个值具有相同的位置。 设 n=2k-1,所以我们在最后一级有 2k-1 个元素,在前一级有 2k-2 个元素-最后一级。

让我们按数组顺序将元素放入最小堆中:1 在顶部,2 和 3 在第二层,4-7 在第三层,依此类推。 现在,查看元素 n/3 到 2n/3(边界处为 +-1,但这与渐近行为无关)。它们占据了前最后一层的结束(2/3)和最后一层的开始(1/3)。 该集合中的所有元素都不是该集合中另一个元素的后代, 所以它适合最小堆和最大堆。 更重要的是,这组顶部有 1/3 值的空间,底部有 1/3 值的空间。

所以,要在相同位置上用这个集合创建一个最大堆,我们可以交换顶部和底部三分之一,然后根据最大堆规则在那里排列元素。 例如,它们可以按数组降序排列。

n=15(十六进制数)的示例:

    min-heap                 max-heap
        1                        F       
    2       3                E       D   
  4   5   6   7            C   B   6   7 
 8 9 A B C D E F          8 9 A 5 4 3 2 1

如您所见,元素 6、7、8、9 和 A 在两个堆中的位置相同。 1-5部分被移到底部,它们在底部的顺序可以是任意的。 B-F 部分被移到顶部并重新排列为 F-B 以形成最大堆。

【讨论】:

  • 实际上,当 n = 3 * (2^k - 1) 时,可以构造另一个简单的例子。那么中间的三分之一正好占据一层。
  • 考虑最小堆[1,3,2,4]和最大堆[4,3,2,1]。在这种情况下,n/2 个项目具有相同的位置。我想知道是否有可能为更大的堆构建这样的安排。
  • @JimMischel 我怀疑常数可以渐近地达到 1/2,但没有证明这一点,实际上不知道我们是否可以做得比 1/3 更好。我们需要我们的集合中没有任何一个元素是任何其他元素的后代,所以最好的情况看起来或多或少像树的一个级别,可能是倾斜的。此外,应该有足够的空间,无论是在我们集合的顶部和底部,还是我们集合的独立(“侧面”),以放置所有不属于该集合的元素。常数 1/2 意味着我们使用树的最后一层,它的底部没有空间来放置其他元素。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多