\chapter{Implementácia a porovnanie algoritmov}
%Porovnanie algoritmov je realizované v programe matlab.

Algoritmy som porovnal matematicky podľa priemerného počtu porovnaní a pokusne na náhodne vygenerovanom poli. V poli sa môžu náhodne generované prvky opakovať, keďže som pre jednoduchosť neriešil unikátnosť prvkov. Algoritmy som napísal tak, že sa skončia pri prvej zhode a ďalší výskyt hľadaného prvku už nie je riešený. Všetky algoritmy sú naprogramované ako funkcie do programu MATLAB.

\section{Pokusná metóda porovnávania algoritmov}

Na porovnanie jednotlivých algoritmov som vytvoril program v MATLABe, ktorý každý algoritmus otestoval stokrát na náhodne generovaných poliach. Bolo vygenerované jedno pole, na ktorom boli postupne otestované všetky algoritmy v danej kategórii. Časy hľadaní boli zapisované do tabuliek pre každý algoritmus zvlášť a boli odlišné časy, kedy bol prvok nájdený a kedy nájdený nebol. Ak bol hľadaný prvok nájdený, čas sa do tabuľky zapísal normálne, ak hľadaný prvok nájdený nebol, zapísal sa do tabuľky záporný čas. Časy boli následne rozdelené do dvoch ďalších tabuliek --- jedna pre úspešné hľadanie a ďalšia pre neúspešné. V každom riadku boli časy hľadania z jedného rozsahu poľa --- napríklad v prvom riadku časy pre pole o rozsahu desaťtisíc prvkov. Z tabuliek boli vytvorené grafy závislosti času na počte prvkov v poli. Na os y v grafe boli vynesené hodnoty mediánov jednotlivých riadkov tabuľky a na os x hodnoty od nuly po dvestotisíc. Porovnané sú grafy úspešného a neúspešného hľadania v rámci jedného algoritmu a potom aj medzi ostatnými algoritmami.

Algoritmy boli testované na počítači s procesorom Intel Core 2 Duo P7550 @ 2,26 GHz, 4 GB RAM, 64-bit Windows 7.



\section{Algoritmy pre neusporiadané polia}

%algoritmus
%princip cinnosti
%matematicke vyhdonotenie
%prakticke vysledky



\subsection{Sekvenčné vyhľadávanie}
\begin{listing}[1]{1}
function vystup = Sekv_Vyhlad(Pole,Hladany_Prvok)
  i = 1;
  pocet_prvkov = length(Pole);
  vystup = -1;
  while i <= pocet_prvkov
    if Pole(i) == Hladany_Prvok
      vystup = i;
      break;
    else
      i = i +1;
    end;
  end;
end
\end{listing}
\paragraph{Princíp činnosti:}
Do premennej $i$ sa priradí index prvého prvku v poli a do premennej $pocet\_prvkov$ dĺžka poľa, čo je vlastne počet prvkov, ktoré sa nachádzajú v poli. Potom sa pokračuje cyklom s podmienkou na začiatku, ktorou je, že index aktuálneho prvku poľa musí byť menší alebo rovný ako počet prvkov v poli. Následne sa testuje, či sa aktuálny prvok rovná hľadanému. Ak sa rovnajú, výstupu funkcie sa priradí index prvku, ktorý sa rovnal hľadanému a algoritmus sa ukončí. Ak sa nerovnajú, do premennej $i$ sa priradí číslo o 1 väčšie.

\paragraph{Matematická analýza:}
Algoritmus porovnáva každý prvok poľa s hľadaným prvkom. V najlepšom prípade, keď sa hľadaný prvok nachádza hneď na začiatku poľa, algoritmus vykoná len $1$ porovnanie v cykle a $1$ porovnanie aktuálneho prvku s hľadaným, čo v súčte znamená $2$ porovnania. V najhoršom prípade, keď sa prvok nachádza na konci poľa, je potreba vykonať $n$ porovnaní v podmienke v cykle, kde $n$ je počet prvkov v poli a $n$ porovnaní aktuálneho prvku s hľadaným. V súčte to je $2n$ porovnaní.  Keď sa spriemerujú tieto dve možnosti $(2+2n)/2$, tak dostaneme $n+1$ porovnaní. V prípade neúspešného hľadania sa vždy vykoná $2n+1$ porovnaní.
% tak dostaneme približne $n+1$ porovnaní.
%Po spriemerovaní hľadaní by sme dostali približne $n+1$ porvnaní.

