Allan Grønlund Jørgensen, 2007
Antag at du har n forskellige tal(nøgler) fra en mængde
hvor m >> n, dvs. m er meget større end n.
Man ønsker at bruge de nøglerne til at indeksere i et array(tabel). Hvis man indekserer direkte ved hjælp af nøglens værdi, skal man bruge et array(tabel) med m indgange, til at indeksere de n tal.
![]() |
Så i stedet for at bruge nøglen som direkte indeksering, vil vi nu lave en mindre tabel hvor vi indekserer efter nøgle x i indgangen h(x). Vi laver en tabel af størrelse 3, og indekserer efter funktionen h(x) = x mod 3, hvor "mod" betyder modulo.
Hvis i ikke har hørt om modulo før, så se efter her. Vi ønsker at beregne x mod y. Som i måske husker fra jeres unge dage, så kan x skrives som.
hvor p er heltallig og r < y er en rest. Dvs. at hvis du tager heltalsdivision x / y så får man p og der er r til rest. Modulo er defineret til at være denne rest. Dvs. her er
som defineret ovenfor.
Lad os se resultatet af det ovennævnte eksempel med tabelstørrelse 3 og den simple funktion h(x) = x mod 3.
Så hvis man afslutter sin funktion med at tage modulo med tabelstørrelsen, så får man et tal mellem 0 og tabelstørrelsen, og kan derfor indeksere. Udover dette viser ovennævnte exempel at modulo også hjælper med at sprede funktionsværdierne.
Generalt behøves man ikke lade tabellen have n indgange. Oftest vil man lave den lidt større såldes at man har lettere ved at lave en funktion der spreder nøglerne pænt udover tabellen. Det er også lovligt at lave en funktion der sender flere nøgler over i samme tabelindgang, men så skal essentielt løse samme problem på denne mindre mængde.
Generelt eksempel
Som man kan se her, er der to nøgler der sendes til den samme værdi. Et mål for hvor godt en funktion virker er det maximale antal nøgler der sendes til samme værdi, og dette mål bliver brugt her.
Opgaven går i sin simpelthen ud på, at man er givet en mængde S og en tabelstørrelse, og så handler det om at designe en funktion der sender færrest mulige værdier til den samme tabel indgang.
Til dette formål er der lavet en applet, hvis funktionalitet vil blive beskrevet i det følgende.
På dette 4 kan man se hvordan appleten ser ud. Den er nærmest selvforklarende, men vi gennemgår den lige kort alligevel Øverst ses den mængde der skal bruges til at indeksere. Det vil sige den mængde der skal mappes ind i en lille tabel. Under dette felt kommer hash funktionen h(x) som man så kan ændre på. Under det kan man så en grafisk præsentation af tabellen, som bruges til at vise hvad der sker hvis man bruger den nuværende hash-funktion. I bunden er der knapper og et beskedfelt.
Alle hash-funktioner vil slutte af med at tage den beregnede værdi, og tage modulo med tabelstørrelsen, så funktionen altid giver et resultat der passer med tabelstørrelsen. Udover det gælder der at for operatorerne, at + og - binder mindst, og %, *, og / binder mest. Det vil sige at
Hvis man ønsker
bruges paranteser som ovenover. Den eneste variabel man kan bruge er x. Så den simple hash-funktion som skrevet tidligere vil have udseendet.
Bare følg link for at starte applet.
Links til High-Score