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



Podobné dokumenty
Datové struktury 2: Rozptylovací tabulky

Základy algoritmizace. Hašování

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

Návrh designu: Radek Mařík

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

Informační systém evidence obyvatel

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

Účel zpracování osobních údajů: evidence fyzických osob z důvodu ověřených podpisů

Datové struktury. alg12 1

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty


ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

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

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Texty novelizovaných částí zákonů s vyznačením navrhovaných změn

Algoritmizace a programování

Výčtový typ strana 67

Více o konstruktorech a destruktorech

Prioritní fronta, halda (heap), řazení

Konstruktory a destruktory

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

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

Zpracování deklarací a přidělování paměti

Struktura programu v době běhu

Odbor správních a vnitřních věcí

Poslední nenulová číslice faktoriálu

Náhodné jevy. Teorie pravděpodobnosti. Náhodné jevy. Operace s náhodnými jevy

Parlament se usnesl na tomto zákoně České republiky:

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

Stavový model a Kalmanův filtr

Rozptylovací tabulky

Odbor správních a vnitřních věcí

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

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

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

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Programování v Javě I. Leden 2008

Úvod do programování 7. hodina

SBÍRKA ZÁKONŮ. Ročník 2012 ČESKÁ REPUBLIKA. Částka 52 Rozeslána dne 7. května 2012 Cena Kč 90, O B S A H :

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

14. přednáška. Přímka

4 kategorie subjektů údajů Občané hlášení k trvalému pobytu ve správním obvodu MČ Praha 8.

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

Modulární aritmetika, Malá Fermatova věta.

1. D Y N A M I C K É DAT O V É STRUKTUR Y

SBÍRKA ZÁKONŮ. Ročník 2009 ČESKÁ REPUBLIKA. Částka 68 Rozeslána dne 24. července 2009 Cena Kč 131, O B S A H :

Kapitola 11: Vektory a matice:

Algoritmizace prostorových úloh

Informační systém evidence obyvatel

PŘEDNÁŠKA 2 POSLOUPNOSTI

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

Zveřejnění zpracovávaných osobních údajů nepodléhajících oznamovací povinnosti

Matematika B101MA1, B101MA2

1. Náhodný vektor (X, Y ) má diskrétní rozdělení s pravděpodobnostní funkcí p, kde. p(x, y) = a(x + y + 1), x, y {0, 1, 2}.

Hashovací funkce. Andrew Kozlík KA MFF UK

Programování II. Návrh programu I 2018/19

Informace dle 18 odst. 2 zákona č. 101/2000 Sb., o ochraně osobních údajů a o změně některých zákonů, ve znění pozdějších předpisů

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

1 Vektorové prostory.

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

Programování v Javě I. Únor 2009

Semestrální práce 2 znakový strom

193/1999 Sb. ZÁKON. ze dne 29. července o státním občanství některých bývalých československých státních občanů

Normální (Gaussovo) rozdělení

Popis programu EnicomD

Odbor vnitřní správy

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

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru

6 Skalární součin. u v = (u 1 v 1 ) 2 +(u 2 v 2 ) 2 +(u 3 v 3 ) 2

Věta o dělení polynomů se zbytkem

Abstraktní datové typy: zásobník

Paměť počítače. alg2 1

M - Příprava na 1. zápočtový test - třída 3SA

Teoretické minimum z PJV

z = a bi. z + v = (a + bi) + (c + di) = (a + c) + (b + d)i. z v = (a + bi) (c + di) = (a c) + (b d)i. z v = (a + bi) (c + di) = (ac bd) + (bc + ad)i.

Dotazy tvorba nových polí (vypočítané pole)

Ing. Igor Kopetschke TUL, NTI

V souvislosti s nabytím účinnosti zákona č. 227/2009 Sb., kterým se mění některé zákony v souvislosti s přijetím zákona o základních registrech, jímž

Soustavy lineárních rovnic a determinanty

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

1 Nejkratší cesta grafem

ADT/ADS = abstraktní datové typy / struktury

227/2009 Sb. ZÁKON. ze dne 17. června 2009, kterým se mění některé zákony v souvislosti s přijetím zákona o základních registrech ČÁST PRVNÍ

vyjádřete ve tvaru lineární kombinace čtverců (lineární kombinace druhých mocnin). Rozhodněte o definitnosti kvadratické formy κ(x).