\paragraph{Grafická analýza:}
Na obrázku \ref{s1s} je vidieť, že čas potrebný na nájdenie prvku približne lineárne rastie a veľmi záleží, kde sa nachádzal hľadaný prvok, čo spôsobilo výkyvy v grafe.
\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s1s.png}
\caption{Úspešné sekvenčné vyhľadávanie}
\label{s1s}
\end{figure}
Keďže pri neúspešnom hľadaní je prehľadané celé pole, tak čas potrebný na zistenie, že sa prvok v poli nenachádza, rastie lineárne s počtom prvkov, čo znázorňuje graf na obrázku \ref{s1f}.
\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s1f.png}
\caption{Neúspešné sekvenčné vyhľadávanie}
\label{s1f}
\end{figure}

V grafe na obrázku \ref{s1c} vidieť, že čas potrebný na nájdenie prvku je približne polovičný ako pri neúspešnom hľadaní, čo sa zhoduje s odhadmi v matematickej analýze.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s1c.png}
\caption{Sekvenčné vyhľadávanie}
\label{s1c}
\end{figure}

\subsection{Sekvenčné vyhľadávanie so zarážkou}
\begin{listing}[1]{1}
function vystup = Sekv_Vyhl_Zarazka(Pole, Hladany_Prvok)
  i = 1;
  pocet_prvkov = length(Pole);
  Pole(pocet_prvkov + 1) = Hladany_Prvok;
  while Pole(i) ~= Hladany_Prvok
    i = i + 1;
  end;
  if i < length(Pole)
    vystup = i;
  else
    vystup = -1;
  end;
end
\end{listing}

\paragraph{Princíp činnosti:}
Do premennej $i$ sa priradí index prvého prvku v poli, do premennej $pocet\_prvkov$ dĺžka poľa, čo je vlastne počet prvkov, ktoré sa nachádzajú v poli a
za posledný prvok poľa sa vloží hľadaný prvok. Potom sa v cykle s podmienkou na začiatku, kde sa porovnáva hľadaný prvok s aktuálnym, zvyšuje hodnota indexu s krokom 1. Cyklus prebieha dovtedy, pokým sa aktuálny prvok nerovná hľadanému. Pomocou zarážky je zaručené, že sa cyklus vždy ukončí úspešne, takže treba ešte testovať, či sa našiel prvok v poli alebo sa hľadanie skončilo na zarážke. Ak je index $i$ menší ako dĺžka poľa, tak do výstupu funkcie sa priradí pozícia nájdeného prvku. V opačnom prípade je výstupom $-1$, čo znamená, že sa prvok v poli nenachádza.

\paragraph{Matematická analýza:}
%Na koniec poľa je vložený hľadaný prvok (zarážka), ktorý zaručuje vždy úspešné ukončenie hľadania.
Keďže je isté, že prvok sa v poli nachádza, dá sa jednodušiť algoritmus odstránením porovnávania podmienkou \emph{if} v tele cyklu. Oproti obyčajnému sekvenčnému vyhľadávaniu tak odpadne $n$ porovnaní, takže algoritmus vyhodnotí len podmienku na začiatku cyklu $n+1$-krát.
%Odpadá porovnávanie, či sa program nachádza vo vstupnom poli, tak sa zjednoduší hľadanie o $n$ porovnaní.
V najlepšom prípade, keď sa hľadaný prvok nachádza hneď na prvej pozícii v poli, sa vykonajú $2$ porovnania. Jedno v podmienke cyklu a druhé v teste, či nájdený prvok nie je zarážka. V najhoršom prípade pri nájdení prvku sa vykoná len $n+1$ porovnaní --- $n$ porovnaní v podmienke cyklu a $1$ porovnanie v teste, či nájdený prvok nie je zarážka. Počet porovnaní pre úspešné vyhľadávanie je po spriemerovaní týchto hodnôt $(n+3)/2$, čo je približne polovica oproti obyčajnému sekvenčnému vyhľadávaniu. Daňou za zmenšenie počtu porovnaní je réžia spojená s umiestňovaním a prípadným následným odstraňovaním zarážky. 

