|
Grafy a tabuľky |
Vyhľadávanie zadanej hodnoty v strome
|
Priemerné počty porovnaní vybraných implementácií |
//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* CStrom::najdi_cykl_uzol(CUzol* uzol, int hladany){
while (++p_a_porovnani_ && uzol) {
++p_a_cyklov_;
if (++p_b_porovnani_ && uzol->hodnota() > hladany) uzol=uzol->lavy();
else if (++p_b_porovnani_ && uzol->hodnota() < hladany) uzol=uzol->pravy();
else return uzol;
}
return 0;
} |
Počet porovnaní, cyklov a času trvania algoritmu pre úspešné vyhľadávanie. |
počet uzlov v strome |
p_a_porovnani_ |
p_b_porovnani_ |
p_a_cyklov_ |
čas |
15 |
3,267 |
5,400 |
3,267 |
0,3805 |
127 |
6,055 |
9,583 |
6,055 |
0,6930 |
1.023 |
9,010 |
14,02 |
9,010 |
1,027 |
8.191 |
12,00 |
18,50 |
12,00 |
1,324 |
65.535 |
15,00 |
23,00 |
15,00 |
1,638 |
|
Pri hľadaní v cykle je najdôležitejším nameraným údajom počet cyklov algoritmu. Najmä od neho totiž závisí čas vyhľadávania. Počet cyklov je pri úspešnom vyhľadávaní v priemernom prípade rovný (log(2) n)-1. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre neúspešné vyhľadávanie s p=0,9. |
počet uzlov v strome |
p_a_porovnani_ |
p_b_porovnani_ |
p_a_cyklov_ |
čas |
15 |
4,933 |
6,067 |
4,000 |
0,4159 |
127 |
7,795 |
10,22 |
6,882 |
0,7084 |
1.023 |
10,82 |
14,85 |
9,910 |
1,037 |
8.191 |
13,82 |
19,40 |
12,91 |
1,345 |
65.535 |
16,87 |
23,89 |
15,91 |
1,664 |
|
Počet cyklov je pri zväčša neúspešnom vyhľadávaní v priemernom prípade rovný (log(2) n). Toto číslo totiž vyjadruje priemernú hĺbku stromu. |
|
|
//vyhladavanie zadanej hodnoty "hladany" v binarnom strome urcenom uzlom "uzol" pomocou rekurziou
//funkcia vracia ukazovatel na najdeny uzol (v pripade neuspechu vyhladavania vracia 0)
CUzol* CStrom::najdi_rek_uzol(CUzol* uzol, int hladany){
++p_a_volani_;
if (++p_a_porovnani_ && !uzol) return 0;
else if (++p_b_porovnani_ && uzol->hodnota() > hladany)
return najdi_rek_uzol(uzol->lavy(), hladany);
else if (++p_b_porovnani_ && uzol->hodnota() < hladany)
return najdi_rek_uzol(uzol->pravy(), hladany);
else return uzol;
} |
Počet porovnaní, cyklov a času trvania algoritmu pre úspešné vyhľadávanie. |
počet uzlov v strome |
p_a_porovnani_ |
p_b_porovnani_ |
p_a_volani_ |
čas |
15 |
3,267 |
5,400 |
3,267 |
0,4573 |
127 |
6,055 |
9,583 |
6,055 |
0,8597 |
1.023 |
9,010 |
14,02 |
9,010 |
1,301 |
8.191 |
12,00 |
18,50 |
12,00 |
1,732 |
65.535 |
15,00 |
23,00 |
15,00 |
2,190 |
|
Pri každom volaní sa delí vyhľadávací problém na polovičný. Počet volaní je preto pri úspešnom vyhľadávaní približne rovný (log(2) n)-1. -1 je na konci z toho dôvodu, že vyhľadávanie v priemernom prípade skončí na predposlednej úrovni v strome. |
|
Počet porovnaní, cyklov a času trvania algoritmu pre neúspešné vyhľadávanie s p=0,9. |
počet uzlov v strome |
p_a_porovnani_ |
p_b_porovnani_ |
p_a_volani_ |
čas |
15 |
4,933 |
6,067 |
4,933 |
0,5588 |
127 |
7,795 |
10,22 |
7,795 |
0,9370 |
1.023 |
10,82 |
14,85 |
10,82 |
1,380 |
8.191 |
13,82 |
19,40 |
13,82 |
1,811 |
65.535 |
16,87 |
23,89 |
16,87 |
2,279 |
|
Počet volaní je pri neúspešnom vyhľadávaní približne rovný (log(2) n). Je to preto, lebo aby algoritmus s určitosťou došiel k záveru, že hľadaná hodnota sa v strome nenachádza, musí sa dostať až na najnižšiu úroveň (do najväčšej hĺbky) v strome. |
|
|
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Pre oba typy algoritmu, vyhľadávanie pomocou cyklu a aj rekurzie platí, že čas vykonávania algoritmu závisí od veľkosti stromu logaritmicky. Vyhľadávanie v strome s veľkosťou 65.535 uzlov trvá len približne 2ms. |
|
|
15 |
127 |
1.023 |
8.191 |
65.535 |
úspešné vyhľadávanie rekurziou |
0,4570 |
0,8600 |
1,301 |
1,732 |
2,190 |
neúspešné vyhľadávanie s p=0,9 rekurziou |
0,5590 |
0,9370 |
1,380 |
1,811 |
2,279 |
úspešné vyhľadávanie cyklom |
0,3810 |
0,6930 |
1,027 |
1,324 |
1,638 |
neúspešné vyhľadávanie s p=0,9 cyklom |
0,4160 |
0,7080 |
1,037 |
1,346 |
1,664 |
|
|
|
Poznámka: Algoritmy boli testované na počítači s procesorom AMD Athlon(tm) XP 1700+ a s 256 MB operačnou pamäťou pod operačným systémom Windows XP. Všetky časy uvedené v tabuľke sú v mikrosekundách. |