Dokumentation sauberer machen
This commit is contained in:
parent
761b81b1c4
commit
bc309da7e6
1 changed files with 128 additions and 128 deletions
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue