\chapter{Problematika vyhľadávania}


%Jednorozmerné pole je štruktúrovaný údajový typ zložený z pevného počtu zložiek rovnakého typu, pričom každú zložku možno explicitne (presne) pomenovať pomocou indexu. Medzi zložkami a indexami existuje jednoznačné priradenie. Každý označuje jednu zložku. Indexy nadobúdajú hodnoty určitého typu, ktorý musí byť ordinálny. \cite{jedpol}

%Binárny strom je dátová štruktúra podobná stromu, v ktorej každý bod má maximálne dvoch potomkov a každý potomok bodu je rozdelený na pravý alebo ľavý. \cite{bintre} V ľavom podstrome ľubovoľného uzla sa nachádzajú iba prvky menšie ako v uzle a v pravom podstrome sa nachádzajú iba prvky väčšie ako v uzle. Každý podstrom je potom samostatným binárnym stromom. \cite{soltre} 

%Problém vyhľadávania je úzko spojený so spôsobom, akým sú data uložené. V praxi dnes existuje ve
Ľudstvo od počiatku svojej existencie sa snaží informácie zbierať a uchovávať. Jedny z najstarších zachovaných záznamov informácií sú napr. nápisy na pyramídach, či obrazy v jaskyniach, alebo literárne diela najstarších autorov z čias antiky. Snaha o sprístupnenie zaznamenaných informácií viedla od kamenných tabuliek či vytesaných nápisov na architektonických dielach cez opisovanie údajov na papyrusoch a ručne písaných kníh až po v súčasnosti najrozšírenejší spôsob zdieľania informácií v digitálnej forme na Internete. So zberom a distribúciou informácií úzko súvisela a stále súvisí problematika vyhľadávania informácií. Jednoduché metódy katalogizácie informácií sú v súčasnosti nahrádzané sofistikovanými metódami vyhľadávania za pomoci výkonných počítačových systémov. Adekvátne k druhu činnosti a druhu zbieraných informácií boli vyvinuté príslušné dátové štruktúry a samozrejme aj algoritmy ako v týchto dátových štruktúrach vyhľadávať.

\section{Jednorozmerné polia}

Jednorozmerné pole je jednou z najjednoduchších a najzákladnejších dátových štruktúr. Skladá sa z pevného počtu prvkov rovnakého typu, pričom každý prvok možno presne identifikovať podľa indexu. Každý index môže byť len ordinálneho typu a označuje práve jeden prvok. %Veľkosť poľa určuje interval indexov.
Vyhľadávanie v poli je realizované tak, že v cykle sa pomocou indexov pristupuje k jednotlivým prvkom, ktoré sú porovnávané s hľadaným prvkom. Výhodu, že sa dá pristupovať ku každému prvku priamo pomocou indexu, sa dá využiť v usporiadanom poli (tab. \ref{poleu}). Na usporiadané pole sa dajú aplikovať rôzne algoritmy, ktoré nemusia porovnávať každý prvok, ale len nejakú časť na nájdenie hľadaného prvku. Nevýhodou je udržiavanie usporiadanosti poľa. Ak máme miliónprvkové usporiadané pole a chceme do stredu vložiť nový prvok, tak musíme všetky prvky napravo od vkladaného posunúť o jednu pozíciu. Bude to päťstotisíc posunutí, čo je dosť časovo náročná operácia. \cite{honzik, webolo}


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

\hline
Index prvku & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
Hodnota prvku & 2 & 3 & 5 & 8 & 11 & 12 & 15 & 20 & 21 \\
\hline

\end{tabular}
\caption{Usporiadané pole prvkov}
\label{poleu}
\end{table}


\section{Zreťazené zoznamy}

Zreťazený zoznam je údajový typ, ktorý sa skladá z jednotlivých záznamov. Tie obsahujú hodnotu prvku a smerník na nasledujúci záznam. Ak obsahujú iba jeden smerník a to na nasledujúci záznam, potom sa zoznamy skladajúce sa z takýchto záznamov nazývajú jednosmerne zreťazené (obr. \ref{jzz}). Ak obsahujú aj smerník na predchádzajúci záznam, nazývajú sa zoznamy obojsmerne zreťazené (obr. \ref{ozoz}). Algoritmy pre zoznamy sú podobné ako algoritmy pre polia. Ale pri prehľadávaní zoznamu sa nedá pristupovať k záznamom priamo pomocou indexu ako v poli, ale k nasledujúcemu záznamu alebo záznamu niekde uprostred zoznamu sa dá dostať len pomocou smerníka z predchádzajúceho záznamu. Niekedy môže posledný záznam obsahovať smerník na prvý záznam. Pri obojsmerne zreťazenom zozname potom aj prvý záznam môže obsahovať smerník na posledný. Takéto zoznamy sú potom nazývané zoznamy zreťazené dokola (obr. \ref{czoz}). Výhodou zreťazeného zoznamu je jednoduché vkladanie prvku. Pri jednosmernom zozname stačí zmeniť jeden smerník prípadne pri obojsmerne zreťazenom zozname dva smerníky. \cite{webolo}

