From 2c133b76f193478bb85d41a76ae78695cc067452 Mon Sep 17 00:00:00 2001 From: Paul Jungeblut Date: Wed, 26 Nov 2014 11:45:23 +0100 Subject: levenshtein --- string/levenshtein.cpp | 12 ++++++++++++ string/string.tex | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 string/levenshtein.cpp (limited to 'string') diff --git a/string/levenshtein.cpp b/string/levenshtein.cpp new file mode 100644 index 0000000..d1980f8 --- /dev/null +++ b/string/levenshtein.cpp @@ -0,0 +1,12 @@ +int levenshtein(string& s1, string& s2) { + int len1 = s1.size(), len2 = s2.size(); + vector col(len2 + 1), prevCol(len2 + 1); + for (int i = 0; i < len2 + 1; i++) prevCol[i] = i; + for (int i = 0; i < len1; i++) { + col[0] = i + 1; + for (int j = 0; j < len2; j++) + col[j+1] = min(min(prevCol[j+1] + 1, col[j] + 1), prevCol[j] + (s1[i]==s2[j] ? 0 : 1)); + col.swap(prevCol); + } + return prevCol[len2]; +} \ No newline at end of file diff --git a/string/string.tex b/string/string.tex index 61385fc..0fddb86 100644 --- a/string/string.tex +++ b/string/string.tex @@ -3,6 +3,9 @@ \subsection{\textsc{Knuth-Morris-Pratt}-Algorithmus} \lstinputlisting{string/kmp.cpp} +\subsection{\textsc{Levenshtein}-Distanz} +\lstinputlisting{string/levenshtein.cpp} + \subsection{Trie} \lstinputlisting{string/trie.cpp} -- cgit v1.2.3 From 9cf344075f66a3bd2e404b08b72812356bb3f565 Mon Sep 17 00:00:00 2001 From: Paul Jungeblut Date: Wed, 26 Nov 2014 18:34:33 +0100 Subject: Feinschliff --- graph/graph.tex | 2 +- java/java.tex | 4 ++-- sonstiges/sonstiges.tex | 15 +++++++++++++++ string/kmp.cpp | 5 ----- tcr.pdf | Bin 209720 -> 212443 bytes 5 files changed, 18 insertions(+), 8 deletions(-) (limited to 'string') diff --git a/graph/graph.tex b/graph/graph.tex index 827892b..d4bf9d5 100644 --- a/graph/graph.tex +++ b/graph/graph.tex @@ -67,7 +67,7 @@ Finde die maximale Anzahl Pfade von $s$ nach $t$, die keinen Knoten teilen. \item Der maximale Fluss entspricht der unterschiedlichen Pfade ohne gemeinsame Knoten. \end{enumerate} -\subsection{Maximal Cardinatlity Bipartite Mathcing} +\subsection{Maximal Cardinatlity Bipartite Matching}\label{kuhn} \lstinputlisting{graph/maxCarBiMatch.cpp} \subsection{TSP} diff --git a/java/java.tex b/java/java.tex index e8e132c..d9c3a75 100644 --- a/java/java.tex +++ b/java/java.tex @@ -28,7 +28,7 @@ Hier ein kleiner überblick über die Methoden der Klasse BigInteger: //Returns this +,*,/,- val BigInteger add(BigInteger val), multiply(BigInteger val), divide(BigInteger val), substract(BigInteger val) -//Returns this\(^e\) +//Returns this^e BigInteger pow(BigInteger e) //Bit-Operations @@ -37,7 +37,7 @@ BigInteger and(BigInteger val), or(BigInteger val), xor(BigInteger val), not(), //Returns the greatest common divisor of abs(this) and abs(val) BigInteger gcd(BigInteger val) -//Returns this mod m, this\(^{-1}\) mod m, this\(^e\) mod m +//Returns this mod m, this^-1 mod m, this^e mod m BigInteger mod(BigInteger m), modInverse(BigInteger m), modPow(BigInteger e, BigInteger m) //Returns the next number that is greater than this and that is probably a prime. diff --git a/sonstiges/sonstiges.tex b/sonstiges/sonstiges.tex index 255af6a..694aaf7 100644 --- a/sonstiges/sonstiges.tex +++ b/sonstiges/sonstiges.tex @@ -32,3 +32,18 @@ $n$ Personen im Kreis, jeder $k$-te wird erschossen. \lstinputlisting{sonstiges/josephusK.cpp} \end{description} \textbf{Beachte bei der Ausgabe, dass die Personen im ersten Fall von $1, \ldots, n$ nummeriert sind, im zweiten Fall von $0, \ldots, n-1$!} + +\subsection{Gemischtes} +\begin{itemize}[itemsep=5mm] + \item \emph{\textsc{Johnsons} Reweighting Algorithmus:} Füge neue Quelle \lstinline{S} hinzu, mit Kanten mit Gewicht 0 zu allen Knoten. Nutze \textsc{Bellmann-Ford} zum Betsimmen der Entfernungen \lstinline{d[i]} von \lstinline{S} zu allen anderen Knoten. Stoppe, wenn es negative Zyklen gibt. Sonst ändere die gewichte von allen Kanten \lstinline{(u,v)} im ursprünglichen Graphen zu \lstinline{d[u]+w[u,v]-d[v]}. Dann sind alle Kantengewichte nichtnegativ, \textsc{Dijkstra} kann angewendet werden. + \item Für ein System von Differenzbeschränkungen: Ändere alle Bedingungen in die Form $a-b \leq c$. Für jede Bedingung füge eine Kante \lstinline{(b,a)} mit Gweicht \lstinline{c} ein. Füge Quelle \lstinline{s} hinzu, mit Kanten zu allen Knoten mit Gewicht 0. Nutze \textsc{Bellmann-Ford}, um die kürzesten Pfade von \lstinline{s} aus zu finden. \lstinline{d[v]} ist mögliche Lösung für \lstinline{v}. + \item Min-Weight-Vertex-Cover im bipartiten Graph: Partitioniere in \lstinline{A, B} und füge Kanten \lstinline{s -> A} mit Gewicht \lstinline{w(A)} und Kanten \lstinline{B -> t} mit Gewicht \lstinline{w(B)} hinzu. Füge Kanten mit Kapazität $\infty$ von \lstinline{A} nach \lstinline{B} hinzu, wo im originalen Graphen Kanten waren. Max-Flow ist die Lösung.\newline + Im Residualgraphen: + \begin{itemize} + \item Das Vertex-Cover sind die Knoten inzident zu den Brücken. \emph{oder} + \item Die Knoten in \lstinline{A}, die \emph{nicht} von \lstinline{s} erreichber sind und die Knoten in \lstinline{B}, die von \lstinline{erreichber} sind. + \end{itemize} + \item Allgemeiner Graph: Das Komplement eines Vertex-Cover ist ein Independent Set. $\Rightarrow$ Max Weight Independent Set ist Komplement von Min Weight Vertex Cover. + \item Bipartiter Graph: Min Cover (kleinste Menge Knoten, die alle Kanten berühren) = Max Matching. + \item Bipartites Matching mit Gewichten auf linken Knoten. Minimiere Matchinggewicht. Lösung: Sortiere Knoten links aufsteigend nach Gewicht, danach nutze normlen Algorithmus (\textsc{Kuhn}, Seite \pageref{kuhn}) +\end{itemize} diff --git a/string/kmp.cpp b/string/kmp.cpp index f7c3630..6844975 100644 --- a/string/kmp.cpp +++ b/string/kmp.cpp @@ -1,8 +1,3 @@ -#include -#include - -using namespace std; - //Preprocessing Substring sub for KMP-Search vector kmp_preprocessing(string& sub) { vector b(sub.size() + 1); diff --git a/tcr.pdf b/tcr.pdf index 168904b..f8b3d91 100644 Binary files a/tcr.pdf and b/tcr.pdf differ -- cgit v1.2.3