ADT Tabulka
Základní druhy tabulek.
 Vytisknout studijní materiál

                Tabulky podle organizace

1. Tabulky s přímým přístupem

   k ® Ak je zobrazení prosté, každá položka v tabulce má své místo jednoznačně určené hodnotou Ak přímo odvozenou z k, tedy odpadá vyhledávání.

   Přímé adresování je vhodné není-li velikost│K│množiny klíčů K velká.

Příklad: tabulka odkazů na oddíly slovníku (A, B, C, . . . ) = veliká tabulka. Vhodné pro tabulky s malou množinou klíčů (startovní listina běžců malého závodu, ve které jsou údaje o závodníkovi, jeho čase..aj.)

   Tabulka je v tomto případě implementována pomocí pole velikosti k, jehož prvky budou obsahovat reference na prvky tabulky, respektive null nejsou-li využity.

   Klíče všech prvků dynamické množiny jsou různé a prvky jsou reprezentovány objekty třídy Prvek

class Prvek {

int klic;

String data;

     ...

Prvek(int klic, String data) {

    this.klic = klic;

    this.data = data;

}

}

   Rozhraní ADT tabulky s přímým adresováním bude tvořeno následujícími operacemi.

class Tabulka {

// rozhrani ADT

Tabulka()

Prvek hledej(int)

vloz(Prvek)

vyber(Prvek)

}

Tabulka bude reprezentována polem t velikosti │K│, jehož prvky budou obsahovat reference na prvky tabulky, resp. null nejsou-li využity.

class Tabulka {

Prvek[] t = new Prvek[K];

Tabulka() {

    for(int i = 0; i < t.length; i++) {

      t[i] = null;

}

}

   Implementace dalších operací je zřejmá:

Prvek hledej(int k) {

    return t[k];

}

void vloz (Prvek x) {

    t[x.klic] = x;

}

void vyber (Prvek x) {

    t[x.klic] = null;

}

   Všechny operace jsou rychlé, potřebný čas je O(1).

   Uvedený přístup je ilustrován na příkladu startujících se startovními čísly

1 až 365, přičemž startující s čísly 3,101 a 364 ke startu nenastoupili.

   Alternativní implementace by mohla namísto referencí na prvky dynamické množiny v poli implementujícím tabulku obsahovat přímo samotné prvky. Navíc, jsou-li prvky přímo v tabulce, známe jejich klíč na základě indexu a nemusíme klíč uchovávat v prvku samotném. Musíme ovšem být schopni poznat, že prvek pole je prázdný.

   Poznamenejme, že operace vloz a vyber nemají jako parametr klíč a data, resp. klíč, ale ukazatel na prvek množiny. Důvodem takové konstrukce může být existence prvků množiny před jejich organizací v tabulce. Příkladem může být pole všech přihlášených závodníků, ale do tabulky jejich umístnění a dosáhnutého výkonu vložíme jenom ty závodníky, kteří nastoupili a závod dokončili. Obdobně, byl-li některý závodník diskvalifikován, bude z tabulky výsledků vybrán.

2. Obyčejné vyhledávací tabulky

3. Tabulky s rozptýlenými položkami (hash-tables)

   k ® Ak se nazývá rozptylovací funkce, jsou na ni kladeny speciální požadavky, které již byly vysvětleny v předešlé kapitole.

   Množina A, prvků identifikovaných klíčem, je daleko menší než množina všech hodnot klíče A << K. Velikost tabulky je tedy také << K. V tabulce budou nyní prvky množiny identifikované svým klíčem zpřístupňovány pomocí indexu s hodnotami 0 až m-1. Potřebujeme tedy hodnotu klíče prvku transformovat na hodnotu indexu, musíme tedy definovat Hash - funkci:

   h: K ® {0,1, ... , m-1}

, kterou budeme nazývat také rozptylovací funkcí.

   Nevyhnutelně tedy musí nastat, že rozptylová funkce zobrazí obecně dva a více různých klíčů na stejný index. Tento jev nazýváme kolizí.

   V ideálním případě, kdy je rozptylová funkce dostatečně náhodná, budou za předpokladu, že m > A, budou všechny klíče aktuální množiny prvků zobrazeny na různé hodnoty indexu.. Naopak v nejhorším případě se klíče všech prvků aktuální množiny zobrazí na jeden index.

   Obecně nemůžeme kolize vyloučit.

   V zásadě existují dvě možnost ipři postupu, kdy vkládám do tabulky a pa pozice v tabulce je již obsazena. Prví je vnější řetězení prvků, kterých klíče rozptylová funkce zobrazí na stejnou hodnotu. Druhou je otevřené adresování, kdy v případě kolize je prvek množiny systematicky uložen a následně hledán v tabulce. V tomto případě ale musí být m > A. V pvním případě přichází doo úvahy všechny možnosti tj M < A, m = A a M > A.

4. Tabulky se zřetězenými položkami

-viz.dále

Na základě organizace tabulky provádíme vyhledávání prvku

   Kllíčům přiřadíme číselné hodnoty (převedeme do vysoké číselné soustavy) - tzv. transformace klíče (pro zrychlení porovnání)

Př. : Novák ® 345.

   Kromě primárního klíče máme také možnost hledat podle klíče sekundárního.

   Vyhledávání prvku v tabulce s přímým přístupem bude probráno v další kapitole.