\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}