Grafy a tabuľky

Sekvenčné vyhľadávanie so zarážkou

Priemerné počty porovnaní vybraných implementácií

//sekvencne vyhladavanie zadaneho prvku "hladany" s pomocou zarazky
//funkcia vracia index zadaneho prvku v poli (v pripade neuspechu vyhladavania vracia -1) 
template < class T, int velkost_ > 
int CPole < T, velkost_ > ::najdi_sekv_index_zarazka(T hladany, int p_prvkov){
	if (++p_c_porovnani_ && p_prvkov >= velkost_) {
		cout << endl << "Na konci pola nie je miesto pre zarazku" << endl;
		exit(-1);
	}
	pole_[p_prvkov]=hladany;
	
	int index=0;
	while (++p_b_porovnani_ && pole_[index]!=hladany) {++p_a_cyklov_; index++;}
	if (++p_a_porovnani_ && index < p_prvkov) return index;
	else 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_ čas
10 1,000 5,500 1,000 4,500 0,0905
100 1,000 50,50 1,000 49,50 0,4041
1.000 1,000 500,5 1,000 499,5 3,575
10.000 1,000 5000,5 1,000 4999,5 34,90
100.000 1,000 50000,5 1,000 49999,5 385,6
Ako môžeme vidieť, skutočne sa zmenšil počet porovnaní. Pre priemerný prípad úspešného vyhľadávania je rádovo n/2. Počet cyklov je tiež približne rovný polovici dĺžke vstupného poľa.
 
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_ čas
10 1,000 9,800 1,000 8,800 0,1283
100 1,000 96,83 1,000 95,83 0,7276
1.000 1,000 955,7 1,000 954,7 6,719
10.000 1,000 9556,0 1,000 9555,0 66,10
100.000 1,000 97737,0 1,000 97736,0 915,4
Pre zväčša neúspešné vyhľadávanie je počet porovnaní a teda aj cyklov rádovo n.
 
 

Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola

Algoritmus má opäť lineárnu závislosť dĺžky trvania od veľkosti vstupného poľa. Odchýlky sú spôsobené pre malé polia volaním funkcie a pre veľké polia stránkovaním.
  10 100 1.000 10.000 100.000
úspešné vyhľadávanie 0,0905 0,4040 3,580 34,90 386,0
neúspešné vyhľadávanie s p=0,9 0,1283 0,7280 6,720 66,10 915,0
 
 

Porovnanie algoritmu s predchádzajúcimi algoritmami

Od sekvenčného vyhľadávania so zarážkou sme si sľubovali na základe zmenšenia počtu porovnaní aj zrýchlenie vyhľadávania. To však nenastalo v takej miere, ako sme to asi očakávali. Je to spôsobené tým, že počet cyklov je pre oba algoritmy rovnaký. Napriek tomu je z nameraných hodnôt vidieť, že pre veľkosti poľa väčšie ako približne 15 prvkov pre úspešné vyhľadávanie a asi 60 prvkov pre zväčša neúspešné vyhľadávanie je sekvenčný algoritmus so zarážkou rýchlejší a s narastajúcou veľkosťou poľa sa jeho náskok pred obyčajným sekvenčným vyhľadávaním zväčšuje. Pre menšie polia je pomalejší z dôvodu kontroly miesta na konci poľa a následným umiestňovaním zarážky.
  10 30 50 70 100
úspešné sekvenčné 0,0809 0,1447 0,2119 0,3147 0,429
neúspešné sekvenčné s p=0,9 0,1203 0,2743 0,4208 0,5687 0,79
úspešné so zarážkou 0,0905 0,1628 0,2309 0,2998 0,404
neúspešné so zarážkou s p=0,9 0,1283 0,2569 0,3940 0,5061 0,728
 
 
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.