В цикле for следующего фрагмента кода процедура min-max heap delete-min, почему last=(*n)/2
?Это потому, что в худшем случае, что х должен быть вставлен внуку внука ..., и, например: высота дерева 5: min max min max min, floor (5/2) = 2, правильно св худшем случае всего лишь две минуты после первого уровня.Теперь еще один: высота 4: мин макс мин макс, этаж (4/2) = 2, на этот раз это не работает.Я думаю, что last=(*n)
будет работать, и даже for(i=1;;)
будет работать, поскольку он просто проверяет что-то, что не произойдет?Причина этого названия в том, что во IIRC временная сложность удаления кучи min-max составляет
O(log n)
, но (*n)/2
заставляет его выглядеть, хм, как O(n)
.
element delete_min(element heap[], int *n) {
int i, last, k, parent;
element temp, x;
if (!(*n)) {
// checking
}
heap[0] = heap[1];
x = heap[(*n)--];
for (i=1, last=(*n)/2; i<=last; ) {
k = min_child_grandchild(i, *n);
if (x.key <= heap[k].key)
break;
heap[i] = heap[k];
if (k <= 2*i+1) {
i = k;
break;
}
parent = k/2;
if (x.key > heap[parent].key)
SWAP(heap[parent], x, temp);
i = k;
} // end for
heap[i] = x;
return heap[0];
}
источник:
![enter image description here](https://i.stack.imgur.com/0r27g.png)