21.11.2013 Aufrufe

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />

29 Hashtabellen<br />

Um Daten schnell zu f<strong>in</strong>den werden oft Hashtabellen e<strong>in</strong>gesetzt. <strong>E<strong>in</strong>e</strong> Hashtabelle ist e<strong>in</strong> gewöhnliches<br />

Array, aber <strong>die</strong> Position e<strong>in</strong>es jeden Elementes <strong>in</strong> <strong>die</strong>sem Array wird aus dem Schlüssel (=<br />

Wert nach dem gesucht wird) des Elements selbst berechnet. Diese Berechnung wird als Hashfunktion<br />

bezeichnet. Bei Str<strong>in</strong>gs kann im e<strong>in</strong>fachsten Fall e<strong>in</strong>fach <strong>die</strong> Quersumme über alle ASCII-<br />

Codes der enthaltenen Buchstaben gebildet werden, oder auch aufwendigere Berechnungen, <strong>die</strong><br />

auch Buchstabenverdreher berücksichtigen.<br />

Es passiert selbstverständlich h<strong>in</strong> <strong>und</strong> wieder, das zwei unterschiedliche E<strong>in</strong>träge denselben Hashwert<br />

erhalten, <strong>und</strong> so eigentlich am selben Platz <strong>in</strong> der Tabelle stehen müssten. Dies bezeichnet man<br />

als Kollision. Das Problem kann auf verschiedene Arten umgangen werden.<br />

Entweder man bildet Listen bei den e<strong>in</strong>zelnen Tabellenplätzen, so können mehrere E<strong>in</strong>träge 'am<br />

selben' Platz stehen, oder man nimmt e<strong>in</strong>fach den nächsten freien Platz <strong>in</strong> der Tabelle.<br />

Die grösste Schwierigkeit bei Hashtabellen ist es, e<strong>in</strong>e möglichst optimale Hashfunktion zu f<strong>in</strong>den.<br />

Sie sollte e<strong>in</strong>erseits schnell se<strong>in</strong>, aber andererseits Kollisionen möglichst optimal vermeiden <strong>und</strong> <strong>die</strong><br />

Schlüssel möglichst gleichverteilt <strong>in</strong> <strong>die</strong> Tabelle abbilden. Zudem müssen <strong>die</strong> Schlüssel positiv se<strong>in</strong>,<br />

da sie im Allgeme<strong>in</strong>en als Array<strong>in</strong>dex verwendet werden.<br />

Beispiele e<strong>in</strong>iger Hash-Funktionen (Key ist der Wert, nach dem gesucht wird, Text oder Zahl):<br />

#def<strong>in</strong>e FACTOR 7 /* Sollte Ungerade se<strong>in</strong> */<br />

#def<strong>in</strong>e TABLESIZE 256 /* 2-er Potenzen s<strong>in</strong>d schnell */<br />

/* Primzahlen ideal */<br />

unsigned <strong>in</strong>t Hash(char *Key)<br />

{<br />

unsigned <strong>in</strong>t Value = 0;<br />

}<br />

while (*Key != '\0') {<br />

Value = (Value * FACTOR + *Key++) % TABLESIZE;<br />

}<br />

return Value;<br />

unsigned <strong>in</strong>t Hash(<strong>in</strong>t Key)<br />

{<br />

return (Key % TABLESIZE);<br />

}<br />

/* Berücksichtigt nur <strong>die</strong> ersten beiden Zeichen */<br />

unsigned <strong>in</strong>t Hash(char *Key)<br />

{<br />

if (*Key != '\0') {<br />

return (Key[0] + 265*Key[1] % TABLESIZE);<br />

} else {<br />

return (Key[0] % TABLESIZE);<br />

}<br />

}<br />

Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 114/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!