Vyhledávací tabulka ------------------- Uložení dat a jejich efektivní vyhledání Datová složka + klíč (jednoduchý typ, řetězec) Klíč je jednoznačný v rámci dané struktury; datové složky se stejným klíčem = synonyma Co nejrychlejší přístup ke složkám -- záznamům Možnosti přístupů: - soubory: sekvenční přístup; usp. soubory: sekvenční přístup, půlení intervalu - lin. seznamy: sekvenční přístup; usp. seznamy: sekvenční přístup - stromy: stromový průchod; usp. stromy: stromové hledání - pole: sekvenční přístup; usp. pole: sekvenční přístup, indexace Vyhledávání v lineárních strukturách ------------------------------------ (pole P, N složek, rozměr pole může být M>=N) Sekvenční hledání: I:=1; while (I<=N) and (C<>P[I]) do inc(I); Nalezeno:=I<=N; Sekvenční hledání se zarážkou: I:=1; P[N+1]:=C; while C<>P[I] do inc(I); Nalezeno:=I<=N; Sekvenční hledání ve vzestupně uspořádaném poli: I:=1; while (I<=N) and (C>P[I]) do inc(I); Nalezeno:=(I<=N) and (C=P[I]); Půlení intervalu: rozmezí prvků pole se rozdělí na poloviny, u středového prvku provedeme porovnání s hledanou hodnotou, na základě testu pak stejným způsobem pracujeme s levou, nebo s pravou polovinou daného rozmezí. Konec neúspěšného hledání: rozmezí prvků je tvořeno jediným prvkem. Stromové hledání: bin. strom, uspořádání: ls<=onil) and (pom^.klic<>C) do if pom^.klicnil; ------------------------------------------------- Tabulka s rozptýlenými hesly ---------------------------- const Max=211; type TypKlic=longint; Indexy=1..Max; Data = record Klic: TypKlic; Udaje: pointer; end; UkClen=^Clen; Clen=record D: Data; N: UkClen; end; ZaklPole = array [Indexy] of UkClen; HashTable = ^ZaklPole; function Hash(K:TypKlic):Indexy; begin Hash:=K mod Max + 1; end; procedure Init(var H: HashTable); var I:Indexy; begin new(H); for I:=1 to Max do H^[I]:=nil; end; procedure HVloz(var H:HashTable; El: Data); var I:Indexy; Pom: UkClen; begin I:=Hash(El.Klic); new(pom); Pom^.D:=El; Pom^.N:=H^[I]; H^[I]:=Pom; end; function HHledej(H: HashTable; K: TypKlic): UkClen; var I: Indexy; Pom: UkClen; begin I:=Hash(K); Pom:=H^[I]; while (Pom<>nil) and (Pom^.D.Klic<>K) do Pom:=Pom^.N; HHledej:=Pom end;