Algoritmy pre stromy
|
Vyhľadávanie zadanej hodnoty v strome
|
Popis |
Ak chceme zahájiť vyhľadávanie v binárnom strome a zahrnúť do vyhľadávania všetky prvky stromu, musíme začať vyhľadávanie v koreni stromu. Prehľadávanie sa vykonáva pohybom v strome smerom k listom. Rozhodnutie o tom, v ktorej časti stromu bude vyhľadávanie pokračovať sa robí na základe hodnoty prvku v aktuálnom uzle a hodnote hľadaného prvku.
|
Vstupy algoritmu |
Vstupom pre algoritmus musí byť strom alebo podstrom, v ktorom chceme vyhľadávať. Tento môže byť určený ukazovateľom na koreň stromu alebo podstromu. Ďalším vstupom je potom hľadaný prvok.
|
Princíp činnosti |
Na začiatku je porovnaný hľadaný prvok s prvkom v aktuálnom uzle vstupného stromu. Ak sa tieto prvky rovnajú, algoritmus môžeme ukončiť. Ak je hľadaný prvok menší ako prvok v aktuálnom uzle, je zrejmé, že ak by sa hľadaný prvok v strome nachádzal, musí byť niekde v ľavom podstrome (medzi prvkami menšími ako v aktuálnom uzle). Preto za nasledujúci aktuálny uzol je vzatý ten, na ktorý ukazuje ukazovateľ na ľavý podstrom. Ak je hľadaný prvok väčší ako ten v aktuálnom uzle, pokračuje algoritmus vo vyhľadávaní v pravom podstrome. Za nasledujúci aktuálny uzol vezme uzol, na ktorý ukazuje ukazovateľ na pravý podstrom v momentálne aktuálnom uzle. Takto postupne prechádza stromom dovtedy, pokiaľ nenájde hľadaný prvok alebo aktuálny uzol už neobsahuje požadovaný ukazovateľ (požadovaný ukazovateľ je nulový).
|
Výstupy algoritmu |
Ak sme našli hľadaný prvok, výstupom algoritmu môže byť logická premenná s hodnotou pravda alebo priamo ukazovateľ na uzol, v ktorom sa daný prvok nachádza. V prípade, že sa dostaneme pri prehľadávaní až k uzlom stromu, ktoré neobsahujú požadovaný ukazovateľ a hľadaný prvok sme nenašli, výstupom bude logická premenná s hodnotou nepravda alebo nulový ukazovateľ.
|
Vývojový diagram |
|
Implementácia |
| //vyhladavanie zadanej hodnoty "hladany" v binarnom strome urcenom uzlom "uzol" pomocou cyklu while
//funkcia vracia ukazovatel na najdeny uzol (v pripade neuspechu vyhladavania vracia 0)
CUzol* najdi_cykl_uzol(CUzol* uzol, int hladany){
while(uzol) {
if (uzol->hodnota() > hladany) uzol=uzol->lavy();
else if (uzol->hodnota() < hladany) uzol=uzol->pravy();
else return uzol;
}
return 0;
} |
Ďalšie implementácie |
Vizualizácie |
Príklad úspechu |
|
Príklad neúspechu |
|
Časová zložitosť |
Pri vyhľadávaní ľubovoľného prvku urobíme najviac toľko krokov, akú hĺbku má vstupný strom. Ak je v binárnom vyhľadávacom strome n prvkov, potom hĺbka stromu je log(2) n. Pri priemernom úspešnom vyhľadávaní nájdeme hľadaný prvok podľa [4] na predposlednej úrovni a preto je počet porovnaní takéhoto vyhľadávania rádovo (log(2) n) – 1. Pri neúspešnom vyhľadávaní urobíme podľa [4] rádovo log(2) n porovnaní.
|
|
Grafy, tabuľky a porovnanie s predchádzajúcimi algoritmami |
|
|
|