【问题标题】:Finding max in min heap在最小堆中找到最大值
【发布时间】:2012-11-04 19:42:16
【问题描述】:

我正在为考试而学习,从我正在查看的一个工作表中,它要求为存储整数的最小堆编写一个方法 maximum()。

public class Heap {
   private int[] arr = new int[100];
   private int numElts = 0;

   public int largest(){

  }

}

最大大小为 100 个元素,newElt 跟踪当前存储在堆中的元素数量。

我正在考虑做类似的事情:

int[] newArr = Collections.sort(arr);
return newArr[newElt];

但是那会改变原来的堆。 我可以对其进行深层复制,但它说它没有必要检查所有堆的元素。

那么任何人都可以提出一种方法来做到这一点,而无需查看每个元素吗? 谢谢,

【问题讨论】:

  • 我可以在添加时跟踪最大值,但是如果它要求我在考试中写最大(),我不能只写添加或插入:P

标签: java algorithm


【解决方案1】:

如果你的结构是堆顺序的,如果它是一个 -max heap- 那么你的最大元素就是arr[0]。但是因为是最小堆,所以你只知道最大元素是叶节点。

所以你不需要测试每个元素。但是您最多需要查看一半的元素(对于二叉树,叶子的数量在 1 到一半大小加 1 之间,包括两个帐户)。

您可以通过知道二叉堆(您所描述的)是一种特殊的平衡二叉树来快速查看叶节点,通过少量计算可以告诉您两组叶节点的位置可能是。

【讨论】:

  • 完整拼写:您只需要查看叶节点,因为根据定义,每个非叶节点都小于其(1 或 2)个子节点,因此不可能是最大的。
  • 哦,我想我明白了。所以我可以看看数组的后半部分((newElts-1)/2 to newElts),它们都是叶子节点,对吧?
  • @TKP 我相信这是正确的,但我承认我已经有一段时间没有使用这种东西了。 :)
猜你喜欢
  • 2014-05-07
  • 2014-12-24
  • 2020-05-08
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2011-11-24
  • 2012-12-28
相关资源
最近更新 更多