\paragraph{Grafická analýza:}
Na obrázku \ref{s2s} je vidieť podobný priebeh grafu ako u obyčajného sekvenčného vyhľadávania. Výkyvy krivky sú spôsobené umiestnením hľadaných prvkov v prehľadávanom poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s2s.png}
\caption{Úspešné sekvenčné vyhľadávanie so zarážkou}
\label{s2s}
\end{figure}

Graf na obrázku \ref{s2f} zobrazuje približne lineárnu závislosť času na zistenie, že prvok sa v poli nenachádza, na počte prvkov v poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s2f.png}
\caption{Neúspešné sekvenčné vyhľadávanie so zarážkou}
\label{s2f}
\end{figure}

V grafe na obrázku \ref{s2c} je zobrazené úspešné aj neúspešné sekvenčné vyhľadávanie so zarážkou. Čas na nájdenie prvku nie je polovičný voči neúspešnému vyhľadávaniu, ako to bolo u obyčajného sekvenčného vyhľadávania. Je o niečo vyšší kvôli umiestňovaniu zarážky.
%(poznámka: nieco nie je OK, velmi rychlo hlada oproti sekvnecnemu)

%(work in progress)

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s2c.png}
\caption{Sekvenčné vyhľadávanie so zarážkou}
\label{s2c}
\end{figure}

\subsection{Vyhľadávanie extrému}
\begin{listing}[1]{1}
function vystup = maximum(Pole)
  i = 2;
  pocet_prvkov = length(Pole);
  max = Pole(1);
  while i <= pocet_prvkov
    if Pole(i) > max
      max = Pole(i);
    end;
    i = i + 1;
  end;
  vystup = max;
end
\end{listing}
\paragraph{Princíp činnosti:}
Do premennej $i$ sa priradí index druhého prvku v poli, do premennej $max$, ktorá reprezentuje maximum, sa priradí hodnota prvého prvku v poli a do premennej $pocet\_prvkov$ dĺžka poľa. Pokračuje sa v cyklom s podmienkou na začiatku, ktorá zaručuje, že cyklus bude prebiehať, pokým bude index prvku menší alebo rovný počtu prvkov v poli. V cykle sa porovnáva aktuálny prvok so súčasným maximom. Ak je aktuálny prvok väčší ako súčasné maximum tak sa priradí do premennej $max$ a stáva sa novým maximom. Na konci sa do výstupu funkcie priradí hodnota premennej $max$.

\paragraph{Matematická analýza:}
Algoritmus prehľadáva vždy celé pole a je vždy úspešný. Je potreba vykonať $n$ porovnaní v podmienke cyklu a $n-1$ porovnaní aktuálneho prvku s maximom. Dohromady to teda je $2n-1$ porovnaní.

\paragraph{Grafická analýza:}
V grafe na obrázku \ref{max} je vidiet takmer lineárnu závislosť času potrebného na dokončenie algoritmu na počte prvkov v poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/max.png}
\caption{Vyhľadávanie maxima}
\label{max}
\end{figure}

\subsection{Vyhľadávanie oboch extrémov}
%V niektorých prípadoch chceme zistiť interval, v akom sa nachádzajú hodnoty v poli. V tomto prípade je výhodnejšie použiť vyhľadávanie maxima aj minima súčasne ako dvakrát vyhľadávanie jedného extrému.

