Vyhledáváí v tabulkách Tabulkou azveme možiu položek idetifikovatelých hodotou přístupového (idetifikačího) klíče (key, ID idetificator). Ve vodorovém směru se jedá o heterogeí pole, tz. že každá položka je složea z ěkolika údajů, které mohou být růzých (datových) typů. Ve svislém směru se jedá o homogeí pole pole položek idetifikovatelých pomocí klíče. položka položka 2 položka klíč (ID) údaj údaj 2 údaj m Přístup do tabulky provádíme pomocí klíče a adále budeme dodržovat ásledující kovece ve začeí: k idetifikačí klíč, tj. klíč, kterým položku idetifikujeme A k adresí klíč, tj. adresa položky, kterou je ve většiě případů idex (pořadí) položky. Implemetace tabulky type T_klic = iteger; {apříklad} Polozka = record Klic : T_klic; Udaj : strig[délka]; Udaj2 : real ; ed; Tabulka = array [..] of Polozka Klíč může být jakéhokoliv datového typu (T_klic), obvykle se však používá celé číslo (iteger) ebo řetězec zaků (strig). Hledáí v tabulce Parametry hledáí v tabulce: S délka hledáí položky, tj. počet položek, které je uto zkoumat T průměrá délka hledáí defiovaá vztahem kde p je počet přístupů do tabulky T = p p S i i= - -
A průměrá délka prohledáváí za předpokladu rovoměrého přístupu A = S i i= kde je počet obsazeých položek tabulky P tzv. plěí tabulky (podíl obsazeých položek) defiovaé vtahem: P = a kde je počet obsazeých míst a a počet všech alokovaých míst tabulky Rozděleí tabulek Podle počtu položek můžeme tabulky rozdělit a: Pevě defiovaé tabulky (LUT Look Up Table) počet položek je kostatí Tabulky s proměým počtem položek počet položek je proměý Podle způsobu hledáí rozdělujeme tabulky a: Tabulky s uspořádaými položkami primárí klíč - klíč, podle kterého je tabulka uspořádáa. sekudárí klíč - všechy ostatí klíče Tabulky s euspořádaými položkami (i tabulky s rozptýleými položkami) Tabulky lze podle způsobu orgaizace rozdělit a: Tabulky s přímým přístupem k A k je prosté zobrazeí, každá položka v tabulce má své místo jedozačě určeé hodotou A k přímo odvozeou z k Příklad: Tabulka odkazů a oddíly slovíku (A, B, C, ) Obyčejé vyhledávací tabulky hledáme prostředictvím klíče, pokud ajdeme shodu, ašli jsme daou položku Tabulky s rozptýleými položkami (hash tables) k A k se azývá rozptylovací fukce, a kterou jsou kladey speciálí požadavky Tabulky s přímým přístupem Protože je k A k prosté zobrazeí, je S = T = A =. Většiou k = A k, proto eí třeba klíč uchovávat a uchováváme je data (údaje) tomu se říká degeerovaá tabulka Nevýhoda: velikost je dáa rozsahem klíče, v praxi je tedy často příliš velká. Navíc, pokud evyužijeme všechy klíče, jsou v tabulce evyužité díry, což je plýtváí pamětí - 2 -
Vyhledávací tabulky Vyhledáváí položky se provádí porováváím podle klíče. Pořadí položek může být defiovaé áhodé Strategie vyhledáváí Sekvečí Bereme postupě prvky v takovém pořadí, v jakém jsou v tabulce uložey, porováváme klíče s hledaou hodotou, a to tak dlouho, dokud eajdeme shodu. Platí: A = ( + ) 2 položky mohou být v tabulce uložey v libovolém pořadí Implemetace sekvečího vyhledáváí fuctio Sekveci(T:Tabulka;Hled_klic:T_klic):iteger; var i:iteger; begi i:=; while (i<=) ad (T[i].Klic<>Hled_klic) do i:=i+; if i<= the Sekveci:=i else Sekveci:=0 {Klíč ealeze} ed; Půleím (biárí, logaritmické) Lze použít, pokud je tabulka seřazeá podle klíče. Porováím klíče prvku v poloviě tabulky s hledaým rozhodeme, v které poloviě tabulky se hledaý prvek achází. V této poloviě pak opět zkusíme prvek uprostřed, atd. A log() Implemetace biárího vyhledáváí fuctio Biari(T:Tabulka;Hled_klic:T_klic):iteger; var i,k:iteger; begi k:=;i:=; while (K>0) ad (i<=) ad (T[i].klic<>Hled_klic) do begi k:=k div 2; if Hled_klic<T[i].klic the i:=i-k else i:=i+i ed; if (K>0)ad(I<=K) the Biari:=i else Biari:=0 ed; - 3 -
Pomocí Fiboacciho poslouposti Myšleka je stejá jako u biárího vyhledáváí, je zkoumaé prvky evolíme uprostřed, ale iterval dělíme v poměru Fiboacciho čísel Operačí složitost je také řádu log(), ale pro prvky a začátku tabulky je vyhledáváí rychlejší Pro efektiví hledáí se sažíme, aby měla tabulka F - položek, kde F je určité Fiboacciho číslo Fiboacciho čísla tvoří posloupost defiovaou ásledujícím rekuretím vztahem: F 0 = 0 F = F = F + F 2 N, 2 tedy posloupost tvoří čísla 0,,, 2, 3, 5, 8, 3, 2, 34, 55, Hledáí podle sekudárího klíče převádíme a hledáí podle primárího klíče implemetace ivertovaým souborem (idexový soubor) - jedá se ve skutečosti o tabulku seřazeou podle hledacího klíče, jejíž data jsou primárí klíč (ebo přímo idex v původí tabulce). V praxi je tato tabulka často degeerovaá a vyhledávací klíč se eudává, stačí, že je podle ěj ivertovaý soubor seřaze. primárí klíč data (sekudárí klíč) ivertovaý soubor Bláha Ja 945 935 Fiala Ja Bláha Josef 937 935 Fiala Marti Fiala Ja 935 937 Bláha Josef Fiala Marti 935 945 Bláha Ja Fiala Petr 956 948 Zubák Jiří Zubák Jiří 948 956 Fiala Petr implemetace ivertovaým sezamem - ivertovaý soubor realizovaý jako spojový sezam 935 Fiala Ja 935 Fiala Marti 937 Bláha Josef ebo 935 Fiala Ja Fiala Marti 937 Bláha Josef 945 Bláha Ja - 4 -
Víceásobý přístup Vyhledáváí v tabulce podle více klíčů (vícerozměré vyhledáváí) realizujeme víceásobým přístupem, apříklad hledáme postupě ejdříve podle příjmeí, pak podle jméa, atd. Kombiovaé Kombiace více postupů v jedom vyhledáváí. Výhoda: efektiví využití paměti až 00% plěí Nevýhoda: časově áročé vyhledáváí až lieárí operačí složitost Tabulky s rozptýleými položkami Používáme, pokud N (rozsah klíče) >> p (rozsah tabulky) Příklad: tabulka pro max. 000 zaměstaců idetikovatelých podle max. 0 velkých písme příjmeí N = 26 0 >> p = 000 Pro určeí pozice v tabulce, a kterou máme uložit položku s klíčem k, používáme rozptylovací fukci (hash-fukci), která klíči k jedozačě přiřazuje klíč A k : A k = h(k) Může se stát, že pro růzé položky k k 2 platí, že h(k ) = h(k 2 ) - vzikají tzv. syoymické položky a říkáme, že astává kolize Požadavky a rozptylovací fukci: Pro každé x je jedozačě defiovaá (a v přijatelém čase vyčíslitelá) Vytváří miimálí počet kolizí (miimum syoym) Pravděpodobostí rozděleí Ak = h(k) a itervalu 0, p- je rovoměré, je tedy výhodé použít pseudoáhodé fukce - radomizačí fukce Realizace h(x) - hash-fukci i = h(x) můžeme úspěšě realizovat apříklad ásledujícími způsoby: i je částí x i je částí výsledku operace ad x i je zbytkem po děleí rozsahem tabulky p i je zbytkem po děleí N, kde N je ejbližší meší prvočíslo (ež rozsah tabulky p) i je dá váhovým součtem částí x: i = i= kde a i jsou váhy jedotlivých částí x i klíče x r a i x i - 5 -
Příklad: h = ((2k + 00p + ) mod N) mod p kde p je rozsah tabulky a k je klíč Fuguje výborě pro tabulky s plěím meším ež 70% Operačí složitost vyhledáí: jedotková (f(n) ) až logaritmická (f(n) log N) - 6 -