\documentclass{bschlangaul-aufgabe} \bLadePakete{mathe} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe zum Hashing}, Thematik = {Modulo 11 und 17}, Referenz = AUD.Baeume.Hashing.Modulo-11-17, RelativerPfad = Module/30_AUD/80_Baeume/60_Hashing/Aufgabe_Modulo-11-17.tex, ZitatSchluessel = aud:ab:5, ZitatBeschreibung = {Seite 1, Aufgabe 1}, BearbeitungsStand = mit Lösung, Korrektheit = korrekt und überprüft, Ueberprueft = {unbekannt}, Stichwoerter = {Hashfunktion, Streutabellen (Hashing), Separate Verkettung, Lineares Sondieren, Quadratisches Sondieren}, } \begin{enumerate} %% % (a) %% \item Ist $h(k) = k^2 \mod 11$ eine gut gewählte Hashfunktion\index{Hashfunktion}? Begründen Sie Ihre Antwort. \index{Streutabellen (Hashing)} \footcite[Seite 1, Aufgabe 1]{aud:ab:5} Tipp: Berechnen Sie zunächst $h(k)$ für $0 \leq k < 11$. Überlegen Sie dann, welche Werte $h(k')$ für $k' = a \cdot 11 + k$ mit $a > 0$ und $0 \leq k < 11$ annehmen kann. \begin{bAntwort} Nein, $h$ ist keine gute Hashfunktion. Betrachten wir zunächst die Wertetabelle von $h$ für $0 \leq k < 11$. Wir erhalten \begin{center} \begin{tabular}{|c|c|c|} \hline $k$ & Nebenrechnung & $h(k)$\\\hline\hline 0 & $0^2 \mod 11 = 0 \mod 11$ & 0\\\hline 1 & $1^2 \mod 11 = 1 \mod 11$ & 1\\\hline 2 & $2^2 \mod 11 = 4 \mod 11$ & 4\\\hline 3 & $3^2 \mod 11 = 9 \mod 11$ & 9\\\hline 4 & $4^2 \mod 11 = 16 \mod 11$ & 5\\\hline 5 & $5^2 \mod 11 = 25 \mod 11$ & 3\\\hline 6 & $6^2 \mod 11 = 36 \mod 11$ & 3\\\hline 7 & $7^2 \mod 11 = 49 \mod 11$ & 5\\\hline 8 & $8^2 \mod 11 = 64 \mod 11$ & 9\\\hline 9 & $9^2 \mod 11 = 81 \mod 11$ & 4\\\hline 10 & $10^2 \mod 11 = 100 \mod 11$ & 1\\\hline \end{tabular} \end{center} Wir sehen, dass nie die Werte $2$, $6$, $7$, $8$ und $10$ eingenommen werden. Man könnte nun noch hoffen, dass das vielleicht für irgendein größeres $k$ der Fall ist, dem ist jedoch nicht so. Wir können uns leicht davon überzeugen, dass für ein beliebiges $k' = a \cdot 11 + k$ mit $a > 0$ und $0 \leq k < 11$ folgendes gilt: \begin{align*} h(k') &= (k')^2 \mod 11\\ &= (a \cdot 11 + k)^2 \mod 11\\ &= (a^2 \cdot 11^2 + 2ak \cdot 11 + k^2) \mod 11\\ &= (k^2) \mod 11\\ &= h(k) \end{align*} Somit haben wir die Berechnung des Hashwertes für ein beliebiges $k'$ auf die Berechnung des Hashwertes für ein $k < 11$ zurückgeführt, was impliziert, dass kein Schlüssel jemals auf etwas anderes als $0$, $1$, $3$, $4$, $5$ oder $9$ abgebildet werden kann. \end{bAntwort} %% % (b) %% \item Die Schlüssel $23$, $57$, $26$, $6$, $77$, $43$, $74$, $60$, $9$, $91$ sollen in dieser Reihenfolge mit der Hashfunktion $h(k) = k \mod 17$ in eine Hashtabelle der Länge $17$ eingefügt werden. \begin{bAntwort} \begin{bExkurs}[Sondieren] \begin{description} \item[separate Verkettung] Kollisionsauflösung durch Verkettung (separate chaining): Jedes Bucket speichert mit Hilfe einer dynamischen Datenstruktur (Liste, Baum, weitere Streutabelle, ...) alle Elemente mit dem entsprechenden Hashwert.\footcite[Seite 32]{aud:fs:tafeluebung-10} \item[lineares Sondieren] es wird um ein konstantes Intervall verschoben nach einer freien Stelle gesucht. Meistens wird die Intervallgröße auf 1 festgelegt. \item[quadratisches Sondieren] Nach jedem erfolglosen Suchschritt wird das Intervall quadriert.\footcite{wiki:hashtabelle} \end{description} \end{bExkurs} \end{bAntwort} \begin{enumerate} %% % 1. %% \item Verwenden Sie separate Verkettung zur Kollisionsauflösung. \index{Separate Verkettung} \begin{bAntwort} Nebenrechnung: $17 \cdot 1 = 17$\\ $17 \cdot 2 = 34$\\ $17 \cdot 3 = 51$\\ $17 \cdot 4 = 68$\\ $17 \cdot 5 = 85$ Modulo-Berechnung der gegebenen Zahlen: $23 \mod 17 = \textbf{6} \text{ da } 23 : 17 = 1 \text{, Rest } 6 \text{ da } 23 = 1 \cdot 17 + 6$\\ $57 \mod 17 = 57 - 3 \cdot 17 = 57 - 51 = \textbf{6}$\\ $26 \mod 17 = 26 - 17 = \textbf{9}$\\ $6 \mod 17 = 6 - 0 \cdot 17 = \textbf{6}$\\ $77 \mod 17 = 77 - 4 \cdot 17 = 77 - 68 = \textbf{9}$\\ $43 \mod 17 = \textbf{9}$\\ $74 \mod 17 = \textbf{6}$\\ $60 \mod 17 = \textbf{9}$\\ $9 \mod 17 = \textbf{9}$\\ $91 \mod 17 = \textbf{6}$\\ { \setlength{\tabcolsep}{2pt} \footnotesize \begin{tabular}{r|ccccccccccccccccc} Index & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\\hline Schlüssel &&&&&&&23&&&26&&&&&&&\\ &&&&&&&57&&&77&&&&&&&\\ &&&&&&&6 &&&43&&&&&&&\\ &&&&&&&74&&&60&&&&&&&\\ &&&&&&&91&&&9 &&&&&&&\\ \end{tabular} } \end{bAntwort} %% % 2. %% \item Verwenden Sie lineares Sondieren zur Kollisionsauflösung. \index{Lineares Sondieren} \def\tmp#1{{\tiny($#1$)}} \begin{bAntwort} \def\tmp#1{{\footnotesize#1}} Die Hashfunkion lautet: \tmp{$h'(k) = k \mod 17$} Die verwendete Hashfunktion beim linearen Sondieren: \tmp{$h(k, i) = (h'(k) - i) \mod 17$} \bigskip Mit Schrittweite $-1$ ergeben sich folgende Sondierungsfolgen: { \setlength{\tabcolsep}{2pt} \footnotesize \begin{tabular}{r|ccccccccc} Schlüssel & \multicolumn{6}{l}{Index}\\\hline 23 & 6\\ 57 & 6 & 5\\ 26 & 9\\ 6 & 6 & 5 & 4\\ 77 & 9 & 8\\ 43 & 9 & 8 & 7\\ 74 & 6 & 5 & 4 & 3 \\ 60 & 9 & 8 & 7 & 6 & 5 & 4 & 3 & 2\\ 9 & 9 & 8 & 7 & 6 & 5 & 4 & 3 & 2 & 1 \\ 91 & 6 & 5 & 4 & 3 & 2 & 1\\ \end{tabular} Damit ergibt sich folgende Hashtabelle: \begin{tabular}{r|ccccccccccccccccc} Index & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\\hline Schlüssel &91&9&60&74&6&57&23&43&77&26&&&&&&&\\ \end{tabular} } \end{bAntwort} %% % 3. %% \item Verwenden Sie quadratisches Sondieren zur Kollisionsauflösung. \index{Quadratisches Sondieren} \begin{bAntwort} \def\tmp#1{{\footnotesize#1}} Die Hashfunkion lautet: \tmp{$h'(k) = k \mod 17$} Die verwendete Hashfunktion beim quadratischen Sondieren: \tmp{$h(k, i) = (h'(k) + i^2) \mod 17$} \bigskip Am Beispiel von zwei Schlüsseln werden die Sondierungsfolgen berechnet: \bigskip \bPseudoUeberschrift{$h'(23) = 6$} \begin{enumerate} \item Sondierungsfolge: \\ \tmp{$h(23, 0) = (h'(23) + 0^2) \mod 17 = (6 + 0) \mod 17 = 6 \mod 17 = \textbf{6}$} \item Sondierungsfolge: \\ \tmp{$h(23, 1) = (h'(23) + 1^2) \mod 17 = (6 + 1) \mod 17 = 7 \mod 17 = \textbf{7}$} \item Sondierungsfolge: \\ \tmp{$h(23, 2) = (h'(23) + 2^2) \mod 17 = (6 + 4) \mod 17 = 10 \mod 17 = \textbf{10}$} \item Sondierungsfolge: \\ \tmp{$h(23, 3) = (h'(23) + 3^2) \mod 17 = (6 + 9) \mod 17 = 15 \mod 17 = \textbf{15}$} \item Sondierungsfolge: \\ \tmp{$h(23, 4) = (h'(23) + 4^2) \mod 17 = (6 + 16) \mod 17 = 22 \mod 17 = \textbf{5}$} \end{enumerate} \bigskip \bPseudoUeberschrift{$h'(26) = 9$} \begin{enumerate} \item Sondierungsfolge: \\ \tmp{$h(26, 0) = (h'(26) + 0^2) \mod 17 = (9 + 0) \mod 17 = 9 \mod 17 = \textbf{9}$} \item Sondierungsfolge: \\ \tmp{$h(26, 1) = (h'(26) + 1^2) \mod 17 = (9 + 1) \mod 17 = 10 \mod 17 = \textbf{10}$} \item Sondierungsfolge: \\ \tmp{$h(26, 2) = (h'(26) + 2^2) \mod 17 = (9 + 4) \mod 17 = 13 \mod 17 = \textbf{13}$} \item Sondierungsfolge: \\ \tmp{$h(26, 3) = (h'(26) + 3^2) \mod 17 = (9 + 9) \mod 17 = 18 \mod 17 = \textbf{1}$} \item Sondierungsfolge: \\ \tmp{$h(26, 4) = (h'(26) + 4^2) \mod 17 = (9 + 16) \mod 17 = 25 \mod 17 = \textbf{8}$} \item Sondierungsfolge: \\ \tmp{$h(26, 5) = (h'(26) + 5^2) \mod 17 = (9 + 25) \mod 17 = 34 \mod 17 = \textbf{0}$} \end{enumerate} \bigskip Es ergeben sich folgende Sondierungsfolgen: { \setlength{\tabcolsep}{2pt} \footnotesize \begin{tabular}{r|cccccc} Schlüssel & \multicolumn{6}{l}{Index}\\\hline 23 & 6\\ 57 & 6 & 7\\ 26 & 9\\ 6 & 6 & 7 & 10 \\ 77 & 9 & 10 & 13 \\ 43 & 9 & 10 & 13 & 1 \\ 74 & 6 & 7 & 10 & 15\\ 60 & 9 & 10 & 13 & 1 & 8 \\ 9 & 9 & 10 & 13 & 1 & 8 & 0\\ 91 & 6 & 7 & 10 & 15 & 5\\ \end{tabular} Damit ergibt sich folgende Hashtabelle: \begin{tabular}{r|ccccccccccccccccc} Index & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\\hline Schlüssel &9&43&&&&91&23&57&60&26&6&&&77&&74&\\ \end{tabular} } \end{bAntwort} \end{enumerate} \end{enumerate} \end{document}