假设MAX-HEAPIFY操作。其中父元素值大于其子值。





令数组a具有5个元素a [4,2,3,5,6]。

筛选-

输入-a [4,2,3,5,6]

加工-

从数组的开头开始应用siftUp操作。

siftUp(4)-
没有交换,因为它是根

 heapified Array-a[4]

siftUp(2)-

没有交换,因为父值(4)更多
heapified Array-a[4,2]

siftUp(3)-

没有交换,因为父值(4)更多
heapified Array-a[4,2,3]

siftUp(5)-

它的父值为2,所以交换(5,2)。
          Array-a[4,5,3,2]

现在5的父值为4,因此再次交换(5,4)。
 heapified Array-a[5,4,3,2]

siftUp(6)-

首先在(6,4)之间交换,然后在(6,5)之间交换
 heapified Array-a[6,5,3,2,4]

输出-a [6,5,3,2,4]

siftDown-

输入-a [4,2,3,5,6]

加工-

从数组的末尾开始,我们将一个接一个地应用siftDown操作。

siftDown(6)-

它没有 child ,所以没有交换。 siftDown(5)和siftDown(3)也没有 child ,因此无法向下移动。

到目前为止的数组-a [4,2,3,5,6]

siftDown(2)-

它被替换为较大的子值。这里6是较大的一个。因此交换(2,6)。

现在数组将是-a [4,6,3,5,2]

siftDown(4)-

4有两个 child 6和3。与较大的 child 交换。交换(4,6)完成。
现在,数组将是-a [6,4,3,5,2]

同样,必须交换4,因为它有一个大于其自身的子级5。这样交换(4,5)就完成了。

数组将是-a [6,5,3,4,2]

堆数组-a [6,5,3,4,2]

输出-a [6,5,3,4,2]

在同一组元素上执行siftUp和siftDown操作时,为什么会得到两个不同的输出?或者,当将siftUp和siftDown应用于同一组元素时,可能具有不同的堆。请说清楚。 :)

最佳答案

是的,同一组元素可能具有不同的堆。

两种方法都能正确地产生满足heap属性的堆:父元素值大于其子值。

第一种方法:

    6
   / \
  5   3
 / \
2   4

第二种方法:
    6
   / \
  5   3
 / \
4   2

实际上,如果您用手绘制它,则还有其他可能的堆积,例如
    6
   / \
  4   5
 / \
2   3

但是请注意,尽管这两种方法都能产生正确的结果,但它们具有不同的复杂性。参见How can building a heap be O(n) time complexity?

关于arrays - 堆中的siftUp和siftDown操作用于堆放数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34329942/

10-12 05:08