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.