9. Stromy
9.7 Triedenie haldou
Na záver kapitoly o stromoch si priblížime jednu
z rýchlych metód vnútorného triedenia (triedenia na mieste), ktorá
využíva stromovú dynamickú údajovú štruktúru nazývanú halda (hromada, heap). Ide o triedenie haldou - Heapsort.
Halda je binárny strom so špeciálnymi vlastnosťami: - usporiadanie - pre každý vrchol platí, že jeho hodnota je väčšia (nanajvýš rovná) ako hodnoty všetkých jeho potomkov
- tvar - každý vrchol, ktorý nie je na predposlednej alebo poslednej úrovni má dvoch synov. Na predposlednej úrovni sú zľava najskôr vrcholy s dvoma synmi, potom vrchol majúci iba ľavého syna a nakoniec vrcholy bez synov (listy).
Triedenie prebieha v dvoch fázach:
1. fáza - vytvorenie haldy
Prvky vstupnej postupnosti, ktorú chceme triediť uložíme postupne do binárneho stromu.
vstupná postupnosť: 44, 55, 12, 42, 94, 18, 6, 67, 23
|
Haldu
získame postupnou výmenou obsahov vrcholov. Vychádzame z listov
a vždy keď narazíme na vrchol s menšou hodotou ako hodnota
aspoň jedného jeho syna, výmenou hodnôt ho necháme klesnúť.
OBRÁZOK
|
Na obrázku je znázornená výsledná halda:
2. fáza - výpis prvkov haldy
V koreni sa nachádza najväčší prvok postupnosti.
Vypíšeme ho a potom ho odstránime - na jeho miesto uložíme
najvzdialenejší prvok stojaci vpravo dolu. Obnovíme haldu - koreňový
prvok "spustíme" na správne miesto. Opakujeme, kým sa halda
nevyprázdni. Prvky odstránené v tomto poradí tvoria utriedenú
postupnosť.
Odstránime 94
Na jeho miesto uložíme 23
| Číslo 23 necháme klesnúť.
| Odstránime 67. Na jeho miesto uložíme 42.
| Číslo 42 necháme klesnúť atď.
|
Implementácia haldy pomocou poľa
Halda sa dá jednoducho implementovať pomocou poľa. Prvky haldy sa do poľa uložia po riadkoch - úrovniach stromu.
Prvok A[i] má synov A[2i] a A[2i+1], prvok A[i/2] je otcom A[i] Pre každé i = 2,...,n platí: A[i/2] >= A[i]
Namiesto toho, aby sme odstránili koreň A[1], vymeníme
ho s A[n]. Zmenšíme n o jedna a nový prvok A[1] necháme
klesnúť v poli A[1], ..., A[n-1] na správne miesto. Na konci poľa sa vytvára z najväčších prvkov usporiadaná postupnosť ! [Program]
Triedenie
haldou je vylepšením triedenia priamym výberom. Výhodou je to, že
v koreni haldy je vždy maximálny prvok, nemusíme ho hľadať a preto
je algoritmus rýchlejší.
Dá sa dokázať, že haldu možno vytvoriť v O(n·log2n) krokoch a pokles prvku z koreňa vyžaduje najviac O(log2n) krokov. Heapsort je teda triediacim algoritmom s časovou výpočtovou zložitosťou O(n·log2n) .
|