Algoritmizace Hashing II. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Podobné dokumenty
HASHING GENERAL Hashovací (=rozptylovací) funkce

Návrh designu: Radek Mařík

HASHING GENERAL Hashovací (=rozptylovací) funkce

Datové struktury 2: Rozptylovací tabulky

Úvod. Úvod do programování. Úvod. Hashovací tabulky

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Vyhledávání, zejména rozptylování

Základy algoritmizace. Hašování

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

a) b) c) Radek Mařík

Hashovací funkce. Andrew Kozlík KA MFF UK

Maturitní otázky z předmětu PROGRAMOVÁNÍ

ALS1 Přednáška 1. Pravěpodobnost, náhodná proměnná, očekávaná hodnota náhodné proměnné, harmonická čísla

TGH07 - Chytré stromové datové struktury

Univerzita Karlova v Praze. Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE. Operace DELETE

Datové struktury. ztexali a doplnili Martin Vidner <mvidner@atlas.cz> Vladimír Kotal <vlada@devnull.cz> Universita Karlova

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

vyhledávací stromové struktury

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Automatická segmentace slov s pomocí nástroje Affisix. Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Trénování sítě pomocí učení s učitelem

Elegantní algoritmus pro konstrukci sufixových polí

Maturitní téma: Programovací jazyk JAVA

Abstraktní datové typy FRONTA

Organizace a zpracování dat I

Distribuované systémy a výpočty

Návrh Designu: Radek Mařík

Algoritmy II. Otázky k průběžnému testu znalostí

Potřebovali bychom tedy umět do heše přidávat nové hodnoty, najít hodnotu pro

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Kapitola 10: Diskové a souborové struktury. Klasifikace fyzických médií. Fyzická média

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Synchronizace číselníků

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Algoritmizace prostorových úloh

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Excel 2007 praktická práce

Databázové systémy. Cvičení 6: SQL

13. cvičení z PSI ledna 2017

Dynamické datové struktury III.

Algoritmizace a programování

6. Formátování: Formátování odstavce

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ

Algoritmy I. Číselné soustavy přečíst!!! ALGI 2018/19

HELIOS - Zálohování BüroKomplet, s.r.o.

Microsoft Office. Word hromadná korespondence

Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018

Algoritmy komprese dat

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

TGH07 - Chytré stromové datové struktury

George J. Klir Vilem Vychodil (Palacky University, Olomouc) State University of New York (SUNY) Binghamton, New York 13902, USA

Úvod do teorie informace

Hromadná korespondence

Průvodce nastavením VoIP u telefonní ústředny OMEGA

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Aplikace. vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin

Kvantové algoritmy a bezpečnost. Václav Potoček

Pravděpodobnost v závislosti na proměnné x je zde modelován pomocí logistického modelu. exp x. x x x. log 1

Testování prvočíselnosti

Simulační modely. Kdy použít simulaci?

Systém adresace paměti

Normální (Gaussovo) rozdělení

Algoritmy I, složitost

1. Průběh funkce. 1. Nejjednodušší řešení

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Rozptylovací tabulky

Kombinatorická minimalizace

Databáze I. 5. přednáška. Helena Palovská

Ing. Igor Kopetschke TUL, NTI

Reliance 3 design OBSAH

Andrew Kozlík KA MFF UK

Odhad parametrů N(µ, σ 2 )

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Da D to t v o é v ty t py IB111: Datové typy

Teorie informace II: obtížnější řešené příklady 2014 Tomáš Kroupa

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

Obsah, oddíly, záhlaví a zápatí, číslování stránek Word egon. Obsah dokumentu, oddíly, záhlaví a zápatí, číslování

Václav Jirchář, ZTGB

Lineární spojový seznam (úvod do dynamických datových struktur)

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Přednáška. Systémy souborů. FAT, NTFS, UFS, ZFS. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.

1. Přednáška. Ing. Miroslav Šulai, MBA

Složitosti základních operací B + stromu

Semestrální práce 2 znakový strom

Návod na používání Digitálního povodňového plánu povodňové komise

Zobrazení zdrojových dat u krabicového grafu

4. Kombinatorika a matice

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Úvod do informatiky. Miroslav Kolařík. Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008.

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Transkript:

Hashing II Jiří Vyskočil, Marko Genyg-Berezovskyj 010