\begin{listing}[1]{1}
function vystup = max_min(Pole)
  i = 4;
  if Pole(1) > Pole(2)
    max = Pole(1);
    min = Pole(2);
  else
    max = Pole(2);
    min = Pole(1);
  end
  pocet_prvkov = length(Pole);
  while i <= pocet_prvkov
    if Pole(i-1) < Pole(i)
      if Pole(i-1) < min 
        min = Pole(i-1); end;
      if Pole(i) > max 
        max = Pole(i); end;
    else
      if Pole(i) < min 
        min = Pole(i); end;
      if Pole(i-1) > max
        max = Pole(i-1); end;
    end
    i = i + 2;
  end;
  if i-2 ~= pocet_prvkov
  	if Pole(i-1) > max
  		max = Pole(i-1); end; 
  	if Pole(i-1) < min
  		min = Pole(i-1); end;
  end;
  vystup = [min max];
end
\end{listing}

\paragraph{Princíp činnosti:}
Do premennej $i$ sa priradí index štvrtého prvku v poli. Potom sa porovnajú prvé dva prvky medzi sebou. Menší prvok sa priradí do premennej $min$ reprezentujúcej minimum a väčší do premennej $max$ preprezentujúcej maximum. Pokračuje sa cyklom s podmienkou na začiatku, ktorá zaručí, že cyklus bude prebiehať pokým je $i+1$ menšie ako počet prvkov v poli. Prvky sa porovnávajú od tretieho prvku v poli, pretože prvé dva sme už porovnali pred cyklom. V cykle sa zoberú 2 prvky a porovnajú medzi sebou, aby sa zistilo, ktorý je väčší a ktorý menší. Väčší z nich sa porovná s hodnotou v premennej $max$. V prípade, že je väčší ako $max$, je priradený do premennej $max$ a stáva sa novým maximom. Menší prvok z dvojice je porovnaný s hodnotou v premennej $min$. Ak je menší ako táto hodnota je priradený do premennej $min$ a stáva sa novým minimom.

\paragraph{Matematická analýza:}
Tento algoritmus taktiež prehľadáva celé pole, takže porovná všetky prvky. Jedno porovnanie sa vykoná pred cyklom aby sa určilo dočasné maximum a minimu z prvých dvoch prvkov. Keďže sa porovnáva až od tretieho prvku tak treba porovnať $n-2$ prvkov. V cykle sa porovnávajú prvky po dvojiciach, takže podmienka v cykle bude testovaná $(n-2)/2+1$-krát. To sa dá upraviť na $n/2$ porovnaní. Dvojica prvkov je medzi sebou porovnaná $(n-2)/2$-krát. Každý prvok je porovnaný buď s minimom alebo s maximom, čo je $n-2$ porovnaní. Ďalej je ešte vykonené porovnanie na konci v prípade poľa s nepárnym počtom prvkov. Ak má pole párny počet prvkov, tak sa vykoná jedno porovnanie, ak nepárny tak sa vykonajú tri porovnania. Dohromady to je pre pole s párnym počtom prvkov $1+(n/2)+(n/2)-1+n-2+1=2n-1$ porovnaní. Pre pole s nepárnym počtom prvkov je to $1+(n-1)/2 + (n-3)/2 + n-3 + 3 = 2n-1$ porovnaní. Ak sa tieto 2 hodnoty spriemerujú, vyjde $2n-1$ porovnaní. Z toho vyplýva, že je časovo výhodnejšie hľadať oba extrémy naraz, pretože treba urobiť rovnaký počet porovnaní ako pri hľadaní iba jedného extrému. 

\paragraph{Grafická analýza:}
Graf na obrázku \ref{mms} má, tak isto ako predchádzajúci algoritmus, skoro lineárny priebeh, keďže je vždy potreba prehľadať celé pole.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/mms.png}
\caption{Vyhľadávanie oboch extrémov naraz}
\label{mms}
\end{figure}

\section{Algoritmy pre usporiadané polia}


\subsection{Sekvenčné vyhľadávanie s podmienkou}
\begin{listing}[1]{1}
function vystup = Sekv_vyhl_podm(Pole, HladanyPrvok)
  i = 1;
  pocet_prvkov = length(Pole);
  vystup = -1;
  while i <= pocet_prvkov
    if Pole(i) < HladanyPrvok
      i= i+1;
    else
      if Pole(i) == HladanyPrvok
        vystup = i;
        break;
      else vystup = -1;
        break;
      end;
    end
  end
end
\end{listing}

