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 ...
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