|
Grafy a tabuľky |
Fibbonacciho vyhľadávanie
|
Priemerné počty porovnaní vybraných implementácií |
//fibbonachiho vyhladavanie zadaneho prvku "hladany"
//pole musi byt usporiadane vzostupne (na zaciatku pola je prvok s najmensou hodnotou)
//funkcia vracia index zadaneho prvku v poli (v pripade neuspechu vyhladavania vracia -1)
template < class T, int velkost_ >
int CPole < T, velkost_ > ::najdi_fib_index(T hladany){
CPole < int, MAX_DLZKA_FIB_RADU > fib_pole_;
fib_pole_[0]=0;
fib_pole_[1]=1;
int index=1;
while ( ++p_c_porovnani_ && fib_pole_[index] < velkost_ &&
++p_c_porovnani_ && index < MAX_DLZKA_FIB_RADU ) {
++p_b_cyklov_;
index++;
fib_pole_[index] = fib_pole_[index-2] + fib_pole_[index-1];
}
int i=fib_pole_[index-1];
int p=fib_pole_[index-2];
int q=fib_pole_[index-3];
if (i==0) return -1;
while(true){
++p_a_cyklov_;
if (++p_b_porovnani_ && pole_[i-1]==hladany) return i-1;
else if (++p_b_porovnani_ && pole_[i-1] < hladany) {
if (++p_a_porovnani_ && p==1) return -1;
else {
i=i+q;
p=p-q;
q=q-p;
}
}
else {
if (++p_a_porovnani_ && q==0) return -1;
else {
i=i-q;
int t=p;
p=q;
q=t-q;
}
}
}
return -1;
} |
Počet porovnaní, cyklov a času trvania algoritmu pre úspešné vyhľadávanie. |
počet prvkov v poli |
p_a_porovnani_ |
p_b_porovnani_ |
p_c_porovnani_ |
p_a_cyklov_ |
p_b_cyklov_ |
čas |
12 |
2,167 |
5,333 |
13,00 |
3,167 |
6,000 |
0,2160 |
88 |
4,818 |
10,64 |
21,00 |
5,818 |
10,00 |
0,3149 |
986 |
8,370 |
17,74 |
31,00 |
9,370 |
15,00 |
0,4300 |
10.945 |
11,98 |
24,96 |
41,00 |
12,98 |
20,00 |
0,5433 |
121.392 |
15,60 |
32,19 |
51,00 |
16,60 |
25,00 |
0,6673 |
|
Ako môžeme z tabuľky vidieť, veľkosti vstupného poľa sú čísla o 1 menšie ako niektoré Fibbonacciho čísla. Algoritmus si tieto čísla musí rátať sám. Prislúchajúci počet cyklov je p_b_cyklov_ a porovnaní p_c_porovnani_. Závislosť počtu cyklov od veľkosti poľa je logaritmická. Počet cyklov pre úspešné vyhľadávanie je približne (log(2) n). |
|
Počet porovnaní, cyklov a času trvania algoritmu pre neúspešné vyhľadávanie s p=0,9. |
počet prvkov v poli |
p_a_porovnani_ |
p_b_porovnani_ |
p_c_porovnani_ |
p_a_cyklov_ |
p_b_cyklov_ |
čas |
12 |
3,580 |
7,420 |
13,00 |
3,830 |
6,000 |
0,2419 |
88 |
6,570 |
13,24 |
21,00 |
6,670 |
10,00 |
0,3427 |
986 |
10,11 |
20,31 |
31,00 |
10,20 |
15,00 |
0,4614 |
10.945 |
13,81 |
27,70 |
41,00 |
13,89 |
20,00 |
0,5873 |
121.392 |
17,50 |
35,03 |
51,00 |
17,53 |
25,00 |
0,7156 |
|
Počet cyklov p_b_cyklov_ a porovnaní p_c_porovnani_ na vyrátanie Fibbonacciho čísiel je rovnaký ako pre úspešné vyhľadávanie . Počet cyklov pre zväčša neúspešné vyhľadávanie je ale väčší približne o 1, pretože sa algoritmus potrebuje dostať až do najväčšej možnej hĺbky vo Fibbonacciho strome a tá je v priemernom prípade približne (log(2) n)+1. |
|
|
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Časová zložitosť tohto algoritmu je podobne ako tomu bolo pri binárnom vyhľadávaní logaritmická. Neúspešné vyhľadávanie trvá vždy dlhšie ako úspešné vyhľadávanie. Rozdiel však nie je veľký. |
 |
|
10 |
100 |
1.000 |
10.000 |
100.000 |
úspešné vyhľadávanie |
0,2160 |
0,3149 |
0,4300 |
0,5433 |
0,6673 |
neúspešné vyhľadávanie s p=0,9 |
0,2419 |
0,3427 |
0,4614 |
0,5873 |
0,7156 |
|
|
|
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. |