Základy algoritmizace. Hašování

Podobné dokumenty
Úvod. Úvod do programování. Úvod. Hashovací tabulky

Datové struktury 2: Rozptylovací tabulky

Hašování. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

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

Návrh designu: Radek Mařík

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

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

Hašování (Vyhledávání metodou transformace klíče)

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávací algoritmy

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

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

Tabulka. Často jde nejenom o dynamickou množinu, ale i statickou množinu. Matematické tabulky statická množina

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

POZOR klíč NENÍ index (adresa), ale podle klíče se hodnoty ukládají na indexy (adresy).

Lineární datové struktury

HASHING GENERAL Hashovací (=rozptylovací) funkce

Abstraktní datové typy

Rozptylovací tabulky

Tabulka. Datová struktura, která umožňuje vkládat a později vybírat informace podle identifikačního klíče. Mohou být:

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

5 Rekurze a zásobník. Rekurzivní volání metody

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

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Algoritmizace a programování

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Algoritmizace prostorových úloh

TÉMATICKÝ OKRUH TZD, DIS a TIS

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

Kolekce, cyklus foreach

Základní datové struktury

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

Programování v C++, 2. cvičení

Základy algoritmizace a programování

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Algoritmizace prostorových úloh

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

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

HASHING GENERAL Hashovací (=rozptylovací) funkce

Základy algoritmizace. Pattern matching

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Stromy, haldy, prioritní fronty

Úvod do programování - Java. Cvičení č.4

Dynamické datové struktury IV.

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Algoritmy a datové struktury

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Topics. Vyhledávání, zejména rozptylování. Slovník - Dictionary. Vyhledávání. Rozptylování - Hashing. Rozptylování - Hashing

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Základní datové struktury III: Stromy, haldy

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

ADT/ADS = abstraktní datové typy / struktury

Třídění a vyhledávání Searching and sorting

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Generování pseudonáhodných. Ing. Michal Dorda, Ph.D.

Abstraktní datové typy FRONTA

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

5. přednáška - Rozklad problému na podproblémy

Dynamické datové struktury III.

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Jazyk C# a platforma.net

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

0.1 Úvod do lineární algebry

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Testování prvočíselnosti

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Lineární datové struktury

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

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

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Abstraktní datové typy II.

Vzdálenost uzlů v neorientovaném grafu

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

68. ročník Matematické olympiády 2018/2019

Konstruktory a destruktory

5 Přehled operátorů, příkazy, přetypování

NPRG030 Programování I, 2018/19 1 / :03:07

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Časová složitost algoritmů

Poslední nenulová číslice faktoriálu

TGH07 - Chytré stromové datové struktury

Rozklad problému na podproblémy

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Transkript:

Základy algoritmizace Hašování

Problematika hašování Hašování - nástroj na jednoduchý způsob "zakódování vstupních dat. Vstupní data jsou zpracována hašovací funkcí jsou jistým způsobem komprimována. Relativně malý výstup, který vystihuje podstatu zpracovaných dat.

Použití hašování Použití - hašovací tabulky (abstraktní datová struktura) - komunikační a bezpečnostní protokoly - zpětné rychlé vyhledávání z velkého množství uložených dat - signatury

Definice hashování Mějme nějakou množinu U, nazýváme jí univerzum. Prvky z toho univerza nazváme klíče. Hašovací funkce h(k):u (0,...,m), kde m N je rozsah klíčů U > m => některé dva prvky se nutně musí hašovat na stejnou hodnotu - kolize.