\begin{figure}[H]%
\centering
\includegraphics[width=100mm]{obrazky/jzoz.png}%
\caption{Jednosmerne zreťazený zoznam}%
\label{jzz}%
\end{figure}

\begin{figure}[H]%
\centering
\includegraphics[width=100mm]{obrazky/ozoz.png}%
\caption{Obojsmerne zreťazený zoznam}%
\label{ozoz}%
\end{figure}

\begin{figure}[H]%
\centering
\includegraphics[width=100mm]{obrazky/czoz.png}%
\caption{Zoznam zreťazený dokola}%
\label{czoz}%
\end{figure}


\section{Binárne stromy}

Binárny strom (obr. \ref{bist}) je dátová štruktúra podobná stromu, v ktorej každý uzol má maximálne dvoch potomkov a každý potomok uzla môže byť rozdelený na pravý alebo ľavý. \cite{bintre} V ľavom podstrome ľubovoľného uzla sa nachádzajú iba prvky menšie ako v uzle a v pravom podstrome sa nachádzajú iba prvky väčšie ako v uzle. Každý podstrom je potom samostatným binárnym stromom. \cite{soltre} 


\begin{figure}[H]
\centering
\begin{tikzpicture}[level distance=1.5cm,
  level 1/.style={sibling distance=3cm},
  level 2/.style={sibling distance=1.5cm}]
    \tikzstyle{every node}=[circle,draw]
    \node {4}
        child { node {2} 
        		child { node {0} }
            child { node {3} }
            	}
        child { node {8}
            child { node {5} }
            child { node {9} }
        }
        
    ;
\end{tikzpicture}
\caption{Binárny strom}
\label{bist}
\end{figure}

Výhodou binárneho stromu je podobne ako u zreťazených zoznamov jednoduché pridávanie prvkov a veľmi rýchle vyhľadávanie. Problém nastáva len pri vkladaní dát. Ak sú nevhodné dáta vkladané, môže vzniknúť nevyvážený strom, kde vyhľadávanie trvá rovnako dlho ako pri vyhľadávaní v zreťazenom zozname. Na obrázku \ref{dbist} je zobrazený nevyvážený binárny strom. Ak ukladáme len celé čísla, nie je možné medzi jednotlivé uzly už nič vložiť a dostávame štruktúru podobnú zreťazenému zoznamu. \cite{soltre, webbst, webbs2, webolo}

\begin{figure}[H]
\centering
\begin{tikzpicture}[level distance=1.5cm,
 % level 1/.style={sibling distance=3cm},
 % level 2/.style={sibling distance=1.5cm}
 ]
    \tikzstyle{every node}=[circle,draw]
    \node {1}
        child { node[right=0.5cm] {2} 
        		child { node [right=0.5cm]{3} }
             	}      
    ;
\end{tikzpicture}
\caption{Nevyvážený binárny strom}
\label{dbist}
\end{figure}


\section{Hashovanie}

%V algoritmoch prehľadávajúcich pole sa riešilo ako urýchliť vyhľadávanie
Vyhľadávacie algoritmy polí sa dajú urýchliť ak poznáme nejaké vlastnosti uložených dát. Napríklad keď je treba vyhľadávať prvok v usporiadanom poli, nie je nutné ho prehľadávat postupne prvok po prvku, ale je možné aplikovať binárny vyhľadávací algoritmus. U hashovania je snaha vytvoriť dátovú štruktúru tak, aby sa dal akýkoľvek prvok nájsť jedným porovnaním.

Hashová tabuľka je štruktúra podobná jednorozmernému poľu. Dáta sú do nej ukladané takým spôsobom, aby ich bolo ľahké nájsť neskôr. Jednotlivé pozície v tabuľke môžu byť označné číslami $1$, $2$, $3$ atď. Na začiatku je tabuľka prázdna. Jednoduchá hashovacia tabuľka s desiatimi pozíciami je zobrazená v tabuľke \ref{hash}. Dáta sa do nej neukladajú za sebou ako v jednorozmernom poli ale ich pozícia sa vypočítava hashovacou funkciou.
%Keď chceme do nej uložiť dáta, je potrebné pomocou hashovacej funkcie vypočítať pozíciu, kam ich do tabuľky uložiť. Tabuľka \ref{hash} zobrazuje jednoduchú desaťprvkovú hashovú tabuľku. 

\begin{table}[H]
\centering
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|}
\hline
1  & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \hline
90 & 2 &   & 5 & 16&   &   &   & 7 &   \\ \hline
\end{tabular}
\caption{Hashová tabuľka}
\label{hash}
\end{table}

V hashovacej tabuľke sa vyhľadáva rovnakým spôsobom, akým sa do nej ukladajú dáta. Pomocou hashovacej funkcie sa vypočíta pozícia prvku. Potom je hľadaný prvok porovnaný s prvkom na vypočítanej pozícii. V prípade zhody je prvok v tabuľke nájdený a v prípade, že je pozícia prázdna, prvok sa v tabuľke s istotou nenachádza. \cite{webhas}