Srůstající hashování (coalesced hashing) Znám předem počet prvků (odhad) Z důvodů efektivity nechci ukazatele (mezi prvky). Na jednu pozici tabulky připadne právě jeden ukazatel. => kolizní prvky (synonyma) se musejí nějak ukládat přímo do hashovací tabulky. Ukazatele v tabulce umožňují procházet pouze prvky jedné skupiny. Nedochází zde k tak velkému propojování do clusterů jako v případě otevřeného hashování. Dochází zde pouze k tzv. srůstání. standardní srůstající hashování LISCH (late insert standard coalesced hashing) EISCH (early insert standard coalesced hashing) srůstající hashování s pomocnou pamětí LICH (late insert coalesced hashing) EICH (early insert coalesced hashing) VICH (variable insert coalesced hashing) /18

Standardní srůstající hashování - LISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 4 Ukazatel na první volné místo od konce tabulky. Po každém přidání prvku ho je třeba aktualizovat. Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce na poslední místo. klíče ukazatele 3/18

Standardní srůstající hashování - LISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 4 1 Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce na poslední místo. klíče ukazatele 4/18

Standardní srůstající hashování - LISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 10 4 1 klíče ukazatele Zde vkládáme na volné místo Zde procházíme řetězec prvků. Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce na poslední místo. 5/18

Standardní srůstající hashování - LISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 15 3 10 4 1 Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce na poslední místo. Tabulka je zaplněna. 6/18

Standardní srůstající hashování - EISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 4 Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce za 1. místo. klíče ukazatele 7/18

Standardní srůstající hashování - EISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 4 1 Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce za 1. místo. klíče ukazatele 8/18

Standardní srůstající hashování - EISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 3 10 4 1 klíče ukazatele Zde vkládáme na volné místo Zde procházíme řetězec prvků. Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce za 1. místo. 9/18

Standardní srůstající hashování - EISCH h (k ) = k mod 5 posloupnost: 1, 5, 1, 10, 15 0 5 1 1 15 3 10 4 1 Postup: 1. i = h(k);. Prohledej řetězec začínající na místě i a pokud nenajdeš k, přidej ho do tabulky na první volné místo od konce tabulky a připoj ho do řetězce za 1. místo. Tabulka je zaplněna. 10 / 18

Standardní srůstající hashování LISCH, EISCH 11 / 18

Srůstající hashování s pomocnou pamětí Pro snížení srůstání a tedy zvýšení efektivity hashování se tabulka rozšiřuje o pomocnou paměť - tzv. sklep (cellar). Sklep je místo na konci tabulky, které není adresovatelné hashovací funkcí (má ale stejnou strukturu jako celá hashovací tabulka). Algoritmy LICH a EICH jsou analogické varianty algoritmů LISCH a EISCH s přidáním sklepa. Algoritmus VICH (variable insert coalesced hashing) připojuje prvek na konec řetězce, pokud řetězec končí ve sklepě, jinak na místo, kde řetězec opustil sklep. 1 / 18

Srůstající hashování s pomocnou pamětí 13 / 18

Srůstající hashování s pomocnou pamětí α faktor naplnění load factor α N/M β faktor adresování address factor β M/M K M M velikost sklepa N počet vložených prvků M počet míst v hashovací tabulce M počet míst adresovatelných hashovací funkcí Křivky představují optimální volbu β v závislosti na daném α při operaci FIND. Případy: SUCCESSFUL klíč je v tabulce UNSUCCESSFUL klíč není v tabulce 14 / 18

Celkové srovnání srůstajícího hashování S použitím sklepa vychází nejlépe VICH. Doporučená velikost β je 0,86. Bez sklepa vychází nejlépe EISCH. 15 / 18

Efektivita srůstajícího hashování Průměrný počet navštívených klíčů při operaci FIND. Vždy se předpokládá rovnoměrné rozložení klíčů po celém oboru hodnot hashovací funkce. Nemusí nutně odpovídat reálné situaci. 16 / 18

Dynamické hashování Inkrementální A. Při kritickém naplnění tabulky ji zvětšíme a přehashujeme. B. Při kritickém naplnění tabulky naalokujeme novou větší tabulku, do které začneme ukládat všechny nové prvky. Ve staré pouze vyhledáváme a rušíme prvky. Při každé operaci (ať už v nové nebo v staré tabulce) zrušíme jeden prvek ve staré tabulce a vložíme jej do nové tabulky. Po zrušení všech prvků ve staré tabulce tuto tabulku zrušíme. Toto opatření nám zajistí, že bude tabulka zrušena dříve než bude potřeba naalokovat další (tj. třetí) tabulku; a zároveň není potřeba provádět jednorázové přehashovávání jako v předchozím případě (takové přehashování může způsobit významné narušení plynulosti průběhu hashování). Rozšiřitelné (Extendable) 17 / 18

