我学习了最小堆和最大堆,并有几个问题:
- 一个排序数组是否是最小堆?
- 最大堆的最小值是多少?
使用基于数组的堆实现时,从最低到最高排序的数组是一个最小堆。对于所有具有子节点的节点,父节点的值小于或等于其子节点(使用基于零的数组,子节点为2i + 1和2i + 2)。
最大堆的最小值在叶节点中的一个位置,但你不知道它在哪里。由于定义上最小节点不能有任何子节点,因此它必须是一个叶节点。然而,堆属性并没有指定叶节点如何相互比较,只是与它们的父节点比较。
已排序的数组是否是最小堆?
如果您使用典型的基于数组的堆约定,则是的。
最大堆的最小值在哪里?
在其中一个叶子节点。具体是哪个未定义。
永恒的真理是:
每个按升序排序的列表都是一个最小堆。
尝试并测试它,这个规则没有例外!
数组可以按升序或降序排序。
说“一个排序好的数组是最小堆”这句话只是部分正确的。正确的版本应该是“一个按升序排序的数组可以被视为最小堆”,它的补充语句是“一个按降序排序的数组可以被视为最大堆”。
但请记住,“并不是所有的最小堆都可以采用按升序排序的形式”。
至于最大堆的最小值,我们只知道它存在于叶子节点中,我们可以在O(n)的时间内搜索到它。
最大堆的最小值在哪里?
答:最大堆可以使用从1到n开始的简单数组表示。第一个元素是最大堆的根节点。 堆属性:索引为i的节点具有左子节点2i和右子节点2i+1(如果2i和2i+1小于堆大小,即数组长度)。
最大堆的叶节点从索引i+1到n找到。这里i=n/2;n是数组长度。其中一个叶节点具有最小值。
因此,我们可以从a[i+1]到a[n]的值中找到最大堆的最小值。查找最小值的时间复杂度为O(n-i)。