|
Grafy a tabuľky |
Sekvenčné vyhľadávanie s podmienkou
|
Priemerné počty porovnaní vybraných implementácií |
//sekvencne vyhladavanie zadaneho prvku "hladany" s podmienkou
//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_sekv_int_podm(T hladany){
int index=0;
while (++p_a_porovnani_ && index < velkost_) {
if (++p_b_porovnani_ && pole_[index] < hladany) {++p_a_cyklov_; index++;}
else {
if (++p_b_porovnani_ && pole_[index]==hladany) return index;
else return -1;
}
}
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_a_cyklov_ |
čas |
10 |
5,500 |
6,500 |
4,500 |
0,0864 |
100 |
50,50 |
51,50 |
49,50 |
0,4310 |
1.000 |
500,5 |
501,5 |
499,5 |
3,885 |
10.000 |
5000,5 |
5001,5 |
4999,5 |
38,20 |
100.000 |
50000,5 |
50001,5 |
49999,5 |
425,5 |
|
Počet cyklov pri úspešnom vyhľadávaní uvedeného algoritmu je približne n/2. Keďže počas každého cyklu vykoná 2 porovnania, je počet všetkých porovnaní približne 2*(n/2). |
|
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_a_cyklov_ |
čas |
10 |
5,100 |
5,900 |
4,100 |
0,0929 |
100 |
51,05 |
52,05 |
50,05 |
0,4410 |
1.000 |
500,1 |
501,1 |
499,1 |
3,875 |
10.000 |
4962,8 |
4963,8 |
4961,8 |
38,10 |
100.000 |
49854,0 |
49855,0 |
49853,0 |
421,5 |
|
Počet cyklov pri neúspešnom vyhľadávaní je približne rovnaký ako pri úspešnom vyhľadávaní, teda rádovo n/2. Je to preto, lebo ak algoritmus nenájde prvok na predpokladanom mieste v zoradenom poli a teda nájde číslo väčšie ako hľadané, nepokračuje ďalej vo vyhľadávaní, ale skončí. Keďže v každom cykle vykoná 2 porovnania, je počet porovnaní približne n. |
|
|
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola |
Časová zložitosť tohto algoritmu je podobne ako pri algoritmoch pre neusporiadané polia lineárna. Môžeme si však všimnúť, že aj pre úspešné a aj pre neúspešné vyhľadávanie sú časy trvania algoritmu takmer totožné. |
|
|
10 |
100 |
1.000 |
10.000 |
100.000 |
úspešné vyhľadávanie |
0,0864 |
0,4310 |
3,890 |
38,20 |
426,0 |
neúspešné vyhľadávanie s p=0,9 |
0,0929 |
0,4410 |
3,880 |
38,10 |
422,0 |
|
|
|
Porovnanie algoritmu s predchádzajúcimi algoritmami |
Sekvenčný algoritmus s podmienkou nepriniesol aj napriek usporiadanému vstupnému poľu žiadne veľké zrýchlenie. Pri úspešnom vyhľadávaní nie je ani tak rýchly ako sekvenčné vyhľadávanie so zarážkou. Má však jednu výhodu a tou sú takmer rovnaké časové nároky na úspešné a aj neúspešné vyhľadávanie, čo o ďalších dvoch algoritmoch neplatí. |
|
|
10 |
100 |
1.000 |
10.000 |
100.000 |
úspešné sekvenčné |
0,0809 |
0,4290 |
3,910 |
38,10 |
422,0 |
neúspešné sekvenčné s p=0,9 |
0,1203 |
0,7900 |
7,310 |
72,80 |
962,0 |
úspešné sekvenčné so zarážkou |
0,0905 |
0,4040 |
3,580 |
34,90 |
386,0 |
neúspešné sekvenčné so zarážkou s p=0,9 |
0,1283 |
0,7280 |
6,720 |
66,10 |
915,0 |
sekvenčné s podmienkou |
0,0929 |
0,4410 |
3,880 |
38,10 |
422,0 |
|
|
|
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. |