Extendable hashing Klíč se interpretuje jako binární číslo. Tabulka má adresář a záznamy. Adresář obsahuje odkazy do záznamů a záznamy obsahují klíče. Záznamy se rozlišují prvními několika bity (prefixy) možných klíčů, klíč je v záznamu se stejným prefixem. Adresář vždy obsahuje všechny možné prefixy, jichž je ^p, kde p je délka prefixu. Hodnota p se může měnit. 00011 00110 Záznam p= 00 00101 01 10 11 01100 01011 10011 11011 1 Lokální délka prefixu počet platných bitů prefixu v rámci záznamu. Šetří místo. Zde např. nemusíme vytvářet zvlášť záznam pro 10011 a zvlášť pro 11011. Lokální délka p. 18 / 18

globální délka prefixu počet platných bitů prefixu p = log (velikost tabulky) 00 01 10 11 adresa Extendable hashing 00011 00110 00101 01100 01011 10011 11011 1 záznam (velikost je zde 3) vlastní hashovací tabulka ukazatele na záznamy lokální délka prefixu počet platných bitů prefixu v rámci záznamu 19 / 18

Extendable hashing 00011 00110 00101 00 01 10 01100 01011 11 10011 1 11011 h(k 1 ) = 11100 Chceme přidat nový klíč k 1. Záznam kam patří je určen odkazem na řádku hashovací tabulky s adresou se stejným prefixem jakou má zahashovaná hodnota klíče h(k 1 ). 0 / 18

Extendable hashing 00011 00110 00101 00 01 10 01100 01011 11 10011 1 11011 11100 1 / 18

Extendable hashing 00011 00110 00101 00 01 10 01100 01011 11 10011 1 h(k ) = 11001 11011 11100 Chceme přidat nový klíč k, ale jeho záznam je již plný. V tomto případě stačí zvětšit hodnotu lokální délky prefixu tohoto záznamu o 1 (lokální délka prefixu musí být vždy globální délce prefixu), přidat úplně nový záznam se stejnou hodnotou prefixu do tabulky (tj. přepojit na něj první polovinu ukazatelů, které ukazovaly na původní plný záznam) a celý obsah starého plného záznamu přehashovat. Do nově vzniklého místa zahashujeme i nový klíč. / 18

Extendable hashing 00011 00110 00101 00 01 10 01100 01011 11 10011 11011 11100 11001 3 / 18

Extendable hashing 00011 h(k 3 ) = 00001 00110 00101 00 01 10 11 01100 01011 10011 11011 11100 Chceme přidat nový klíč k 3, ale jeho záznam je již plný a navíc již nemůžeme ani zvětšit hodnotu lokální délky prefixu. V tomto případě musíme o 1 zvětšit hodnotu globální délky prefixu a tím i zvětšit velikost hashovací tabulky na dvojnásobek. Ukazatele zduplikujeme podle hodnoty přechozího prefixu. Nyní můžeme aplikovat postup jako v předchozím případě. 11001 4 / 18

Extendable hashing 00011 3 00001 00110 3 3 000 001 010 01100 01011 00101 011 100 101 10011 110 111 11011 11100 11001 5 / 18

Univerzální hashování Každá hashovací funkce má slabá místa, kdy pro různé klíče dává stejnou adresu. Proto je výhodné přizpůsobit hashovací funkci právě zpracovávaným klíčum. Univerzální hashování Místo jedné hashovací funkce h(k) máme nějakou konečnou množinu H funkcí mapujících U do intervalu {0, 1,, m-1} Množina funkcí H je univerzální, pokud pro každou dvojici různých klíčů x,y U je počet hashovacích funkcí z množiny H, pro které h(x) = h(y), nejvýše H /m. Důsledek: Pravděpodobnost kolize při náhodném výběru funkce h(k) z množiny univerzálních hashovacích funkci H tedy není vyšší než pravděpodobnost kolize při náhodném a nezávislém výběru dvou stejných hodnot z intervalu {0, 1,, m-1} tedy 1/m. Při prvním spuštění programu jednu náhodně zvolíme. Funkci pak náhodně měníme jen v případě, že počet kolizí převyšuje přípustnou mez. V tomto případě je samozřejmě potřeba přehashovat celou tabulku. 6 / 18