Dokumentation sauberer machen

This commit is contained in:
joachimschmidt557 2019-03-03 17:53:41 +01:00
parent 761b81b1c4
commit bc309da7e6

View file

@ -17,159 +17,159 @@
Joachim Schmidt} Joachim Schmidt}
\begin{document} \begin{document}
\maketitle \maketitle
\tableofcontents
\section{Der Graph} \tableofcontents
\subsection{Bildung der Kanten} \section{Der Graph}
Der Algorithmus für die Bildung der Kanten ist folgender: \subsection{Bildung der Kanten}
\begin{algorithm} Der Algorithmus für die Bildung der Kanten ist folgender:
\caption{Bildung von Kanten}\label{euclid}
\begin{algorithmic}[1]
\Procedure{generateEdges}{}
\If{nodes is empty} return \EndIf
\State $castle \gets allCastles[0]$
\State $remainingCastles \gets allCastles$
\Loop
\If{$remainingCastles$ is empty} break
\EndIf
\State connect $castle$ to nearest castle
\State $castle \gets nearest castle$
\State remove $castle$ from $remainingCastles$
\EndLoop
\ForAll{castle in allCastles}
\ForAll{nearCastle in allCastlesInRadius(castle)}
\State connect $castle$ to $nearCastle$
\EndFor
\EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}
% Erklärung des Algorithmus \begin{algorithm}
Der Algorithmus ist in zwei Schritte aufgeteilt: \caption{Bildung von Kanten}\label{euclid}
\begin{itemize} \begin{algorithmic}[1]
\item Minimale Verbindung von allen Burgen \Procedure{generateEdges}{}
\item Ästhetische Verbesserung der Kanten \If{nodes is empty} return \EndIf
\end{itemize} \State $castle \gets allCastles[0]$
\State $remainingCastles \gets allCastles$
\Loop
\If{$remainingCastles$ is empty} break
\EndIf
\State connect $castle$ to nearest castle
\State $castle \gets nearest castle$
\State remove $castle$ from $remainingCastles$
\EndLoop
\ForAll{castle in allCastles}
\ForAll{nearCastle in allCastlesInRadius(castle)}
\State connect $castle$ to $nearCastle$
\EndFor
\EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}
Die minimale Verbindung aller Burgen erfolgt, indem % Erklärung des Algorithmus
sichergestellt wird, dass jede Burg mit einer anderen Der Algorithmus ist in zwei Schritte aufgeteilt:
verbunden ist und dass alle Burgen in einer gemeinsamen \begin{itemize}
Verbindung zusammenhängen. Der Algorithmus fängt bei \item Minimale Verbindung von allen Burgen
einer bestimmten Start-Burg an und verbindet diese Burg \item Ästhetische Verbesserung der Kanten
mit der nächstliegenden Burg, die noch nicht verbunden \end{itemize}
wurde. Daraufhin wird das gleiche mit der nächsten,
übernächsten, usw. Burg getan, bis die letzte Burg erreicht
wurde. Zu diesem Zeitpunkt sind alle Burgen durch eine
Linie verbunden.
Die Ästhetische Verbesserung erfolgt, indem alle Burgen Die minimale Verbindung aller Burgen erfolgt, indem
im Umkreis einer Burg durch eine Kante verbunden werden. sichergestellt wird, dass jede Burg mit einer anderen
verbunden ist und dass alle Burgen in einer gemeinsamen
Verbindung zusammenhängen. Der Algorithmus fängt bei
einer bestimmten Start-Burg an und verbindet diese Burg
mit der nächstliegenden Burg, die noch nicht verbunden
wurde. Daraufhin wird das gleiche mit der nächsten,
übernächsten, usw. Burg getan, bis die letzte Burg erreicht
wurde. Zu diesem Zeitpunkt sind alle Burgen durch eine
Linie verbunden.
\subsection{Überprüfung der Erreichbarkeit aller Knoten} Die Ästhetische Verbesserung erfolgt, indem alle Burgen
im Umkreis einer Burg durch eine Kante verbunden werden.
Der Algorithmus, der prüft, ob alle Knoten erreichbar sind, ist \subsection{Überprüfung der Erreichbarkeit aller Knoten}
folgender:
\begin{algorithm} Der Algorithmus, der prüft, ob alle Knoten erreichbar sind, ist
\caption{Erreichbarkeit aller Knoten}\label{euclid} folgender:
\begin{algorithmic}[1]
\Procedure{allNodesConnected}{}
\State $\textit{firstNode} \gets \text{first element of }\textit{nodes}$
\State $allVisitedNodes \gets \textit{empty}$
\State $nextVisitNodes \gets empty$
\State $\text{append } firstNode \text{ to } allVisitedNodes$
\State $\text{neighborsOf } firstNode$
\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
\State $\rightarrow \text{append to } nextVisitNodes$
\Loop
\If {$nextVisitNodes \text{ is empty}$}
break
\EndIf
\State $\text{append first element of } nextVisitNodes \text{ to } allVisitedNodes$
\State $\text{neighborsOf first element of } nextVisitNodes$
\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
\State $\rightarrow \text{append to } nextVisitNodes$
\State $\text{delete first element of } nextVisitNodes$
\EndLoop
\EndProcedure
\end{algorithmic}
\end{algorithm}
Der Algorithmus verwendet zwei unterschiedliche Datentypen: \begin{algorithm}
\caption{Erreichbarkeit aller Knoten}\label{euclid}
\begin{itemize} \begin{algorithmic}[1]
\item HashSet wird verwendet, um die bisher \Procedure{allNodesConnected}{}
besuchten Knoten zu speichern. Eine HashSet \State $\textit{firstNode} \gets \text{first element of }\textit{nodes}$
hat den Vorteil, dass Elemente nur einmal \State $allVisitedNodes \gets \textit{empty}$
gespeichert werden können. \State $nextVisitNodes \gets empty$
\item ArrayDeque wird verwendet, um die nächsten \State $\text{append } firstNode \text{ to } allVisitedNodes$
Knoten, die besucht werden, zu speichern. \State $\text{neighborsOf } firstNode$
\end{itemize} \State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
\State $\rightarrow \text{append to } nextVisitNodes$
\Loop
\If {$nextVisitNodes \text{ is empty}$}
break
\EndIf
\State $\text{append first element of } nextVisitNodes \text{ to } allVisitedNodes$
\State $\text{neighborsOf first element of } nextVisitNodes$
\State $\rightarrow \text{filter out all } x \text{ where } allVisitedNodes \text{ contains } x$
\State $\rightarrow \text{append to } nextVisitNodes$
\State $\text{delete first element of } nextVisitNodes$
\EndLoop
\EndProcedure
\end{algorithmic}
\end{algorithm}
Der Algorithmus sammelt sozusagen alle Knoten, die Der Algorithmus verwendet zwei unterschiedliche Datentypen:
aufgrund von momentanen Erkenntnissen erreichbar
sind, in der ArrayDeque \texttt{nextVisitNodes}. Hingegen sind
alle Knoten, die schon erreicht worden sind, in dem HashSet
\texttt{allVisitedNodes} gespeichert.
Der Algorithmus geht die ArrayDeque \texttt{nextVisitNodes}
solange durch, bis diese leer ist. In jeder Iteration wird
das erste Element der Liste aus der Liste entfernt.
Zunächst wird dieses Element dem HashSet \texttt{allVisitedNodes}
hinzugefügt. Daraufhin
werden die Nachbarn dieses Elements herausgefunden. Diejenigen
Nachbarn, die schon in dem HashSet \texttt{allVisitedNodes}
vorhanden sind, werden verworfen. Die restlichen Nachbarn
werden der ArrayDeque \texttt{nextVisitNodes} hinzugefügt.
\subsection{Wege finden} \begin{itemize}
\subsubsection{Teil (a)} \item HashSet wird verwendet, um die bisher
besuchten Knoten zu speichern. Eine HashSet
hat den Vorteil, dass Elemente nur einmal
gespeichert werden können.
\item ArrayDeque wird verwendet, um die nächsten
Knoten, die besucht werden, zu speichern.
\end{itemize}
\begin{algorithm} Der Algorithmus sammelt sozusagen alle Knoten, die
\caption{Berechnung der Distanzen}\label{euclid} aufgrund von momentanen Erkenntnissen erreichbar
\begin{algorithmic}[1] sind, in der ArrayDeque \texttt{nextVisitNodes}. Hingegen sind
\Procedure{run}{} alle Knoten, die schon erreicht worden sind, in dem HashSet
\State $v \gets$ getSmallestNode() \texttt{allVisitedNodes} gespeichert.
\Loop
\If{$v$ is null} break \EndIf Der Algorithmus geht die ArrayDeque \texttt{nextVisitNodes}
\State $v \gets getSmallestNode()$ solange durch, bis diese leer ist. In jeder Iteration wird
\EndLoop das erste Element der Liste aus der Liste entfernt.
\EndProcedure Zunächst wird dieses Element dem HashSet \texttt{allVisitedNodes}
\end{algorithmic} hinzugefügt. Daraufhin
\end{algorithm} werden die Nachbarn dieses Elements herausgefunden. Diejenigen
Nachbarn, die schon in dem HashSet \texttt{allVisitedNodes}
vorhanden sind, werden verworfen. Die restlichen Nachbarn
werden der ArrayDeque \texttt{nextVisitNodes} hinzugefügt.
\subsection{Wege finden}
\subsubsection{Teil (a)}
\begin{algorithm}
\caption{Berechnung der Distanzen}\label{euclid}
\begin{algorithmic}[1]
\Procedure{run}{}
\State $v \gets$ getSmallestNode()
\Loop
\If{$v$ is null} break \EndIf
\State $v \gets getSmallestNode()$
\EndLoop
\EndProcedure
\end{algorithmic}
\end{algorithm}
$$O(n) = $$ $$O(n) = $$
$n$ soll in diesem Fall die Anzahl an Knoten wiedergeben. $n$ soll in diesem Fall die Anzahl an Knoten wiedergeben.
Da es sich bei \texttt{availableNodes} um eine Da es sich bei \texttt{availableNodes} um eine
\texttt{LinkedList<Node<T>>} handelt, muss bei jedem \texttt{LinkedList<Node<T>>} handelt, muss bei jedem
Durchgehen der Liste jedes Element einzeln abgearbeitet Durchgehen der Liste jedes Element einzeln abgearbeitet
werden. In der Funktion \texttt{getSmallestNode()} ist werden. In der Funktion \texttt{getSmallestNode()} ist
dies der Fall. dies der Fall.
\subsubsection{Teil (b)} \subsubsection{Teil (b)}
Anstelle einer \texttt{LinkedList} braucht man eine Anstelle einer \texttt{LinkedList} braucht man eine
Datenstruktur, die bereits nach der Größe sortiert ist, Datenstruktur, die bereits nach der Größe sortiert ist,
damit bei dem Zugriff auf das kleinste Element nur ein damit bei dem Zugriff auf das kleinste Element nur ein
Schritt erforderlich ist. Schritt erforderlich ist.
$$O(n) = $$ $$O(n) = $$
\subsubsection{Teil (c)} \subsubsection{Teil (c)}
Invariante: Nach $h \geq 0$ Durchläufen gilt: Invariante: Nach $h \geq 0$ Durchläufen gilt:
\subsection{Kürzester Pfad zu allen Knoten} \subsection{Kürzester Pfad zu allen Knoten}
\end{document} \end{document}