\paragraph{Princíp činnosti:}
Do premennej $i$ sa priradí index prvého prvku v poli, do premennej $pocet\_prvkov$ dĺžka poľa. Ďalej sa pokračuje do cyklu s podmienkou na začiatku, ktorá zabezpečí, že cyklus bude prebiehať, kým je aktuálny index $i$ menší alebo rovný počtu prvkov v poli. Potom sa porovnáva aktuálny prvok s hľadaným. Ak je aktuálny prvok menší ako hľadaný, tak algoritmus prejde na ďalší prvok v poli. Ak sa aktuálny a hľadaný prvok rovnajú, tak do výstupu funkcie je priradený index prvku $i$ a algoritmus úspešne skončí. V prípade, že aktuálny prvok je väčší ako hľadaný, tak algoritmus skončí neúspešne (výstupom je $-1$), pretože prvok sa už v poli nemôže nachádzať a ďalšie hľadanie je teda zbytočné.

\paragraph{Matematická analýza:}
Pri úspešnom vyhľadávaní je priemerný počet vykonaných porovnaní podobne ako pri obyčajnom sekvenčnom vyhľadávaní približne $n$. Výhody tohto algoritmu by sa mali prejaviť hlavne vtedy, keď sa pri vyhľadávaní prvok v poli nenachádza. V takomto prípade totiž algoritmus neprehľadáva prvky až do konca poľa, ale skončí už vtedy, keď je zrejmé, že hľadaný prvok sa už v poli nemôže nachádzať. Ak sa v poli nachádzajú prvky z rovnakého intervalu, z akého prvky vyhľadávame a ich rozdelenie je rovnomerné, počet porovnaní pri neúspešnom vyhľadávaní by mal byť tiež približne $n$ (pri obyčajnom sekvenčnom vyhľadávaní to bolo približne $2n$). Je to preto, lebo ak sa hľadaný prvok nenachádzal na jeho predpokladanom mieste, kde by bol pri úspešnom vyhľadávaní, algoritmus sa ihneď končí. \cite{sols3s}

\paragraph{Grafická analýza:}
Graf na obrázku~\ref{s3s} popisuje závislosť času potrebného na nájdenie hľadaného prvku na počte prvkov v poli. Čas potrebný na nájdenie hľadaného prvku narastá približne lineárne s počtom prvkov v poli. Výkyvy krivky sú spôsobonené umiestnením hľadaného prvku v poli. Ak boli hľadané prvky bližšie ku koncu poľa, tak čas potrebný na ich nájdenie bol vyšší. A naopak, ak boli hľadané prvky bližšie k začiatku poľa, tak čas potrebný na ich nájdenie bol nižší.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s3s.png}
\caption{Úspešné sekvenčné vyhľadávanie}
\label{s3s}
\end{figure}


Obrázok~\ref{s3f} popisuje závislosť času potrebného na zistenie, že sa hľadaný prvok v poli nenachádza, na počte prvkov v poli. Výkyvy sú spôsobené tým, že algoritmus zistil, že hľadaný prvok sa už nemôže ďalej nachádzať v poli a tak sa ukončil.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s3f.png}
\caption{Neúspešné sekvenčné vyhľadávanie}
\label{s3f}
\end{figure}

Obrázok \ref{s3c} ukazuje porovnanie grafov úspešného a neúspešného vyhľadávania. Dokazuje tvrdenie z matematickej analýzy, že čas vyhľadávania môže byť kratší pri neúspešnom vyhľadávaní ako pri úspešnom, keďže vyhľadávanie sa končí v momente, keď hľadaný prvok je menší ako aktuálny a neprehľadáva sa zbytok poľa ako pri klasickom sekvenčnom vyhľadávaní.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/s3c.png}
\caption{Sekvenčné vyhľadávanie s podmienkou}
\label{s3c}
\end{figure}


\subsection{Binárne vyhľadávanie}
\begin{listing}[1]{1}
function vystup = bin(Pole, HladanyPrvok)
  imin = 1;
  imax = length(Pole);
  vystup = -1;
    while imin <= imax
      stred = round((imin + imax)/2);
      if Pole(stred) < HladanyPrvok
        imin = stred + 1;
      elseif Pole(stred) > HladanyPrvok
        imax = stred - 1;
      else vystup = stred;
        break;
      end;
    end;
