\documentclass[uebung]{../../../lecture}

\title{IPI: Übungsblatt 7}
\author{Samuel Weidemaier, Christian Merten}

\begin{document}

\punkte

\begin{aufgabe} LIFO vs. FIFO
    \begin{enumerate}
        \item Kunden in einer Bäckerei

            FIFO: Der erste Kunde wird zu erst bedient
        \item Menschen in einem Aufzug

            LIFO: Der letzte Mensch verlässt den Aufzug als erstes (bei einer Tür)
        \item Lebensmittel in Ihrem Kühlschrank

            FIFO: Die ältesten Lebensmittel müssen als erstes verbraucht werden.
        \item Autos auf einer Autofähre

            Def. (Autofähre). Eine Fähre mit einer Auffahrt und einer Ausfahrt, jedes Auto
            befährt die Fähre nur vorwärts.

            FIFO: Das erste Auto steht ganz vorne auf der Fähre und verlässt diese als erstes
            auf der anderen Seite.
        \item Druckanträge auf einen Drucker

            FIFO: Der erste Druckauftrag wird als erstes ausgeführt.
        \item Besuchen der Knoten eines Baums nach dem Depth-First-Prinzip

            FIFO: Die Elemente, die als erstes dem Baum hinzugefügt wurden, also ganz oben
            stehen, werden bei der Depth-First-Suche auch als erstes ausgewertet.
        \item Rekursive Funktionsaufrufe

            LIFO: Der letzte Funktionsaufruf wird als erstes vollständig ausgewertet.
    \end{enumerate}
\end{aufgabe}

\begin{aufgabe}
    Hase und Igel
    \begin{enumerate}[a)]
        \item Wenn kein Zyklus vorliegt, wird der \textit{Hase} zuerst auf Null zeigen.
            Falls der Zeiger des \textit{Hasen} aber den \textit{Igel} überrundet, muss ein
            Zyklus vorliegen, Das wird dann erkannt, wenn \textit{Hase} und \textit{Igel} zum
            gleichen Zeitpunkt auf das selbe Element zeigen. Der Abstand von \textit{Hase} zu
            \textit{Igel} wird dabei immer kleiner, sodass dies in endlicher Zeit erreicht wird.

            Die Länge des Zyklus wird erkannt durch die Differenz der Schrittzahlen, des ersten
            Aufeinandertreffens und dem zweiten.
        \item siehe \textit{haseigel.cpp}
    \end{enumerate}
\end{aufgabe}

\begin{aufgabe}
    Warteschlangen
    \begin{enumerate}[a)]
        \item siehe \textit{queue\_einfach.cpp}
        \item siehe \textit{queue.cpp}
        \item Die Version der einfach verketteten Liste braucht ca. 2550 mal so lang, wie die zweite. Dies liegt
            an der Komplexität O(n) des Hinzufügens eines Elements für
            eine einfach verkettete Liste, da hier durch die ganze Liste iteriert werden muss, um das letzte
            Element zu finden. Bei einer doppelt verketteten Liste liegt eine Komplexität
            von O(1) vor, da hier direkt auf das letzte Element zugegriffen werden kann.
            Das Entfernen am Listenanfang ist immer eine O(1) Operation, weil hier direkt in beiden
            Fällen der Pointer auf das erste Element verwendet werden kann.
    \end{enumerate}
    
\end{aufgabe}

\end{document}
