我研究过min-sheaps和max-sheaps,我有几个问题:
答案 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。它没有具体的索引。我们只知道它只是一片叶子
答案 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)
- 排序数组是最小堆?
如果它按升序排序 - 是的,一般来说它是一个最小堆,更确切地说 - 一个二进制堆的数组实现,具有以下规则:
同时,它不能反向工作 - 基于数组的二进制堆不会存储已排序的列表。
- 哪里是最大堆的最小值?
它没有定义,当你将密钥存储在最小堆中时,你不想快速回答这个问题。如果您希望能够在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)中搜索