end
\end{listing}

\paragraph{Priníp činnosti:}
Do premennej $imin$ sa priradí index prvého a do $imax$ index posledného prvku poľa. Ďalej sa pokračuje do cyklu s podmienkou na začiatku, ktorá zaručí, že cyklus bude prebiehať pokým je spodná hranica intervalu $imin$ menšia alebo rovná hornej hranici intervalu $imax$. Potom sa v cykle vypočíta stred poľa (intervalu) podľa jednoduchého vzorca $(imin - imax)/2$ a zaokrúhli sa na celé číslo. Vypočítaný stred je následne testovaný, či je väčší alebo menší ako hľadaný prvok. Ak je menší, tak sa vyradí pravá strana intervalu, ak je väčší tak ľavá. Ak nie je ani väčší ani menší tak sa našiel hľadaný prvok, výstupu funkcie je priradená hodnota $stred$u a algoritmus sa úspešne skončí.

\paragraph{Matematická analýza:}
Keďže algoritmus pri každom cykle delí pole na polovicu, delí sa vyhľadávací problém vždy na problém polovičný. Počet cyklov je teda v najhoršom prípade približne $log_2 n$. V priemernom prípade úspešného hľadania je hľadaný prvok nájdený v predposlednom kroku, čo znamená, že priemerná časová zložitosť algoritmu je približne $log_2 n - 1$ porovnaní. \cite{solbis}

\paragraph{Grafická analýza:}
Graf na obrázku~\ref{bis} popisuje závislosť času potrebného na nájdenie hľadaného prvku na počte prvkov v poli. Čas potrebný na nájdenie hľadaného prvku narastá približne logaritmicky s počtom prvkov v poli, čo potvrdzuje matematickú analýzu. Výkyvy krivky sú spôsobonené umiestnením hľadaného prvku v poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/bis.png}
\caption{Úspešné binárne vyhľadávanie}
\label{bis}
\end{figure}

Graf na obrázku \ref{bif} popisuje závislosť času potrebného na zistenie, že sa hľadaný prvok v poli nenachádza, na počte prvkov v poli. Čas potrebný na neúspešné binárne vyhľadávanie 
%nájdenie hľadaného prvku 
narastá približne logaritmicky s počtom prvkov v poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/bif.png}
\caption{Neúspešné binárne vyhľadávanie}
\label{bif}
\end{figure}

Obrázok \ref{bic} ukazuje porovnanie oboch grafov úspešného a neúspešného vyhľadávania. Z grafu vyplýva, že časy vyhľadávania pri úspešnom a neúspešnom hľadaní sú skoro identické, takže dá sa povedať, že poloha prvku v poli nemá veľký vplyv na rýchlosť. Teda dĺžka vyhľadávania závisí hlavne na počte prvkov v poli.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/bic.png}
\caption{Binárne vyhľadávanie}
\label{bic}
\end{figure}

\subsection{Interpolačné vyhľadávanie}

\begin{listing}[1]{1}
function vystup = interpol(Pole, HladanyP)
  imin = 1;
  imax = length(Pole);
  vystup = -1;
  while Pole(imin) <= HladanyP && HladanyP <= Pole(imax)
    menovatel = Pole(imax) - Pole(imin);
    if menovatel == 0 
      if Pole(imin) == HladanyP
        vystup = imin;
        break;
      else vystup = -1;
        break;
      end
    end
    stred = imin+(HladanyP-Pole(imin))*((imax-imin)/menovatel);
    stred = round(stred);
    if Pole(stred) == HladanyP
      vystup = stred;
      break;
    elseif Pole(stred) < HladanyP
      imin = stred + 1;
    else imax = stred - 1;
    end
  end
end
\end{listing}

%$$(index~spodnej~hranice)+(hľadaný~prvok-minimum)*\frac{index~hornej~hranice - index~spodnej~hranice}{menovateľ}$$


