|
Faginovo hašování (Rozšiřitelné hašování - Extendible hashing)aneb něco z organizace a zpracování dat I. Tento algoritmus má sloužit k efektivnímu přístupu k velkému množství dat, která se najedou nevejdou do paměti. Máme hašovací funkci H, která každý klíč K převede na řetězec R+1 bitů. Přičemž tato hašovací funkce musí rovnoměrně rozmisťovat své hodnoty i pro neznámý definiční obor klíčů. Schéma obsahuje pomocnou strukturu - adresář -, což je pole ukazatelů do primárního souboru. Toto pole je přibližně tak velké jako předpokládaný počet stránek (do každé stránky se vejde b záznamů). Velikost adresáře je 2^D. D je parametr a s přidáváním nových záznamů postupně narůstá. Vyhledávání záznamuPokud vyhledávámě nějaký záznam, tak vezmeme jeho klíč K a vypočteme jeho hašovanou hodnotu H (K). Vezmeme jejích D prvních bitů, které budou tvořit index do adresáře. Například pokud D = 3 a hašovaná hodnota vyjde 10111001 (R = 7), index do adresáře je 5 (tedy šestá položka od začátku, protože se indexuje od nuly). Záznam s daným klíčem se tedy musí nacházet ve stránce, jejíž adresu obsahuje šestá položka od začátku adresáře. Při zjišťování, zda se záznam nachází v dané stránce se může využít bitů hašovaného klíče, které se nepoužily při indexování do adresáře. Jako řešení kolizí se prý používá otevřené adresování (definuje se nějaká hašovací funkce H2 (k, i), kde i je počet nezdarů, přičemž H2 (k, 0) = H (k)). Když se záznam ve stránce nenajde, nenachází se v primárním souboru. Každá stránka si uchovává tzv. lokální hloubku D', což udává, v kolika prvních bitech se shodují haošvané hodnoty klíčů jejích záznamů. D' musí být menší nebo rovno D (hloubce adresáře). Navíc pokud je D' ostře menší než D, z adresáře na danou stránku vede více odkazů (přesně jich je 2^(D - D')). Příklad: Máme stránku s D' = 3 a adresář s D = 5. Dejme tomu, že jeden z odkazů na tuto stránku se v adresáři nachází pod indexem 11100. To znamená, že v dané stránce se nachází pouze záznamy, jejichž hašované hodnoty klíče mají stejne první tři bity - kokrétně 111. V ostatních bitech se hašované hodnoty klíčů mohou lišít. To znamená, že na danou stránku musí odkazovat i položky adresáře s indexy 11101, 11110 a 11111, protože také mají stejné první tři bity jako index 11100. Toto pozorování vede k zajímavému důsledku, že pokud na nějakou stránku odkazuje více položek adresáře, jsou tyto položky umístěny za sebou. Vkládání nového záznamuZpočátku postupujeme velmi podobně jako v případě vyhledávání určitého záznamu. Zahašujeme klíč a pohledem do adresáře zjistíme, do jaké stránky nový záznam patří. Pokud vkládaný záznam již existuje, operace vkládání selže. V opačném případě vložení nic nebrání. Celý algoritmus se může rozvětvit do několika případů:
Upozornění: Při vkládání je třeba zachovávat konzistenci. Proto po štěpení stránky a přerozdělení původních záznamů musíme upravit adresář, a až poté se znovu pokusit vložit nový záznam. Adresář vždy musí být konzistentní s primárním souborem (představte si, že může v libovolném okamžiku vypadnout proud a náš server nikdo nezajistil UPSkou. Předpokládá se ale, že jednotlivé operace zápisu stránek na disk jsou atomické, stejně tak úprava položek adresáře). To znamená, že i při štěpení stránek musíme postupovat velmi opatrně:
Takže jsem postup při vkládání nového záznamu popsal sice obecně správně, ale špatně z pohledu zachovávání konzistence indexu. Při štěpení vytváříme dvě nové stránky, do kterých přerozdělujeme záznamy ze stránky původní, kterou však NERUŠÍME, dokud neupravíme index. Toto upozornění je jen moje pozorování. Může existovat jednodušší způsob, nebo to celé nemusí být pravda... Tím myslím use it on your own risk. |
Pomoci se dostane každému, kdo o ni požádá. |