Pravděpodobnost a statistika

HASHING GENERAL Hashovací (=rozptylovací) funkce

Hromadná korespondence

1 Projekce a projektory

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Kapitola 11: Vektory a matice 1/19

Úvod do matematiky. Mgr. Radek Horenský, Ph.D. Důkazy

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

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

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

Pole a kolekce. v C#, Javě a C++

Transkript:

Tabulka Často jde nejenom o dynamickou množinu, ale i statickou množinu Matematické tabulky statická množina x cos x 0,0 1,000 0,1 0,995 0,2 0,980 0,3 0,955 0,4 0,921 0,5 0,878 0,6 0,825 0,7 0,765 0,8 0,697 0,9 0,622 1,0 0,540 1,1 0,454 1,2 0,362 1,3 0,267 1,4 0,170 1,5 0,071 1,6-0,029 1,7-0,129 1,8-0,227 1,9-0,323 (x, cos x) prvek tabulky x klíč

Startovní listina dynamická množina Startovní Příjmení číslo ADAM 1 DOLEJŠ 2 HESOUN 3 JANDÁK 4 ŠANTALA 5 ŠEFLOVÁ 6 ŠINDEL 7 ŠNAJDR 8 ŠONKA 9 ŠOTOLA 10 ŠTĚPÁN 11 TICHÝ 12 TICHÝ 13 ŤOUPALÍK 14 VÁPENÍK 15 VINTÍŘ 16 VYDRÁK 17 18 ZDVOŘILÝ 19 ŽEBRÁK 20 // závodník se startovním číslem 18 nenastoupil (příjmení,... jméno, věk, nejlepší výkon,... startovní číslo) - prvek startovní číslo - klíč

Jak se jmenuje závodník se startovním číslem 11? Implementace Spojový seznam - O(n) Seřazené pole podle klíče - O(log n) BVS - O(log n) Jde to rychleji? O(1)?

Prvek uložíme do prvku pole s indexem rovným klíči ukládaného prvku O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ADAM 1 DOLEJŠ 2 HESOUN 3 JANDÁK 4 ŠANTALA 5 ŠEFLOVÁ 6 ŠINDEL 7 ŠNAJDR 8 ŠONKA 9 ŠOTOLA 10 ŠTĚPÁN 11 TICHÝ 12 TICHÝ 13 ŤOUPALÍK 14 VÁPENÍK 15 VINTÍŘ 16 VYDRÁK 17 18 ZDVOŘILÝ 19 ŽEBRÁK 20

Tabulka s přímým adresováním O(1) - klíče všech prvků jsou různé - klíče prvků jsou z množiny K o velikosti K - každému klíči odpovídá prvek pole Prvek[] t t.length = K, v tabulce je místo pro každý klíč - množina klíčů aktuálně uložených prvků A K, A K Příklad: startující se startovními čísly 1 až 365, - K = {1,2,...,365}, K = 365 tabulka - t.length = K = 365 startující s čísly 3, 101 a 364 ke startu nenastoupili, - A = {1,2,4,...,363,365}, A = 362 t [ ] klíč další data K: všechny klíče 1 2 1 2 3 A: aktuální klíče 1 2 100 102 365 3 364 101 100 101 102 100 102 364 365 365

