sawine@10
|
1 |
\documentclass[a4paper, 10pt, pagesize, smallheadings]{article}
|
sawine@10
|
2 |
\usepackage{graphicx}
|
sawine@10
|
3 |
%\usepackage[latin1]{inputenc}
|
sawine@10
|
4 |
\usepackage{amsmath, amsthm, amssymb}
|
sawine@10
|
5 |
\usepackage{typearea}
|
sawine@10
|
6 |
\usepackage{algorithm}
|
sawine@10
|
7 |
\usepackage{algorithmic}
|
sawine@10
|
8 |
\usepackage{fullpage}
|
sawine@10
|
9 |
\usepackage{mathtools}
|
sawine@10
|
10 |
\usepackage[all]{xy}
|
sawine@10
|
11 |
\title{Theory I, Sheet 7 Solution}
|
sawine@10
|
12 |
\author{Eugen Sawin}
|
sawine@10
|
13 |
\renewcommand{\familydefault}{\sfdefault}
|
sawine@10
|
14 |
\include{pythonlisting}
|
sawine@10
|
15 |
|
sawine@10
|
16 |
\pagestyle{empty}
|
sawine@10
|
17 |
\begin{document}
|
sawine@10
|
18 |
\maketitle
|
sawine@10
|
19 |
|
sawine@10
|
20 |
\section*{Exercise 7.1}
|
sawine@10
|
21 |
For this exercise I've used a slightly different implementation of the KMP algorithm, which is semantically equal to the one presented in the lecture.
|
sawine@10
|
22 |
|
sawine@10
|
23 |
In this version the $next$ array is prepended with a $-1$, which I omit from the solutions to correspond to the lecture's algorithm's output.
|
sawine@10
|
24 |
\begin{python}
|
sawine@10
|
25 |
def kmp(text, pattern):
|
sawine@10
|
26 |
l = []
|
sawine@10
|
27 |
n = next(pattern)
|
sawine@10
|
28 |
j = 0
|
sawine@10
|
29 |
for i in range(len(text)):
|
sawine@10
|
30 |
while j >= 0 and text[i] != pattern[j]:
|
sawine@10
|
31 |
j = n[j]
|
sawine@10
|
32 |
j += 1
|
sawine@10
|
33 |
if j == len(pattern):
|
sawine@10
|
34 |
l.append(i - len(pattern) + 1)
|
sawine@10
|
35 |
j = n[j]
|
sawine@10
|
36 |
return l
|
sawine@10
|
37 |
|
sawine@10
|
38 |
def next(pattern):
|
sawine@10
|
39 |
n = [-1]
|
sawine@10
|
40 |
j = -1
|
sawine@10
|
41 |
for i in range(len(pattern)):
|
sawine@10
|
42 |
while j >= 0 and pattern[i] != pattern[j]:
|
sawine@10
|
43 |
j = n[j]
|
sawine@10
|
44 |
j += 1
|
sawine@10
|
45 |
n.append(j)
|
sawine@10
|
46 |
return n
|
sawine@10
|
47 |
\end{python}
|
sawine@10
|
48 |
|
sawine@10
|
49 |
\subsection*{1}
|
sawine@10
|
50 |
\begin{align*}
|
sawine@10
|
51 |
P &= rlrrlr\\
|
sawine@10
|
52 |
next &= [0, 0, 1, 1, 2, 3]\\
|
sawine@10
|
53 |
\end{align*}
|
sawine@10
|
54 |
|
sawine@10
|
55 |
\subsection*{2}
|
sawine@10
|
56 |
\begin{align*}
|
sawine@10
|
57 |
P' &= rrllrrll\\
|
sawine@10
|
58 |
next &= [0, 1, 0, 0, 1, 2, 3, 4]\\
|
sawine@10
|
59 |
\end{align*}
|
sawine@10
|
60 |
|
sawine@10
|
61 |
\subsection*{3}
|
sawine@10
|
62 |
\begin{align*}
|
sawine@10
|
63 |
P &= rlrrlr\\
|
sawine@10
|
64 |
T &= lrrrlrrlllrrrlrrlrrllrlrrlrrlr\\
|
sawine@10
|
65 |
next &= [0, 0, 1, 1, 2, 3]\\
|
sawine@10
|
66 |
matched &= [12, 21, 24]\\
|
sawine@10
|
67 |
\end{align*}
|
sawine@10
|
68 |
You can find the full KMP-execution table in the attached text file \emph{kmp-output.txt}.
|
sawine@10
|
69 |
|
sawine@10
|
70 |
\section*{Exercise 7.2}
|
sawine@10
|
71 |
\begin{figure}[h]
|
sawine@10
|
72 |
\entrymodifiers={+[F-]}
|
sawine@10
|
73 |
\xymatrix
|
sawine@10
|
74 |
{
|
sawine@10
|
75 |
& & C & H & U & P & A & C & A & B & R & A & S\\
|
sawine@10
|
76 |
& 0\ar@{-->}[dr] \ar[d] \ar[r] & \ar[r]1\ar[dr] & 2\ar[dr]\ar[r] & 3\ar[dr]\ar[r] & 4\ar[dr]\ar[r] & \ar[r]5 & 6\ar[r]\ar[dr] & 7\ar[r] & 8\ar[r] & 9\ar[dr]\ar[r] & 10\ar[r] & 11\\
|
sawine@10
|
77 |
A & 1\ar[dr] \ar[d] & 1\ar[d]\ar[dr] \ar@{-->}[r] & 2\ar[r]\ar@{-->}[dr] & 3\ar[r]\ar[dr] & 4\ar[dr] & 4\ar[d]\ar[r]\ar[dr] & 5\ar[dr]\ar[r] & 6\ar[r]\ar[dr] & 7\ar[r] & \ar[r]8 & 9\ar[r] & 10\\
|
sawine@10
|
78 |
B & 2\ar[dr] \ar[d] & 2\ar[d]\ar[dr] & 2\ar[d]\ar[r]\ar[dr] & 3\ar[r]\ar@{-->}[dr] & 4\ar[r]\ar[dr] & 5\ar[dr] & 5\ar[d]\ar[r]\ar[dr] & 6\ar[dr] & 6\ar[d]\ar[r]\ar[dr] & 7\ar[r] & 8\ar[r] & 9\\
|
sawine@10
|
79 |
R & 3\ar[dr] \ar[d] & 3\ar[d]\ar[dr] & 3\ar[d]\ar[dr] & 3\ar[d]\ar[r]\ar[dr] & 4\ar[r]\ar@{-->}[dr] & 5\ar[r] & 6\ar[dr] & 6\ar[r]\ar[dr] & 7 & 6\ar[d]\ar[r]\ar[dr] & 7\ar[r] & 8\\
|
sawine@10
|
80 |
A & 4\ar[dr] \ar[d] & 4\ar[dr] & 4\ar[d]\ar[dr] & 4\ar[d]\ar[dr] & 4\ar[d]\ar[dr] & 4\ar[d]\ar[r]\ar@{-->}[dr] & 5\ar[r] & 6\ar[r] & 7 & 7 & 6\ar[d]\ar[r]\ar[dr] & 7\\
|
sawine@10
|
81 |
C & 5 \ar[d] & 4\ar[d]\ar[r]\ar[dr] & 5\ar[dr] & 5\ar[d]\ar[dr] & 5\ar[d]\ar[dr] & 5 & 4\ar[d]\ar[r]\ar@{-->}[dr] & 5\ar[r] & 6\ar[r] & 7\ar[dr] & 7\ar[dr] & 7\ar[d]\\
|
sawine@10
|
82 |
A & 6 \ar[d] & 5\ar[d]\ar[dr] & 5\ar[d]\ar[r]\ar[dr] & 6\ar[dr] & 6\ar[d] & 5\ar[d]\ar[dr] & 5\ar[d] & 4\ar[r]\ar[dr] \ar@{-->}[d] & 5\ar[r]\ar[dr] & 6\ar[r]\ar[dr] & 7\ar[r]\ar[dr] & 8\\
|
sawine@10
|
83 |
D & 7 \ar[d] & 6\ar[d]\ar[dr] & 6\ar[d]\ar[dr] & 6\ar[d]\ar[r]\ar[dr] & 7\ar[dr] & 6\ar[d]\ar[dr] & 6\ar[d]\ar[dr] & 5\ar[dr] \ar@{-->}[d] & 5\ar[d]\ar[dr]\ar[r] & 6\ar[r]\ar[dr] & 7\ar[r] & 8\\
|
sawine@10
|
84 |
A & 8 \ar[d] & 7\ar[d]\ar[dr] & 7\ar[d]\ar[dr] & 7\ar[d]\ar[dr] & 7\ar[d]\ar[dr] & 7\ar[d]\ar[dr] & 7\ar[d] & 6\ar[d] \ar@{-->}[dr] & 6\ar[dr] & 6\ar[d]\ar[dr] & 6\ar[d]\ar[dr]\ar[r] & 7\\
|
sawine@10
|
85 |
B & 9 \ar[d] & 8\ar[d]\ar[dr] & 8\ar[d]\ar[dr] & 8\ar[d]\ar[dr] & \ar[dr]8\ar[d] & 8\ar[d]\ar[dr] & 8\ar[d] & 7\ar[d] & 6\ar[d]\ar[r] \ar@{-->}[dr] & 7 & 7\ar[dr] & 7\ar[d]\\
|
sawine@10
|
86 |
R & 10 \ar[d]& 9\ar[d]\ar[dr] & 9\ar[d]\ar[dr] & 9\ar[d]\ar[dr] & 9\ar[d]\ar[dr] & 9\ar[dr] & 9\ar[d]\ar[dr] & 8\ar[d] & 7\ar[d] & 6\ar[d]\ar[r] \ar@{-->}[dr] & \ar[r]7 & 8\\
|
sawine@10
|
87 |
A & 11 & 10& 10& 10& 10& 9\ar[r] & 10& 9 & 8 & 7 & 6 \ar@{-->}[r] & 7\\
|
sawine@10
|
88 |
}
|
sawine@10
|
89 |
\end{figure}
|
sawine@10
|
90 |
\newpage
|
sawine@10
|
91 |
\noindent We specify the edit operations:
|
sawine@10
|
92 |
\begin{enumerate}
|
sawine@10
|
93 |
\item replace A with C
|
sawine@10
|
94 |
\item insert H
|
sawine@10
|
95 |
\item replace B with U
|
sawine@10
|
96 |
\item replace R with P
|
sawine@10
|
97 |
\item keep A
|
sawine@10
|
98 |
\item keep C
|
sawine@10
|
99 |
\item keep A
|
sawine@10
|
100 |
\item delete D
|
sawine@10
|
101 |
\item delete A
|
sawine@10
|
102 |
\item keep B
|
sawine@10
|
103 |
\item keep R
|
sawine@10
|
104 |
\item keep A
|
sawine@10
|
105 |
\item insert S
|
sawine@10
|
106 |
\end{enumerate}
|
sawine@10
|
107 |
And we get $D(A, B) = 7$.
|
sawine@10
|
108 |
\end{document}
|