Я думаю, что это действительно зависит от реализации вашего алгоритма. Удаление первого элемента часто используется в алгоритме сортировки кучи. Вы берете первый элемент и помещаете последний элемент на свое место. Затем вы вызываете 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);
}
}
Вы можете увидеть, что она занимает самый большой из своих детей, поменять себя и самый большой, и держать пузырясь, где самый большой был. В этой реализации, если правая и левая равны, она будет перемещаться по левому поддереву.
Время работы heapify() на поддереве размера n
- это O (1), чтобы найти самый большой элемент + время выполнения рекурсивного heapify в поддереве - каждое поддерево имеет размер не более 2n/3, худший случай возникает, когда нижний уровень дерева точно наполовину заполнен.
Поэтому время работы heapify может быть описано как:
T(n) = T(2n/3) + O(1)
Мастер теорема получает, что:
T(n) = O(lg n)
я не мог бы быть на кучах, но как оба ребенка равны? – corsiKa
Просто зависит от реализации вашего алгоритма. Вы всегда можете гарантировать O (logn) в худшем случае. –
разрешено. Единственное требование заключается в том, что они должны быть меньше корня. – user3149650