Grafy a tabuľky | ||||||||||||||||||||||||||||||||||||
Interpolačné vyhľadávanie | ||||||||||||||||||||||||||||||||||||
Priemerné počty porovnaní vybraných implementácií | ||||||||||||||||||||||||||||||||||||
//interpolacne 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_interpol_index(T hladany){ int lavy_o=0; int pravy_o=velkost_-1; while ( ++p_a_porovnani_ && pole_[lavy_o] <= hladany && ++p_a_porovnani_ && hladany <= pole_[pravy_o]) { ++p_a_cyklov_; float menovatel=(pole_[pravy_o]-pole_[lavy_o]); if (++p_c_porovnani_ && menovatel==0) { if (++p_b_porovnani_ && pole_[lavy_o]==hladany) return lavy_o; else return -1; } int stred=lavy_o + (hladany-pole_[lavy_o]) * ((pravy_o-lavy_o) / menovatel); if (++p_b_porovnani_ && pole_[stred]==hladany) return stred; else if (++p_b_porovnani_ && pole_[stred] < hladany) lavy_o=stred+1; else pravy_o=stred-1; } return -1; } | ||||||||||||||||||||||||||||||||||||
Počet porovnaní, cyklov a času trvania algoritmu pre úspešné vyhľadávanie s p=1. | ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
Pri tomto testovaní algoritmu sa vo vstupnom poli indexovanom od 0 po n-1 nachádzali čísla 0 až n-1. Algoritmus teda v takomto prípade vždy našiel hľadaný prvok na prvý pokus. | ||||||||||||||||||||||||||||||||||||
Počet porovnaní, cyklov a času trvania algoritmu pre úspešné vyhľadávanie s p < 1. | ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
Pri tomto testovaní boli do poľa vložené náhodné čísla z rovnomerného rozdelenia z rozsahu 0 až n-1. Preto sa algoritmu väčšinou podarilo veľmi rýchlo priblížiť k miestu, kde by sa hľadaná hodnota mala skutočne nachádzať. | ||||||||||||||||||||||||||||||||||||
Počet porovnaní, cyklov a času trvania algoritmu pre neúspešné vyhľadávanie s p=0,9 s rovnomerným rozdelením prvkov v poli. | ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
Pri tomto testovaní boli do poľa vložené náhodné čísla z rovnomerného rozdelenia z rozsahu 0 až 10*n-1. V tomto prípade sa algoritmu tiež darilo veľmi rýchlo (približne na 3 cykly) priblížiť sa k miestu, kde by sa hľadaná hodnota mala nachádzať. | ||||||||||||||||||||||||||||||||||||
Počet porovnaní, cyklov a času trvania algoritmu pre neúspešné vyhľadávanie s exponenciálnym rozdelením prvkov v poli. | ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
Pri tomto testovaní boli do poľa vložené náhodné čísla s exponenciálnym rozdelením z rozsahu 0 až 10*n. Algoritmu sa preto nedarilo rýchlo sa približovať k skutočnému miestu, kde by sa mal prvok nachádzať. So zväčšujúcim sa vstupným poľom sa aj čas vyhľadávania veľmi predlžuje. | ||||||||||||||||||||||||||||||||||||
Závislost dĺžky času trvania algoritmu od veľkosti vstupného pola | ||||||||||||||||||||||||||||||||||||
Ako je z grafu vidno, efektivita a časová zložitosť tohto algoritmu silne závisí od rozdelenia prvkov v poli. Pri vždy úspešnom vyhľadávaní je výsledný čas trvania vlastne len vyrátaním pozície hľadaného prvku. Pri rovnomernom rozdelení si algoritmus počína približne rovnako efektívne aj pri úspešnom aj neúspešnom vyhľadávaní. Pri exponenciálnom rozdelení prvkov je už tak dosť časovo náročný výpočet novej aktuálnej pozície ešte aj príťažou a spomalením v hľadaní. Pre takéto polia nie je tento algoritmus vhodný. Porovnanie s binárnym algoritmom môžeme nájsť na konci podkapitoly 1.2. | ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
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. |