堆数组 - 删除根

时间:2014-02-13 15:52:47

标签: java arrays heap

我对堆很困惑。我有一个整数数组作为最小堆的实现。从根中删除min项时,如何计算冒泡的步骤。更重要的是,说你已经

          3
      5       5
   7    8    

如果你删除3,那么你将不得不用8替换它并向下泡。然而,由于两个根孩子都有相同的价值(5),那么它会向哪个方向冒泡(右边的左边)?重要的是,按顺序排列的步骤数会有所不同。

由于

1 个答案:

答案 0 :(得分:0)

我认为这实际上取决于你的算法实现。删除第一项通常用于堆排序算法。取出第一个元素并将最后一个元素放在其位置。然后你在根上调用heapify(),它决定了向下冒泡的方式。

void heapify(int index) {

        int l = getLeft(index);
        int r = getRight(index);
        int largest;

        if(l <= storage.length && storage[index] < storage[l]){
            largest = l;
        } else {
            largest = index;
        }

        if(r <= storage.length  && storage[largest] < storage[r]){
            largest = r;
        }

        if(largest != index){
            storage.swap(index, largest);
            heapify(largest);
        }

    }

你可以看到它需要最大的孩子,交换自己和最大的孩子,并继续冒泡最大的地方。在此实现中,如果右和左相等,它将沿左子树行进。

对于大小为n的子树,heapify()的运行时间为O(1),以查找子树上的最大元素+递归堆化的运行时间 - 每个子树的大小最多为2n / 3 ,最坏的情况发生在树的底层正好是半满时。

因此heapify的运行时间可以描述为:

T(n) = T(2n/3) + O(1)

通过大师定理,我们得到了:

T(n) = O(lg n)