Двоичная Куча: Доказательство Сложности Конструкции O(N)

На самом деле мы поговорим о двоичная куча и его построение с помощью Sift-Down (или Heapify).

Многие наверняка знают, что построение кучи таким способом осуществляется в

Двоичная куча: доказательство сложности конструкции O(n)

.

Здесь я приведу доказательство этого факта.

Вот пример процедуры построения кучи из массива в Паскале.

   

procedure siftdown(v:longint); var min,l,r:longint; begin l:=v*2; r:=v*2+1; min:=v; if (l <= s) and (a[l] < a[min]) then min:=l; if (r <= s) and (a[r] < a[min]) then min:=r; if min <> v then begin swap(a[min], a[v]); sift_down(min); end; end; procedure build; var i:longint; begin for i:=n downto 1 do siftdown(i); end;

Итак, дан массив, состоящий из

Двоичная куча: доказательство сложности конструкции O(n)

элементы и

Двоичная куча: доказательство сложности конструкции O(n)

количество звонков оператора

Двоичная куча: доказательство сложности конструкции O(n)

(в процедуре

Двоичная куча: доказательство сложности конструкции O(n)

) при построении кучи с использованием этого массива.

Очевидно,

Двоичная куча: доказательство сложности конструкции O(n)

определяет время выполнения процедуры

Двоичная куча: доказательство сложности конструкции O(n)

, что нам интересно.

Лемма.

Пусть для некоторого элемента массива при вызове

Двоичная куча: доказательство сложности конструкции O(n)

было сделано

Двоичная куча: доказательство сложности конструкции O(n)

звонки оператора

Двоичная куча: доказательство сложности конструкции O(n)

.

Тогда его показатель не превышал

Двоичная куча: доказательство сложности конструкции O(n)

.

Доказательство: В

Двоичная куча: доказательство сложности конструкции O(n)

звонки оператора

Двоичная куча: доказательство сложности конструкции O(n)

индекс

Двоичная куча: доказательство сложности конструкции O(n)

элемент увеличивается как минимум

Двоичная куча: доказательство сложности конструкции O(n)

один раз.

Пусть это сейчас

Двоичная куча: доказательство сложности конструкции O(n)

, т.е.



Двоичная куча: доказательство сложности конструкции O(n)

.

Затем после

Двоичная куча: доказательство сложности конструкции O(n)

у нас есть проблемы

Двоичная куча: доказательство сложности конструкции O(n)

, что невозможно, так как в нашей куче

Двоичная куча: доказательство сложности конструкции O(n)

элементы.



Двоичная куча: доказательство сложности конструкции O(n)

Оценим теперь сверху величину

Двоичная куча: доказательство сложности конструкции O(n)

.

Пусть элемент массива имеет индекс

Двоичная куча: доказательство сложности конструкции O(n)

.

Будет

Двоичная куча: доказательство сложности конструкции O(n)

, такой, что

Двоичная куча: доказательство сложности конструкции O(n)

.

Тогда для того, чтобы элемент массива с индексом

Двоичная куча: доказательство сложности конструкции O(n)

встал на место в куче, больше не потребуется

Двоичная куча: доказательство сложности конструкции O(n)

звонки

Двоичная куча: доказательство сложности конструкции O(n)

(по лемме).

Количество элементов с такими индексами есть величина

Двоичная куча: доказательство сложности конструкции O(n)

, который в

Двоичная куча: доказательство сложности конструкции O(n)

уходит в ноль.

Таким образом,

Двоичная куча: доказательство сложности конструкции O(n)

В

Двоичная куча: доказательство сложности конструкции O(n)

члены равны нулю (поэтому цикл в процедуре

Двоичная куча: доказательство сложности конструкции O(n)

ты можешь начать с

Двоичная куча: доказательство сложности конструкции O(n)

).

Оценим левый множитель в каждом слагаемом суммы как

Двоичная куча: доказательство сложности конструкции O(n)

Отсюда мы имеем:

Двоичная куча: доказательство сложности конструкции O(n)

Давайте оценим каждую из сумм.



Двоичная куча: доказательство сложности конструкции O(n)



Двоичная куча: доказательство сложности конструкции O(n)

Таким образом,

Двоичная куча: доказательство сложности конструкции O(n)

.



Двоичная куча: доказательство сложности конструкции O(n)

ограничено сверху функцией, которая

Двоичная куча: доказательство сложности конструкции O(n)

.

Означает,

Двоичная куча: доказательство сложности конструкции O(n)

.

Таким образом, время выполнения процедуры

Двоичная куча: доказательство сложности конструкции O(n)

существует количество, пропорциональное

Двоичная куча: доказательство сложности конструкции O(n)

.

Теги: #оценка алгоритмов #математика #двоичная куча #куча #построение кучи #Алгоритмы #математика

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.