sawine@6
|
1 |
\documentclass[a4paper, 10pt, pagesize, smallheadings]{article}
|
sawine@6
|
2 |
\usepackage{graphicx}
|
sawine@6
|
3 |
%\usepackage[latin1]{inputenc}
|
sawine@6
|
4 |
\usepackage{amsmath, amsthm, amssymb}
|
sawine@6
|
5 |
\usepackage{typearea}
|
sawine@6
|
6 |
\usepackage{algorithm}
|
sawine@6
|
7 |
\usepackage{algorithmic}
|
sawine@6
|
8 |
\usepackage{fullpage}
|
sawine@6
|
9 |
\usepackage[all]{xy}
|
sawine@6
|
10 |
\title{Theory I, Sheet 5 Solution}
|
sawine@6
|
11 |
\author{Eugen Sawin}
|
sawine@6
|
12 |
\renewcommand{\familydefault}{\sfdefault}
|
sawine@6
|
13 |
\include{pythonlisting}
|
sawine@6
|
14 |
|
sawine@6
|
15 |
\pagestyle{empty}
|
sawine@6
|
16 |
\begin{document}
|
sawine@6
|
17 |
\maketitle
|
sawine@6
|
18 |
|
sawine@6
|
19 |
\section*{Exercise 5.1}
|
sawine@6
|
20 |
The chained-hash function in Python:
|
sawine@6
|
21 |
\begin{python}
|
sawine@6
|
22 |
def chained_hash(k, table, size):
|
sawine@6
|
23 |
code = k % size
|
sawine@6
|
24 |
if code in table:
|
sawine@6
|
25 |
table[code].append(k)
|
sawine@6
|
26 |
else:
|
sawine@6
|
27 |
table[code] = [k]
|
sawine@6
|
28 |
return table
|
sawine@6
|
29 |
\end{python}
|
sawine@6
|
30 |
For the exercise we will set $size = 15$.\\\\
|
sawine@6
|
31 |
Resulting hash table:\\\\
|
sawine@6
|
32 |
\begin{tabular}{r l}
|
sawine@6
|
33 |
\textbf{index} & \textbf{entries}\\
|
sawine@6
|
34 |
0 & 15\\
|
sawine@6
|
35 |
1 & 16\\
|
sawine@6
|
36 |
2 & \\
|
sawine@6
|
37 |
3 & \\
|
sawine@6
|
38 |
4 & 19, 49\\
|
sawine@6
|
39 |
5 & 5, 65\\
|
sawine@6
|
40 |
6 & 21\\
|
sawine@6
|
41 |
7 & \\
|
sawine@6
|
42 |
8 & 8, 38\\
|
sawine@6
|
43 |
9 & \\
|
sawine@6
|
44 |
10 & \\
|
sawine@6
|
45 |
11 & \\
|
sawine@6
|
46 |
12 & 12, 27, 42\\
|
sawine@6
|
47 |
13 & \\
|
sawine@6
|
48 |
14 & \\
|
sawine@6
|
49 |
\end{tabular}
|
sawine@6
|
50 |
\newpage
|
sawine@6
|
51 |
|
sawine@6
|
52 |
\section*{Exercise 5.2}
|
sawine@6
|
53 |
General hash function in Python:
|
sawine@6
|
54 |
\begin{python}
|
sawine@6
|
55 |
def h(k, size):
|
sawine@6
|
56 |
return k % size
|
sawine@6
|
57 |
|
sawine@6
|
58 |
def hash(k, size, table, probe):
|
sawine@6
|
59 |
j = 0
|
sawine@6
|
60 |
code = h(k, size) % size
|
sawine@6
|
61 |
while code in table:
|
sawine@6
|
62 |
j += 1
|
sawine@6
|
63 |
code = (h(k, size) - probe(j, k, size)) % size
|
sawine@6
|
64 |
table[code] = k
|
sawine@6
|
65 |
return table
|
sawine@6
|
66 |
\end{python}
|
sawine@6
|
67 |
For the exercise we will set $size = 15$.\\
|
sawine@6
|
68 |
The $probe$ function will be substituted by the explicit probing functions in the following exercises.\\
|
sawine@6
|
69 |
For the following exercises, empty table entries will be omitted.\\
|
sawine@6
|
70 |
|
sawine@6
|
71 |
\subsection*{5.2.1}
|
sawine@6
|
72 |
Linear probing:
|
sawine@6
|
73 |
\begin{python}
|
sawine@6
|
74 |
def linear_probing(j, k, size):
|
sawine@6
|
75 |
return j
|
sawine@6
|
76 |
\end{python}
|
sawine@6
|
77 |
\begin{tabular}{r l}
|
sawine@6
|
78 |
\textbf{index} & \textbf{entry}\\
|
sawine@6
|
79 |
0 & 15\\
|
sawine@6
|
80 |
1 & 16\\
|
sawine@6
|
81 |
2 & 65\\
|
sawine@6
|
82 |
3 & 49\\
|
sawine@6
|
83 |
4 & 19\\
|
sawine@6
|
84 |
5 & 5\\
|
sawine@6
|
85 |
6 & 21\\
|
sawine@6
|
86 |
7 & 38\\
|
sawine@6
|
87 |
8 & 8\\
|
sawine@6
|
88 |
10 & 42\\
|
sawine@6
|
89 |
11 & 27\\
|
sawine@6
|
90 |
12 & 12\\
|
sawine@6
|
91 |
\end{tabular}
|
sawine@6
|
92 |
\newpage
|
sawine@6
|
93 |
|
sawine@6
|
94 |
\subsection*{5.2.2}
|
sawine@6
|
95 |
Quadratic probing:
|
sawine@6
|
96 |
\begin{python}
|
sawine@6
|
97 |
def quadratic_probing(j, k, size):
|
sawine@6
|
98 |
return (-1)**j * math.ceil(j/2.0)**2
|
sawine@6
|
99 |
\end{python}
|
sawine@6
|
100 |
\begin{tabular}{r l}
|
sawine@6
|
101 |
\textbf{index} & \textbf{entry}\\
|
sawine@6
|
102 |
0 & 15\\
|
sawine@6
|
103 |
1 & 16\\
|
sawine@6
|
104 |
3 & 49\\
|
sawine@6
|
105 |
4 & 19\\
|
sawine@6
|
106 |
5 & 5\\
|
sawine@6
|
107 |
6 & 21\\
|
sawine@6
|
108 |
8 & 8\\
|
sawine@6
|
109 |
9 & 38\\
|
sawine@6
|
110 |
11 & 42\\
|
sawine@6
|
111 |
12 & 12\\
|
sawine@6
|
112 |
13 & 27\\
|
sawine@6
|
113 |
14 & 65\\
|
sawine@6
|
114 |
\end{tabular}
|
sawine@6
|
115 |
|
sawine@6
|
116 |
\subsection*{5.2.3}
|
sawine@6
|
117 |
Double hashing:
|
sawine@6
|
118 |
\begin{python}
|
sawine@6
|
119 |
def h2(k, size):
|
sawine@6
|
120 |
return 1 + (k % (size - 2))
|
sawine@6
|
121 |
|
sawine@6
|
122 |
def double_hash(j, k, size):
|
sawine@6
|
123 |
return j * h2(k, size)
|
sawine@6
|
124 |
\end{python}
|
sawine@6
|
125 |
\begin{tabular}{r l}
|
sawine@6
|
126 |
\textbf{index} & \textbf{entry}\\
|
sawine@6
|
127 |
0 & 15\\
|
sawine@6
|
128 |
1 & 16\\
|
sawine@6
|
129 |
2 & 65\\
|
sawine@6
|
130 |
3 & 21\\
|
sawine@6
|
131 |
4 & 19\\
|
sawine@6
|
132 |
5 & 5\\
|
sawine@6
|
133 |
6 & 27\\
|
sawine@6
|
134 |
8 & 8\\
|
sawine@6
|
135 |
9 & 49\\
|
sawine@6
|
136 |
10 & 38\\
|
sawine@6
|
137 |
11 & 42\\
|
sawine@6
|
138 |
12 & 12\\
|
sawine@6
|
139 |
\end{tabular}
|
sawine@6
|
140 |
\end{document}
|