You are on page 1of 3

Vyhľadávanie údajov v jednorozmernom poli

Každý informačný systém musí obsahovať možnosť vyhľadať údaje podľa zadanej
požiadavky. Dnes sa naučíme vyhľadávať údaje v jednorozmernom poli.

Troška teórie:
Lineárne vyhľadávanie údajov

Ak potrebujeme nájsť nejaký údaj v jednorozmernom poli, ktorého obsah nie je


usporiadaný, tak musíme prezerať postupne jednotlivé položky jednu za druhou
a porovnávať ich s hľadaným obsahom. Takémuto spôsobu vyhľadávania hovoríme lineárne.

Hľadanie hodnoty, ktorá je v premennej x v poli a, by sme to mohli robiť takto:


i:=1;
while (i<=n) and (x<>a[i]) do inc(i);
if i<=n then writeln(f,‘Hladany udaj bol najdeny na pozicii ‘,i)
else writeln(f,‘Hladany udaj sa nenasiel‘);

Binárne vyhľadávanie údajov

Princíp tohto vyhľadávania je nasledovný: rozdelíme si obsah poľa na polovicu


a pozrieme sa na obsah položky v strede poľa. Ak je rovný hľadanému, tak sme položku našli.
Ak je menší, tak hľadaná položka bude v druhej polovici poľa. Ak je väčší, tak hľadaná
položka bude v prvej polovici poľa. Takže v hľadaní pokračujeme už len vo vybranej polovici
poľa. Postupným zmenšovaním poľa buď hľadaný údaj nájdeme alebo nenájdeme, ale
v porovnaní s lineárnym vyhľadávaním nám to bude trvať aspoň o polovicu kratšie.
V Pascale, kde potrebujeme nájsť údaj v premennej x v poli a, by sme to mohli robiť
takto:
dh:=1;
hh:=n;
i:=1;
while (dh<=hh) and (x<>a[i]) do
begin
i:=(hh+dh) div 2;
if x<>a[i] then
begin
if x<a[i] then hh:=i-1 else dh:=i+1;
end;
end;
if x=a[i] then Label2.Caption:='Hladany udaj bol najdeny na pozicii '+IntToStr(i)
else Label2.Caption:='Hladany udaj sa nenasiel';
Zbierame skúsenosti:
1. Najprv si vytvor vstupný súbor s evidenciou pokút s týmto obsahom(v prvom riadku je
počet záznamov a v každom ďalšom riadku je výška pokuty):
10
25
46
18
12
38
52
35
29
16
28
2. Vytvor v Lazaruse aplikáciu, ktorá prečíta zo vstupného súboru najprv počet záznamov
a potom obsah jednotlivých záznamov zo vstupného súboru; z objektu Edit od
používateľa programu prečíta výšku pokuty a vypíše, v poradí aký údaj v súbore to je.
Vyskúšaj nasledujúci program pre tlačidlo:
procedure TForm1.Button1Click(Sender: TObject);
var f:textfile;
p:array[1..20] of integer;
i,n,x:integer;
begin
OpenDialog1.Execute;
AssignFile(f,OpenDialog1.FileName);
reset(f);
readln(f,n);
for i:=1 to n do readln(f,p[i]);
closefile(f);
x:=StrToInt(Edit1.Text);
i:=1;
while (i<=n) and (x<>p[i]) do inc(i);
if i<=n then Label2.Caption:=‘Nájdeny na pozícii '+IntToStr(i)
else Label2.Caption:='Hladany udaj sa nenašiel';
end;

Precvičujeme, čo sme sa naučili:


1. Priprav si vstupný súbor s údajmi a vytvor v Lazaruse aplikáciu, ktorá
prečíta z klávesnice údaj, ktorý potrebujeme nájsť. Predpokladáme, že údaje nie sú
usporiadané. Na obrazovku vypíše, či údaj našla. Ak ho nájde, tak vypíšte v poradí aký
údaj v súbore to je. Pokúste sa zapísať vysvetlený algoritmus sami, len v prípade
potreby sa oprite o poznámky.
2. Ako by sa dala vylepšiť predchádzajúca aplikácia, aby si prečítala obsah vstupného
súboru iba raz a potom by už len vyhľadávala požadované údaje po každom kliknutí
na tlačidlo. Realizuj!
3. Priprav si vstupný súbor s údajmi usporiadanými od najmenšej hodnoty po najväčšiu.
Vytvor v Lazaruse aplikáciu, ktorá prečíta z klávesnice údaj, ktorý potrebujeme nájsť
a na obrazovku vypíšte, či údaj našla. Ak áno, tak vypíšte, v poradí aký údaj v súbore
to je. Využite binárne vyhľadávanie údajov. Pokúste sa zapísať vysvetlený algoritmus
sami, len v prípade potreby sa oprite o poznámky.
4. Priprav si vstupný súbor s údajmi usporiadanými naopak od najväčšej hodnoty
po najmenšiu a uprav predchádzajúcu aplikáciu tak, aby aj v takto usporiadanom poli
vedela nájsť binárnym vyhľadávaním hľadaný údaj.
5. Ako by sa dala vylepšiť predchádzajúca aplikácia, aby si prečítala obsah vstupného
súboru iba raz a potom by už len vyhľadávala požadované údaje po každom kliknutí
na tlačidlo. Realizuj!

Zisti, či to už vieš:
1. Čo rozumieme pod pojmom vyhľadávanie?
2. Popíšte princíp lineárneho vyhľadávania.
3. Kedy je vhodné použiť lineárne vyhľadávanie?
4. Popíšte princíp binárneho vyhľadávania.
5. Kedy je vhodné použiť binárne vyhľadávanie?
6. Ktorý spôsob vyhľadávania je efektívnejší lineárne alebo binárne a prečo?

You might also like