Я хочу увеличить значение всех элементов листа. Все с индексом больше *floor[n/2].
1) Вызовите HEAP-INCREASE-KEY(A,i,key) для каждого листового элемента
2) Увеличьте ключ каждого листового элемента до нового значения, затем вызовите BUILD-MAX-HEAP(A)
Какой способ будет эффективнее и почему?
Немного дополнительной информации. Каждый вызов Max-Heapify стоит O(lgn) времени, а Build-max-heap делает O(n) таких вызовов. Таким образом, время выполнения равно O(nlgn). Время работы Heap-Increase-Key равно O(lgn).
HEAP-INCREASE-KEY(A,i,key)
if key<A[i]
error "new key is smaller than current key.
A[i]
while i>1 and A[Parent(i)]<A[i]
exchange A[i] with A[Parent(i)]
i=Parent()
СТРОЙКА-МАКСИМАЛЬНАЯ КУЧА(A)
A.heap-size = A.length
for i = *floor[A.length/2] downto 1
MAX-HEAPIFY(A,i)
если вам нужно знать, что такое max-heapify
MAX-HEAPIFY(A,i)
l=Left(i)
r=Right(i)
if l<=A.heap-size and A[l] > A[i]
largest = l
else largest = i
if r<=A.heap-size and A[r] > A[largest]
largest = r
if largest not equal i
exchange A[i] with A[largest]
MAX-HEAPIFY (A.largest)