排序数组是否为最小堆?最大堆的最小值是多少?

时间:2010-06-24 19:15:49

标签: heap

我研究过min-sheaps和max-sheaps,我有几个问题:

  1. 排序数组是否为最小堆?
  2. 最大堆的最小值是多少?

7 个答案:

答案 0 :(得分:22)

使用基于数组的堆实现时,从最低到最高排序的数组是最小堆。父节点大于其子节点的堆属性(2i + 1和2i + 2,使用从零开始的数组)适用于所有具有子节点的节点。

最大堆的最小值位于其中一个叶节点中,但您不知道哪个。由于根据定义,最小节点不能具有任何子节点,因此它必须是叶子。但是,堆属性不指定叶节点如何相互比较,只与它们的父节点进行比较。

答案 1 :(得分:5)

  

排序数组是否为最小堆?

是的,如果您正在使用典型的数组存储堆约定。

  

最大堆的最小值在哪里?

在其中一片树叶上。这究竟是未定义的。

答案 2 :(得分:1)

您可以将二进制堆实现为索引i的数组,与2 * i + 1和2 * i + 2(i从0开始)进行比较。在min heap a [i]< a [2 * i + 1]和a [i]<一个[2 * I + 2]

所以

1。排序数组是最小堆。

2。它没有具体的索引。我们只知道它只是一片叶子

我建议你阅读http://en.wikipedia.org/wiki/Binary_heap

答案 3 :(得分:0)

哪里是最大堆的最小值?

Ans:最大堆可以使用索引从1到n的简单数组表示。第一个元素是最大堆的根。 堆属性:索引i处的节点将子节点保留为2i,右子节点位于2i + 1(如果2i和2i + 1小于堆大小,即数组长度)。

从索引i + 1到n找到最大堆的叶节点。这里i = n / 2; n是数组长度。其中一个叶节点具有最小值 所以我们可以从a [i + 1]到a [n]的值找到最大堆的最小值。找到最小值的时间复杂度是(n-i)的阶数。

答案 4 :(得分:0)

  
      
  • 排序数组是最小堆?
  •   

如果它按升序排序 - 是的,一般来说它是一个最小堆,更确切地说 - 一个二进制堆的数组实现,具有以下规则:

  • 索引 i 的节点的子节点可以在索引 2i + 1 2i + 2
  • 中找到
  • 索引 i 的节点的父节点可以在索引 floor((i-1)/ 2)
  • 找到

同时,它不能反向工作 - 基于数组的二进制堆不会存储已排序的列表。

  
      
  • 哪里是最大堆的最小值?
  •   

它没有定义,当你将密钥存储在最小堆中时,你不想快速回答这个问题。如果您希望能够在O(1)时间内查看堆的最小值和最大值,则可以在Java中使用类似MinMaxPriorityQueue的类。

答案 5 :(得分:0)

  

排序数组是否为最小堆?

排序数组是min-heap或max-heap,但反之亦然 min-heap或max-heap不一定是排序数组。

  

最大堆的最小值是什么?

max-heap(或优先级队列)按定义在O(1)时间内提供集合的最大值。如果有人需要从最大堆中检索最小值,那么首先使用堆本身来解决这个问题是不对的。这就像期望堆栈提供FIFO访问或期望队列提供LIFO访问。

但是jfyi,min值将在堆形成的树的一个叶子上。它可以在任何子树上。所以你需要另一种算法来定位它需要超过O(1)的时间。

作为旁注:
具有n个元素的堆可以具有[1到(n + 1)/ 2]个叶子 如果由堆形成的树的高度为h,则堆将具有最多2 ^(h-1)个叶子

答案 6 :(得分:0)

数组可以按升序或降序排序。 声明“有序数组是最小堆”是部分正确的。此语句的正确版本是“按升序排序的数组可被视为最小堆”,其补充语句为“按降序排序的数组可视为最大堆”。

“按升序排序的数组可以视为最小堆”

但要记住“并非所有的min-sheaps都可以采用按升序排序的数组形式”。

关于max heap的最小值,我们只知道它存在于leafs中,我们可以在O(n)中搜索