Пређи на садржај

Гомила (структура података)

С Википедије, слободне енциклопедије
Пример гомиле

Гомила (бинарна) је структура података коју чине листе објекта коју можемо гледати као на скоро комплетно бинарно стабло.[1] Сваки чвор у стаблу одговара редном броју елемената у листи. Сваки ниво стабла је потпуно попуњен изузев најнижег левог подстабла.Јер се елементи и стабло убацују са лева на десне тј. прво се попуњава лево подстабло, па онда десно подстабло.

Родитељ мора бити већи или једнаки од свог детета.

Карактеристике гомиле[уреди | уреди извор]

Листа која представља гомилу је објекат који има две особине:

  1. Дужину (length) која враћа број елемената у листи
  2. Величина гомиле (heap-size) koja показује колико елемената у низу су сортирани у листи

Чвор у стаблу је први елемент листе (и = 1) где и означавамо као индекс елемената у листи. Лево дете добијамо формулом 2*и. Десно дете добијамо формулом 2*и+1.

За све елементе у гомили важи правило 0 <= A.heap-size <= A.length.[2]

Операције над гомилом[уреди | уреди извор]

Брисање из гомиле[уреди | уреди извор]

Функција која омогућава брисање елемената из гомиле.

Убациванје у гомилу[уреди | уреди извор]

Функција која омогућава убацивање елемената у гомилу.

Max-Heapify[уреди | уреди извор]

Функција која прави да сваки чвор мора да сваки родитељ у стаблу мора бити већи или једнаки детету.

Build-Max heap[уреди | уреди извор]

Функција која прави не растућу гомилу од не сортираног низа.

Heap property[уреди | уреди извор]

Је правило на коме је заснована гомила као структура података. И по овом правилу родитељ мора бити већи или једнаки детету.

Да би смо одржали

Сложеност функција[уреди | уреди извор]

Функција Најбољи случај Најгори случај
Build-Max heap О(n) О(n)
Max-Heapify О(logn) О(logn)
Убациванје у гомилу О(logn) О(logn)
Брисање из гомиле О(logn) О(logn)
Наћи мин О(1) О(1)
Наћи макс О(1) О(1)

Одржавање Max heap property[уреди | уреди извор]

Да би смо могли да одржавамо Max heap property, ми морамо да позивамо функцију Max-Heapify. Функцији прослеђујемо листу и индекс елемената који се налази у листи. Када се позива Max-Heapify за одређени чвор, функција претпоставља да су леви и десни лист чвора Max-Heap, али и да њихов родитељ може бити маљи од своје деце. И ово крши правило маx heap property. Ако се ово деси Max-Heapify омогићава да родитељ у стаблу замени место и индекс са највећим дететом. Посто смо заменили родитеља са дететом, сад морамо да проверимо да ли нарушавамо heap property и том (левом или десном) подстаблу сад рекурзивно позивамо функцију Max-Heapify у том подстаблу да би смо одржавали Max heap property.

Псеудо код


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 ≠ i
excange A[i] with largest 
Max-Heapify(A, largest)


Направити гомилу[уреди | уреди извор]

Користимо процедуру Max-Heapify да би смо од листе дужине n направили маx-неаp. Процедура Build-Max heap пролази кроз све чворове стабла и за сваки чвор позива функцију Max-Heapify.

Псеудо код

Build-Max heap(А)
A.heap-size = A.length
for i = [A.length/2] downto 1
Max-Heapify(A, i)


Врсте гомила[уреди | уреди извор]

Имамо две врсте гомила max-heaps и min-heaps. И у оба случаја мора бити задовољен Heap property. Само сто код max-heap родитељ је већи или једнак детету. И код max-heap највећи чвор је на врху стабла. А код min-heap родитељ је мањи или једнак детету. И најмањи чвор је на самом врху стабла.

Алгоритам за сортирање[уреди | уреди извор]

Пример hipsort алгоритма. Просечна сложеност: Најгора сложеност:
Prostorna složenost:

Алгоритам за сортирање гомила зове се Heap Sort и његова сложеност је О(nlogn).


Псеудо код


BuildMax-Heap(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heap-size = A.heap-size-1
MAX-HEAPIFY(A,1)


Референце[уреди | уреди извор]

  1. ^ Шкарић, Милан. „12”. Увод у програмирање (на језику: Српски језик). Београд: Микро књига. „Бинарно стабло 
  2. ^ Cormen, Thomas H. (1990 (first edition)). „Heapsort”. Introduction to Algorithms, Third Edition (PDF) (на језику: енглески). Charles E. Leiserson Ronald L. Rivest Clifford Stein (3. изд.). United States: MIT Press. стр. 1292. ISBN 978-0-262-03384-8. Архивирано из оригинала (PDF) 18. 10. 2016. г. Приступљено 08. 2. 2016. „Heap(Гомила)  Проверите вредност парамет(а)ра за датум: |date= (помоћ)

Литература[уреди | уреди извор]

  • Cormen, Thomas H. (1990 (first edition)). „Heapsort”. Introduction to Algorithms, Third Edition (PDF) (на језику: енглески). Charles E. Leiserson Ronald L. Rivest Clifford Stein (3. изд.). United States: MIT Press. стр. 1292. ISBN 978-0-262-03384-8. Архивирано из оригинала (PDF) 18. 10. 2016. г. Приступљено 03. 01. 2016. „Heap(Гомила)  Проверите вредност парамет(а)ра за датум: |date= (помоћ)
  • Шкарић, Милан. „12”. Увод у програмирање (на језику: Српски језик). Београд: Микро књига. „Бинарно стабло 
  • Introductions to algorithms -Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, књигу можете погледати овде Архивирано на сајту Wayback Machine (18. октобар 2016)
  • Алгоритми и структуре података - Мило Томашевић