\paragraph{Priníp činnosti:}
Do premennej $imin$ sa priradí index prvého a do $imax$ index posledného prvku poľa. Ďalej sa pokračuje cyklom s podmienkou na začiatku, ktorá zaručí, že cyklus bude prebiehať, ak je hľadaný prvok v intervale poľa. Potom sa vypočíta menovateľ z rozdielu minima a maxima. Ak by bol menovateľ rovný nule, tak sa testuje, či je minimum rovné hľadanému prvku. Ak sa rovná tak výstupu funkcie je priradený index uložený v premennej $imin$, v opačnom prípade sa priradí hodnota $-1$. Ak sa menovateľ nerovná nule cyklus pokračuje ďalej. Vypočíta sa $stred$ intervalu --- pravdepodobné miesto výskytu prvku, podľa vzorca: $$(imin)+(hlp-min)\cdot\frac{imax - imin}{menovatel}$$ 

 $imin$ --- index najmenšieho prvku poľa
 
 $imax$ --- index najväčšieho prvku poľa
 
 $min$ --- hodnota najmenšieho prvku poľa
 
 $hlp$ --- hodnota hľadaného prvku
 
 $menovatel$ --- rozdiel hodnôt najväčšieho a najmenšieho prvku poľa
 
%Spodná hranica poľa je označená vo vzorci ako $imin$, horná hranica ako $imax$, najmenší prvok ako $min$, hľadaný prvok ako $hlp$ a $menovatel$ je rozdiel maxima a minima poľa.
%$$(index spodnej hranice poľa)+(hľadaný prvok -- minimum)*((index hornej hranice -- index spodnej hranice)/menovateľ)$$. 
\noindent Potom sa testuje, či sa na vypočítanom mieste nachádza hľadaný prvok. Ak tam nie je, postupuje sa rovnako ako pri binárnom vyhľadávaní --- podľa toho, či je hľadaný prvok väčší alebo menší ako vypočítaná pozícia tak sa vyradí ľavá alebo pravá strana intervalu.

\paragraph{Matematická analýza:}
Interpolačné vyhľadávanie vykoná približne $log~log~n$ porovnaní a to aj pri úspešnom aj neúspešnom vyhľadávaní za predpokladu, že prvky poľa sú nezávisle rovnomerne distribuované náhodné čísla. Môže byť rýchlejšie ako binárne vyhľadávanie pre polia, ktoré majú sto a viac prvkov. \cite{wieder}

\paragraph{Grafická analýza:}

Graf úspešného hľadania na obrázku \ref{inc} sa dá aproximovať funkciou $log~log~x$, ktorá veľmi pomaly rastie a teda je minimálny časový rozdiel medzi hľadaním v poliach s vyššími počtami prvkov. Tak isto je vidieť, že čas na úspešné a neúspešné hľadanie je približne rovnaký a má skoro identický priebeh.


\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/inc.png}
\caption{Interpolačné vyhľadávanie}
\label{inc}
\end{figure}



\section{Vyhodnotenie algoritmov}

\subsection{Neusporiadané polia}

\paragraph{Sekvenčné vyhľadávania:}

V grafe na obrázku \ref{pon} sú zobrazené grafy úspešného sekvenčného vyhľadávania bez zarážky a so zarážkou. Z grafu jasne vidieť, že sekvenčné vyhľadávanie so zarážkou je omnoho rýchlejšie ako obyčajné sekvenčné vyhľadávanie.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/pon.png}
\caption{Porovnanie algoritmov sekvenčného vyhľadávania }
\label{pon}
\end{figure}


\begin{table}[H]
\centering
\begin{tabular}{|c||c|c|}

\hline
Počet prvkov & Čas $sekv1$ [$ms$] & Čas $sekv2$ [$ms$]	\\
\hline \hline
10000 & 2,4322 & 0,09578 \\ \hline
50000 & 11,1961 & 0,6739\\ \hline
100000& 19,4862 & 1,4184 \\ \hline
150000& 25,1359 & 2,3736 \\ \hline
200000& 50,3561 & 3,5608 \\ \hline

