我对堆很困惑。我有一个整数数组作为最小堆的实现。从根中删除min项时,如何计算冒泡的步骤。更重要的是,说你已经
了 3
5 5
7 8
如果你删除3,那么你将不得不用8替换它并向下泡。然而,由于两个根孩子都有相同的价值(5),那么它会向哪个方向冒泡(右边的左边)?重要的是,按顺序排列的步骤数会有所不同。
由于
答案 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)