Implementace class Prvek { int klic; String data;... } Prvek(int klic, String data) { this.klic = klic; this.data = data; } class Tabulka { // rozhrani ADT Tabulka() Prvek hledej(int) vloz(prvek) vyber(prvek) }

class Tabulka { Prvek[] t = new Prvek[ K ]; } Tabulka() { for(int i = 0; i < t.length; i++) { t[i] = null; // prázdná tabulka } 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é, čas je O(1) - vhodné, není-li velikost K množiny všech klíčů K velká

Poznámky: Alternativní implementace by mohla namísto referencí na prvky dynamické množiny v poli implementujícím tabulku obsahovat přímo samotné prvky. Klíč prvků známe na základě indexu a nemusíme jej uchovávat v prvku samotném. Musíme ovšem být schopni poznat, že prvek pole je prázdný. Operace vloz a vyber mají jako parametr 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 nebude se nacházet v tabulce výsledků.

Zákon 133/2000 Informační systém evidence obyvatel 3 (1) Evidence obyvatel je vedena v informačním systému, jehož správcem 5) je ministerstvo. (2) V informačním systému se vedou o občanech tyto údaje: a) jméno, příjmení, případně jejich změna, rodné příjmení, b) datum narození, c) pohlaví a jeho změna, d) obec a okres narození a u občana, který se narodil v cizině, pouze stát narození, e) rodné číslo, f) státní občanství, g) adresa místa trvalého pobytu ( 10 odst. 1), včetně předchozích adres místa trvalého pobytu, h) počátek trvalého pobytu, popřípadě datum zrušení údaje o místu trvalého pobytu, i) zbavení nebo omezení způsobilosti k právním úkonům, j) zákaz pobytu a doba jeho trvání, k) rodné číslo otce, matky, popřípadě jiného zákonného zástupce, v případě, že jeden z rodičů nemá rodné číslo, vede se datum narození, l) rodinný stav, datum a místo jeho změny, m) rodné číslo manžela, nebo jméno a příjmení manžela, je-li manželem cizinec, který nemá přiděleno rodné číslo, n) rodné číslo dítěte, o) osvojení dítěte [ 7 písm. b)], p) záznam o poskytnutí údajů ( 8 odst. 6), r) datum, místo a okres úmrtí a u občana, který zemřel v cizině, pouze stát úmrtí. občan (údaje o něm) prvek v tabulce rodné číslo - klíč

13 (1) Rodné číslo je desetimístné číslo, které je dělitelné jedenácti beze zbytku.... Jaké má jméno občan s rodným číslem 9012150004? velikost množiny klíčů K = 10 10 / 11 = počet míst v tabulce (velikost pole t[] ) index v tabulce = rodné číslo / 11 velikost aktuální množiny občanů A 10 000 000 využití míst v tabulce občanů s přímým adresováním A / K = 1.1% - přímé adresování nevhodné, je-li množina klíčů K rozsáhlá

a může být hůř... Informační systém klientů banky BANKA ROK 2000 ROK 2006 Finanční skupina ČS 4 755 000 1) 5 277 000 KB 1 246 000 1 467 000 2) GE Money Bank 470 060 844 214 ebanka 30 700 119 800 HVB Bank 57 000 3) 111 000 Volksbank 16 588 35 716 Poznámky: 1) údaj za rok 2001, 2) údaj za rok 2005, 3) údaj za rok 2002 Zdroj: ČTK klient prvek v tabulce rodné číslo klíč uvažujme 100 000 klientů A = 100 000 využití míst v tabulce klientů s přímým adresováním A / K = 0.011%

Rozptylová (hash) tabulka Problém je-li A << K za přístup O(1 ) k prvkům (nalezení, vložení, vybrání) platíme nízkým využitím paměti A / K Řešení namísto volíme t.length = K t.length A využití paměti kolem 100% - označme m = t.length, indexy 0, 1,..., m-1, m A - neznáme hodnoty klíčů v A K, nejspíš nebudou 0, 1,..., m-1 - pro přístup O(1) musíme určit hodnotu indexu v tabulce t[] pro každý klíč k K : h: K {0,1,... m -1} h - rozptylovací funkce (hash function) h(k) - index klíče k v tabulce

K: všechny klíče 0 1 k u i = h(k) j = h(u) = h(v) v m - 1 K >> m m A << K rozptylová funkce může zobrazit alespoň dva různé klíče na stejný index - kolize pro u v a u,v K bude h(u) = h(v) ideálně všechny klíče prvků množiny A jsou zobrazeny na různé hodnoty indexů, musí být m A nejhorším případ všechny klíče množiny A prvků jsou zobrazeny na jeden index

Řešení kolize - vnější řetězení (separate chaining),... vytvoří se seznam prvků, jejichž klíče jsou zobrazeny na stejnou pozici v tabulce (index) K: všechny klíče t[] 0 1 klíč další data další prvek A: aktuální klíče v k u i j k v u m - 1 h(k) = j h(u) = h(v) = j

