Algorithm 为什么堆的deleteMin取O(logn)?

Algorithm 为什么堆的deleteMin取O(logn)?,algorithm,data-structures,runtime,heap,binary-heap,Algorithm,Data Structures,Runtime,Heap,Binary Heap,在我的课堂幻灯片中,我有一个堆,它有一个名为deleteMin()的方法。 它所做的就是删除堆中的最小值。它说需要O(logn) 这是我无法理解的。 在堆结构中,最小值始终位于树的根,因为堆执行称为“上堆”和“下堆”的操作,如果子节点的值小于父节点的值,则该操作总是将子节点与其父节点交换。这意味着树的根将始终具有最小值。我认为我们可以在找到最小值并删除时取这个值,这只需要O(1) 但是为什么它会说O(logn)?因为如果去掉顶部节点,就必须将剩余的两个堆重组为一个堆。要保留堆的属性,必须使最右边

在我的课堂幻灯片中,我有一个堆,它有一个名为deleteMin()的方法。 它所做的就是删除堆中的最小值。它说需要O(logn)

这是我无法理解的。 在堆结构中,最小值始终位于树的根,因为堆执行称为“上堆”和“下堆”的操作,如果子节点的值小于父节点的值,则该操作总是将子节点与其父节点交换。这意味着树的根将始终具有最小值。我认为我们可以在找到最小值并删除时取这个值,这只需要O(1)


但是为什么它会说O(logn)?

因为如果去掉顶部节点,就必须将剩余的两个堆重组为一个堆。要保留堆的属性,必须使最右边的元素成为根元素,然后是downheap,这需要O(logn)。我认为你正在考虑一个更好的方法来实现这一点,但上述方法是目前最快的方法。我希望这篇文章对你有帮助

因为如果去掉顶部节点,则必须将剩余的两个堆重组为一个堆。要保留堆的属性,必须使最右边的元素成为根元素,然后是downheap,这需要O(logn)。我认为你正在考虑一个更好的方法来实现这一点,但上述方法是目前最快的方法。我希望这篇文章对你有帮助

。。。但是,当删除当前根时,如何找到新根?您不能在O(1)中执行此操作。您可以在
O(1)
中执行
find min
操作,但不能在
O(1)
中执行
delete min
。。。。但是,当删除当前根时,如何找到新根?您不能在O(1)中执行此操作。您可以在
O(1)
中执行
find min
操作,但不能在
O(1)
中执行
delete min