ADT - tabulka jeprázdná(t) - vrací boolean (pravda v případě, že tabulka T neobsahuje žádný prvek vlož(t, p) - výsledkem je tabulka T rozšířená o prvek p vyber(t, k) - výsledkem operace je tabulka T, u které v případě, že obsahovala prvek p s klíčem k je tento prvek zrušen, jinak zůstává nezměněna, jevtabulce(t, k) - vrací boolean (pravda v případě, že tabulka T obsahuje prvek p s klíčem k, jinak nepravda)

Princip hašování Pojmem hash-funkce h budeme rozumět aritmetickou transformaci vstupních dat k (klíčů) do tvaru h(k), kterému budeme říkat hash hodnota. Hlavním účelem hashovací funkce je transformace klíčů univerza U do pozic (slotů) hashovací tabulky. Zmenší se nároky na paměť - pro původních U klíčů stačí udržovat jen m hodnot.

Princip hašovacích tabulek Hashovací funkce h zobrazuje univerzum klíčů U na sloty hašovací tabulky T[0,..., m-1] h: U {0,1,,m-1} Říkáme, že prvek s klíčem k je hašován do slotu h(k) nebo také, že h(k) je hašovací hodnota klíče k. Většinou zobrazujeme pouze S U.

Hašování U - univerzum k x k x k x k 1 k 4 h(k 1 ) h(k 3 ) = h(k 4 ) kolize! S U k 3 k 2 h(k 2 ) k x S - počet hashovaných klíčů

Řešení kolizí snaha volit hašovací funkci tak, aby docházelo k minimálnímu počtu kolizí dále tedy předpokládejme hašovací funkci ve tvaru h(k)= k mod m, kde m je prvočíslo dva základní způsoby řešení kolizí - separátní řetězení - otevřená adresace

Volba hash funkce (metoda dělení) h(k) = k mod m nevhodné hodnoty m: mocniny 2, mocniny 10 vhodné hodnoty m : prvočísla vzdálená od mocnin 2 Příklad: m=701 h(k) = k mod 701

Separátní řetězení (Separate Chaining) Klíče, které hashují na stejný index, jsou uloženy v seznamu. Problém kolizí se převádí na práci se seznamem.

Separátní řetězení h(k) = k mod m kde m = 11 h() = mod 11 = 6 0 1 2 3 4 5 6 7 8 9 10

Separátní řetězení h(k) = k mod m Kde m = 11 79 h(79) = 79 mod 11 = 2 0 1 2 3 4 5 6 7 8 9 10 79

Separátní řetězení h(k) = k mod m kde m = 11, 79 69 h(69) = 69 mod 11 = 3 0 1 2 3 4 5 6 7 8 9 10 79 69

Separátní řetězení 0 h(k) = k mod m kde m = 11 1 2 3 79 69, 79, 69 72 h(72) = 72 mod 11 = 6 kolize 4 5 6 7 72 8 9 10

Separátní řetězení 0 h(k) = k mod m kde m = 11, 79, 69, 72, 24, 14, 20, 33, 85, 52 h(24) = 2 h(14) = 3 h(20) = 9 h(33) = 0 h(85) = 8 h(52) = 4 1 2 3 4 5 6 7 8 9 10 79 69 24 72

Separátní řetězení 0 h(k) = k mod M kde M = 11, 79, 69, 72, 24, 14, 20, 33, 85, 52 h(24) = 2 h(14) = 3 h(20) = 9 h(33) = 0 h(85) = 8 h(52) = 4 1 2 3 4 5 6 7 8 9 10 33 79 69 52 85 20 24 14 72

Separátní řetězení void Insert(Item item) { Table[h(item.key)].InsertToList(item); } bool Search(Key k) { return Table[h(k)].SearchInList(k); } void Delete(Item item) { Table[h(item.key)].DeleteFromList(item); }

Separátní řetězení Nechť je dána hashovací tabulka T s m sloty, ve které je uloženo n prvků. Číslo, kde = n/m se nazývá faktor naplnění hašovací tabulky, udává zároveň i průměrnou délku seznamu ve slotu. Efektivita pro nejhorší případ: všech n klíčů se hashuje do jednoho slotu a vytváří tak seznam délky n. Složitost pro nejhorší případ je tedy O(n) plus čas nutný pro výpočet hašovací funkce. V průměrném případě pro vyhledání potřebujeme O(1).

Otevřená adresace Předpokládejme, že m>n, jinými slovy, tabulka je větší než potřebujeme. Klíče můžeme uložit tabulce na prázdná místa a vyřešit tak kolize. Pro tento případ se používají metody otevřené adresace. - lineární pokusy (Linear Probing) - dvojité hašování (Double Hashing)

Lineární pokusy Při vzniku kolize procházíme následující prvky tabulky a prvek umístíme do prvního volného místa. Dochází zde ovšem ke zhlukování prvků s klíči, které se hašují na stejný index. Rozšířená hašovací funkce h(k, i):uxn (0,...,m), kde i N je číslo pokusu

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11 h() = mod 11 = 6 0 1 2 3 4 5 6 7 8 9 10

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11 79 h(79) = 79 mod 11 = 2 0 1 2 3 4 5 6 7 8 9 10 79

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11, 79 69 h(69) = 69 mod 11 = 3 0 1 2 3 4 5 6 7 8 9 10 79 69

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11, 79, 69 72 h(72) = 72 mod 11 = 6 zjistíme další slot kolize 0 1 2 3 4 5 6 7 8 9 10 79 69 72

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11, 79, 69, 72 24 h(24,0) = 24 mod 11 = 2 h(24,1) = 2 + 1 = 3 h(24,2) = 2 + 2 = 4 zjistíme další slot kolize 0 1 2 3 4 5 6 7 8 9 10 79 69 24 72

Lineární pokusy h(k) = k mod m h(k,i) = (h (k) + i) mod m kde m = 11, 79, 69, 72, 24, 14, 20, 33, 85, 52 h(14) = 3 h(20) = 9 h(33) = 0 h(85) = 8 h(52) = 4 0 1 2 3 4 5 6 7 8 9 10 33 79 69 24 14 72 85 20 52

Lineární pokusy void HashInsert(Item item) { int j, i = 0; do { j = h(item.key, i); if (T[j] == null) {// nalezen volný slot T[j] = item; return; } // if else i += 1; } while (i < m); error "overflow" } // určení dalšího pokusu

Lineární pokusy bool HashSearch(Key k) { int j, i = 0; do { j = h(k, i); // určení dalšího pokusu if (T[j] == k) return true; i += 1; } while ((T[j]!= null) && (i!= m)); return false; }

Lineární pokusy Nejhorší případ nastane, když hodnota hašovací funkce je stejná pro všechny prvky. Potom je složitost vyhledání prvku v tabulce O(n). Průměrně jde o algoritmus se složitostí O(1).

Dvojité hašování Dvojité hashování je patrně nejlepší metodou při otevřeném adresování, protože permutace slotů poskytované touto metodou mají nejblíže k náhodně voleným permutacím. Dvojité hashování používá hashovací funkci tvaru: h(k,i) = (h1(k) + ih2(k)) mod m kde h1 a h2 jsou pomocné hashovací funkce.

Dvojité hašování Na počátku je testován slot T[h1(k)]. Další pokusy jsou určeny posunem o pozic modulo m. h2(k) Je tak umožněn větší rozptyl pro výběr sekvencí pokusů, protože na klíči k závisí nejen počáteční pozice, ale i velikost kroku, o který se v tabulce posunujeme.

Dvojité hašování Implementace algoritmu bude obdobná jako implementace lineárních pokusů s tím, že na rozdíl od metody lineárních pokusů se v případě kolize neposuneme o jeden prvek, ale vypočítáme posun takto: inc = m-2- (k mod (m-2))

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9) h() = mod 11 = 6 0 1 2 3 4 5 6 7 8 9 10

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9) 79 h(79) = 79 mod 11 = 2 0 1 2 3 4 5 6 7 8 9 10 79

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9), 79 69 h(69) = 69 mod 11 = 3 0 1 2 3 4 5 6 7 8 9 10 79 69

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9), 79, 69 72 h(72) = 72 mod 11 = 6 kolize zjistíme hodnotu inc pro obsazení dalšího slotu inc = 9 - (72 mod 9) = 9-0 = 9 0 1 2 3 4 5 6 7 8 9 10 79 69 72

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9), 79, 69, 72 24 h(24) = 24 mod 11 = 2 kolize zjistíme hodnotu inc pro obsazení dalšího slotu inc = 9 - (24 mod 9) = 9-6 = 3 0 1 2 3 4 5 6 7 8 9 10 79 69 72 24

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9), 79, 69, 72, 24, 14, 20, 33, 85, 52 h(14) = 3 h(20) = 9 h(33) = 0 h(85) = 8 h(52) = 4 inc(14) = 9-5 = 4 inc(52) = 9-7 = 2 0 1 2 3 4 5 6 7 8 9 10 33 79 69 72 24 14 85 20

Dvojité hašování h(k) = k mod M kde M = 11 inc = M-2- (k mod (M-2)) inc = 9 - (k mod 9), 79, 69, 72, 24, 14, 20, 33, 85, 52 h(14) = 3 h(20) = 9 h(33) = 0 h(85) = 8 h(52) = 4 inc(14) = 9-5 = 4 inc(52) = 9-7 = 2 0 1 2 3 4 5 6 7 8 9 10 33 79 69 72 24 14 85 20 52

Nejvyšší počty pokusů při neúspěšném vyhledavání jako funkce faktoru naplnění α

Nejvyšší počty pokusů při neúspěšném vyhledavání jako funkce faktoru naplnění α