Implementace class Prvek { int klic; String data; Prvek dalsi; Prvek predch; //ulehčí výběr prvku } Prvek(int klic, String data) { this.klic = klic; this.data = data; } operace hledej, vloz, vyber jsou převedeny na operace nad seznamem s hlavičkou t[h(k)] Prvek hledej(int k) { hledej prvek s klíčem k v seznamu t[h(k)] } void vloz (Prvek x) { vlož prvek x na začátek seznamu t[h(x.klic)] } void vyber (Prvek x) { vyber prvek x ze seznamu t[h(x.klic)] }

Operace vložení prvku do tabulky je O(1). - prvek vkládáme na začátek odpovídajícího seznamu - výhodné pro aplikace s vnořenými strukturami {int identifikator1... {int identifikator2... }... } Operace odebrání prvku je O(1). Operace hledej vyžaduje analýzu kolik je prvků v seznamu před hledaným klíčem.

Analýza Vznik kolizí Pro A = 1, kolize nemůže vzniknout. Pro A m, - kolize nemusí vzniknout - všechny prvky mohou být vloženy na stejnou pozici v tabulce a vytvoří seznam délky A. Pro A >m, bude alespoň jeden seznam obsahovat více než jeden prvek a kolize musí nastat. Dirichletův princip (Johann Peter Gustav Lejeune Dirichlet, 1834): Pokud do m přihrádek umístíme n > m kuliček, alespoň v jedné přihrádce musí být více než jedna kulička. (Důkaz sporem.) Zkoumejme A m Jaká je pravděpodobnost vzniku kolize pro 1< A m? Předpoklad jednoduché rovnoměrné rozptylování Možnost umístnění libovolného prvku do ktérekoliv pozice v tabulce je stejná a nezávislá od umístnění ostatních prvků.

Narozeninový problém (Richard von Mises, 1939) Kolik lidí se musí nacházet v místnosti, aby ignorujíc 29. únor alespoň dva z nich měli narozeniny ve stejný den roku s pravděpodobností 50%. K rodná čísla A rodná čísla lidí v místnosti m = 365 h(rodné číslo) = den narození v roku (1 365) Q(n) - pravděpodobnost, že ve skupině n lidí žádní dva nemají narozeniny ve stejný den n=2, dva lidé nemají narozeniny ve stejný den, jsou-li narozeniny druhého z nich v jednom ze zbývajících 364 dnů Q(2) = 364/365 n=3, tři lidé mají narozeniny v různé dny, když dva mají narozeniny v různé dny a třetí má narozeniny v jednom ze zbývajících 363 dnů Q(3) = Q(2) * 363/365 = Q(2) * (365 2)/365... Q(n) = Q(n 1) * [365 (n 1)] / 365 364*363*...*[365 (n 1)] 365! Q(n) = = 365 n 1 365 n (365 n)!

Pravděpodobnost P(n), že ve skupině n lidí alespoň dva z nich mají narozeniny ve stejný den je 365! P(n) = 1 Q(n) = 1 365 n (365 n)! Pro jaké n je P(n) = 0.5? n P(n) 5 0.027 10 0.117 15 0.253 20 0.411 22 0.476 23 0.507 25 0.569 30 0.706 40 0.891 50 0.970 60 0.994

P(n) Narozeninový problém 1.000 0.900 75; 0.999720 0.800 0.700 0.600 0.500 0.400 23; 0.507 0.300 0.200 0.100 0.000 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 n n = 23 - pro velikost rozptylové tabulky m = 365, je 50% pravděpodobnost vzniku kolize již po vložení 23 prvků - to je 6,3% z počtu kdy kolize vzniknout musí, tj. 366 aktuálních prvků - kolize budou poměrně časté, i když velikost aktuální množiny prvků A bude o dost menší než velikost tabulky m Na zabránění kolizím, nemá význam volit velké m vzhledem k A.

Zkoumejme A > m - kolize musí vzniknout Jaký je průměrný počet vložených prvků, když už při každém dalším vložení vznikne kolize? - v každém seznamu t[i], i=0,1,..., m-1, bude alespoň jeden prvek Problém sběratele kupónů Mějme neomezené množství kuponů m typů. Vybereme-li náhodně vždycky jeden kupón, jaká je průměrná hodnota počtu výběrů W na to, abychom získali alespoň jeden kupón z každého typu. kupón prvek typ kupónu index máme-li alespoň jeden kupón každého typu, v každém seznamu t[i], i=0,1,..., m-1 je alespoň jeden prvek - mějme získané kupony i různých typů - pravděpodobnost, získání typu kupónu, který ještě nemáme je m i p i = i = 0, 1,..., m-1 m - pravděpodobnost P(k) získání kupónu, který ještě nemáme po k výběrech, je dána součinem pravděpodobností k-1 neúspěšných výběrů a pravděpodobnosti úspěšného výběru P(k) = p i (1 - p i ) k 1

- kupón typu, který ještě nemáme, získáme průměrně po W i výběrech W i = k p i (1 - p i ) k 1 = - p i [ (1 - p i ) k ] = 1/ p i = m / (m-i) k=1 k=0 Poznámky: q k = 1/(1-q) k=0 (1/q) = -1/q 2 - průměrný počet výběrů kuponů na získání všech m typů je m-1 m-1 m W = W i = m 1 / (m-i) = m 1 / j i=0 i=0 j=1 - W je průměrný počet vložených prvků, kdy už v každém seznamu t[i], i = 0,1,..., m-1 bude alespoň jeden prvek a při každém dalším vložení prvku vznikne kolize - pro m = 365 je W = 2364 - kolize vzniká při každém vložení prvku po průměrném vložení 6.5 krát více prvků než je pozic v tabulce Situace se dramaticky nezhorší, stane-li se m rozumně menší než A.

Časová náročnost operace hledání m velikost tabulky n = A α = n/m - koeficient obsazení ( využití ) d i - délka seznamu t[i], i = 0,1,..., m-1 n = d 0 + d 1 + + d m-1 průměrná délka α = n/m Čas hledání prvku v tabulce závisí na délce prohledávaného seznamu. Neúspěšné hledání - klíč se může se stejnou pravděpodobností zobrazit na libovolnou pozici - průměrná doba hledání v seznamu je stejná a rovna α - celková doba hledání včetně času výpočtu rozptylovací funkce a přístupu k seznamu je Θ(1 + α)

Úspěšné hledání - nechť byl hledaný prvek vložen jako j-tý v pořadí z n vložených prvků, j =1, 2,, n - po něm bylo vloženo n-j prvků - klíč každého z nich se zobrazil na libovolnou pozici v tabulce se stejnou pravděpodobností 1/m - průměrná délka seznamů, které takto vznikly z uvažovaných n-j prvků, bude tedy (n-j)/m - při hledání projdeme tento seznam + hledaný prvek Průměrný počet prvků, které nutno projít pro libovolný vložený prvek je n n n n 1/n [ 1 + (n-j)/m] = 1 + 1/(nm) (n-j) = 1 + 1/(nm)( n - j) = j=1 j=1 j=1 j=1 1 + [n 2 n(n+1)/2]/nm = 1 + (n-1)/2m = 1 + α/2 α/2n. Čas hledání existujícího prvku v tabulce včetně času výpočtu rozptylovací funkce a přístupu k seznamu je Θ(2 + α/2 α/2n) = Θ(1 + α) Je-li počet prvků n aktuální množiny A úměrný počtu pozic v tabulce m, m A, tj. n/m = konstanta, potom je průměrný čas hledání prvku v tabulce O(1).

Známe-li, nebo umíme alespoň odhadnout, počet prvků n, které chceme uložit v tabulce, jak zvolíme její velikost m? - pokud je kritická rychlost hledání volíme m > n, za cenu větších nároků na paměť, když alespoň m-n pozic v tabulce bude nevyužitých - v opačném případě volíme m < n, kdy se úměrně prodlouží průměrný čas hledání Obecně se doporučuje zvolit m = n a i když nakonec bude nutno vložit více prvků, vlastnosti se výrazně nezhorší. Poznámka: JAVA

Rozptylovací funkce h: K {0,1,... m -1} - očekáváme, že každý klíč zobrazí (přibližně) stejně pravděpodobně na libovolnou z m hodnot, nezávisle na tom, kam je zobrazen jakýkoliv jiný klíč - musíme znát charakteristiku výskytu klíčů v aplikaci, což není vždycky splněno - klíče mohou mít různý typ, od jednoduchých datových typů až ke strukturovaným datovým typům, jakými jsou například objekty - každý typ klíče je v počítači reprezentován řetězcem 0 a 1, který můžeme vyjádřit jako (možná velice veliké) celé číslo

Modulární metoda klíčem je číslo - hodnoty h(k) = k mod m (v Javě k % m ) jsou právě z množiny {0,1,... m -1}. - m nemůžeme volit libovolně, je-li m = 2 p, potom h(k) závisí jenom na p nejnižších bitech klíče k - pokud nevíme, že všechny p - bitové permutace nejnižších bitů jsou stejně pravděpodobné, volíme jako m prvočíslo, které není blízké mocnině 2 - nastáva například při správě paměťových struktur operačního systému, kterých velikost je obvykle 2 p klíčem je řetězec ASCII znaků - ASCII kód zobrazuje znak řetězcem 7 bitů, rozeznává tedy 128 různých hodnot, které můžeme interpretovat jako celá čísla 0 až 127 - řetězec α 1 α 2...α n potom můžeme interpretovat jako zápis čísla se základem 128, kterého hodnota je z 1.128 n-1 + z 2.128 n-2 +... +z n.128 0 kde z i je celočíselná interpretace znaku α i - řetězce znaků mohou být tak dlouhé, že uvedená číselná reprezentace přesáhne rozsah zobrazitelných celočíselných hodnot - potřebujeme h(α 1 α 2...α n ) = (z 1.128 n-1 + z 2.128 n-2 +... +z n.128 0 )mod m

- užitím Hornerova schématu pro výpočet h(α 1 α 2...α n ) dostaneme h(α 1 α 2...α n ) = (z 1.128 n-1 + z 2.128 n-2 +... +z n.128 0 ) mod m = (((z 1.128 + z 2 ).128 +... +z n-1 ).128 + z n ) mod m - využijeme toho, že pro výpočet mod m nebudeme uvažovat násobky m ve velkých členech, tj. (x.c + y) mod m = ((x mod m).c + y) mod m x = a.m + b ((a.m + b).c + y) mod m = (a.c.m + b.c +y) mod m = (b.c + y) mod m (((a.m + b) mod m).c + y) mod m = (b.c + y) mod m (((z 1.128 + z 2 ).128 +... +z n-1 ).128 + z n ) mod m = ((((0.128 + z 1 ) mod m.128 + z 2 ) mod m.128 +... +z n-1 ) mod m.128 + z n ) mod m static int h(string klic, int m) { int h = 0; for (int i = 0; i < klic.length(); i++) h = (h * 128 + klic.charat(i)) % m; return h; }

Multiplikativní metoda - celou část reálného čísla r označíme r - je-li c reálné číslo z intervalu 0 c < 1, potom m. c {0,1,... m -1} - jsou-li hodnoty klíčů k omezeny, a k < b, potom c = (k a) / (b a) K = {1, 2,..., 10 000} m = 100 a = 1, b = 10 001 h(k) = c ( k 1)/10000 m. = m = ( k 1)/100 klíče k = 1, 2,..., 100 jsou zobrazeny na pozici 0 klíče k = 101, 102,..., 200 jsou zobrazeny na pozici 1, atd. Transformace klíče k na multiplikativní koeficient c, musí být znáhodněna a přitom její výpočet musí zůstat efektivní.

- zvolíme konstantu A z intervalu 0 < A < 1 - jako c vezmeme zlomkovou část součinu ka, c = ka ka h(k) = m( ka ka ) implementace - zvolíme m = 2 p - nechť celočíselný klíč k je zobrazen slovem s w bity - A zvolme ve tvaru q/2 w, q je celé číslo zobrazené také jako slovo s w bity, 0 < q < 2 w, k.a = k.q/2 w - celočíselným násobením k.q získáme hodnotu s 2w bity uloženou ve dvou slovech s0 a s1, přičemž s0 označuje slovo s bity nižších řádů součinu, k.q = s1. 2 w + s0 - k.a = k.q/2 w = (k.q). 2 -w = s1 + s0. 2 -w, w bitů slova s0 obsahuje ka ka zlomkovou část součinu ka, tj. - h(k) = m( ka ka ) = 2 ( ka ka ) bitů slova s0 p, h(k) tvoří p nejvýznamnějších w bitů k w bitů x q = s1 s0 h(k) p bitů - jako konstanta A se doporučuje hodnota zlatého poměru φ = 0.618033 - q volíme tak, aby q/2 w bylo co nejblíže φ, q 0.618033 x 2 w