\end{tabular}
\caption{Tabuľka časov úspešných sekvenčných vyhľadávaní}
\label{pont}
\end{table}


\paragraph{Vyhľadávanie extrémov:}
V grafe na obrázku \ref{poex} je zobrazený graf vyhľadávania jedného extrému a graf vyhľadávania oboch extrémov súčasne. Z grafu aj z tabuľky \ref{poext} vyplýva, že vyhľadávanie jedného extrému je približne o tretinu rýchlejšie ako vyhľadávanie oboch extrémov súčasne. Aj keď je vyhľadávanie jedného extrému rýchlejšie, stále je lepšie použiť vyhľadávanie oboch extrémov súčasne.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/poex.png}
\caption{Porovnanie algoritmov pre vyhľadávanie maxima}
\label{poex}
\end{figure}

\begin{table}[H]
\centering
\begin{tabular}{|c||c|c|}

\hline
Počet prvkov & Čas $max$ [$ms$] & Čas $maxmin$ [$ms$]	\\
\hline \hline
10000 & 0,1422 & 0,2133 \\ \hline
50000 & 0,6857 & 1,0086\\ \hline
100000& 1,3795 & 2,0054 \\ \hline
150000& 2,0991 & 3,1652\\ \hline
200000& 2,7146 & 4,3156 \\ \hline

\end{tabular}
\caption{Tabuľka časov vyhľadávaní extrémov}
\label{poext}
\end{table}



\subsection{Usporiadané polia}

V grafe na obrázku \ref{pou} sú zobrazené grafy sekvenčného, binárneho a interpolačného vyhľadávania. Je jasne vidieť, že sekvenčné vyhľadávanie trvá neporovnateľne dlhšie ako binárne či interpolačné. Preto v ďalšom porovnávaní už sekvenčné vyhľadávanie nebude uvažované.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/pou.png}
\caption{Porovnanie algoritmov pre usporiadané polia}
\label{pou}
\end{figure}

\begin{table}[H]
\centering
\begin{tabular}{|c||c|c|c|}

\hline
Počet prvkov & Čas $sekv3$ [$ms$] & Čas $bin$ [$ms$] & Čas $int$ [$ms$] \\
\hline \hline
10000 & 3,1923  & 0,01132 & 0,01902\\ \hline
50000 & 11,7608 & 0,02219 & 0,02423\\ \hline
100000& 21,6531 & 0,02898 & 0,02649\\ \hline
150000& 39,7727 & 0,02944 & 0,02604\\ \hline
200000& 61,9833 & 0,02989 & 0,02672\\ \hline

\end{tabular}
\caption{Tabuľka časov sekvenčného, binárneho a interpolačného vyhľadávania}
\label{pout}
\end{table}


V ďalšom grafe na obrázku \ref{pbi} sú zobrazené už len časy úspešného binárneho a interpolačného vyhľadávania. Binárne vyhľadávanie dosahuje lepších časov do približne šesťdesiattisícprvkového poľa. Pri viacprvkovom poli čas potrebný na nájdenie prvku u binárneho vyhľadávania narastá, ale u interpolačného ostáva približne rovnaký. To súvisí s priebehom funkcie $log~log~n$, ktorá veľmi pomaly rastie, a funkciou $log~n$.

\begin{figure}[H]
\centering
\includegraphics[width=100mm]{obrazky/poubi.png}
\caption{Porovnanie binárneho a interpolačného vyhľadávania}
\label{pbi}
\end{figure}


Z výsledkov vyplýva, že najrýchlejší a teda aj najlepší algoritmus vyhľadávania pre neusporiadané pole je sekvenčné vyhľadávanie so zarážkou. Pre usporiadané pole to nie je také jednoznačné. Veľmi záleží na počte prvkov v poli. Ak máme pole prvkov do šesťdesiat tisíc tak výhodnejšie je použiť binárne vyhľadávanie. Pre väčšie polia vyšlo lepšie interpolačné vyhľadávanie, ktoré dosahovalo približne rovnaké časy hľadaní pri viac ako stotisícprvkovom poli a lepšie časy ako binárne už pri sedemdesiattisícovom poli.