ÜbungAlgorithmenundDatenstrukturen Sommersemester 2016 PatrickSchäfer,Humboldt-Universität zuBerlin Agenda 1. 2. 3. Fragen zum zweiten Übungsblatt? Vorbesprechung des dritten Übungsblatts Beispielaufgaben 2 Doppelt verkettete sortierte Liste −∞ FIRST 10 20 70 ListNode 99 ∞ LAST SortedList 3 Knoten: ListNode prev next value public class ListNode { // Der Wert des Knoten public int value; ListNode } // Zeiger auf den Nachfolger // und den Vorgänger public ListNode next; public ListNode prev; 4 Doppelt verkettete sortierte Liste: SortedList −∞ FIRST ListNode 20 ∞ • Die leere Liste enthält immer den Start- und Endknoten. LAST ListNode ListNode SortedList public class SortedList implements LinkedList { public ListNode first; public ListNode last; } 5 Einfügen SortedList FIRST −∞ 10 70 Löschen der20 FIRST −∞ 10 99 ∞ LAST 99 ∞ LAST Einfügen der20 20 70 SortedList 6 Skip-Listen SkipList ObersteEbene FIRST −∞ 20 FIRST −∞ 20 UntersteEbene FIRST −∞ 10 20 70 ∞ LAST 99 ∞ LAST 99 ∞ LAST SortedList 7 Knoten: ListNode up prev next public class ListNode { // Der Wert des Knoten public int value; value // Zeiger auf den Nachfolger // und den Vorgänger public ListNode next; public ListNode prev; down ListNode } // Zeiger auf die obere // und untere Ebene public ListNode up; public ListNode down; 8 Skip-Liste: SkipList topLayer FIRST LAST −∞ ∞ SortedList −∞ FIRST 20 SortedList ∞ LAST public class SkipList implements LinkedList { SortedList topLayer; } • Jede Ebene repräsentiert eine sortierte doppelt verkettete Liste. • Start- und Endknoten benachbarter Ebenen sind miteinander verbunden. • Kommt ein Knoten auf einer oberen Ebene vor, so kommt er auch auf allen darunter liegenden Ebenen vor. • Alle Werte kommen auf der untersten Ebene vor. 9 Skip-Listen: Suchen SkipList ObersteEbene FIRST −∞ 20 FIRST −∞ 20 UntersteEbene FIRST −∞ 10 20 70 ∞ LAST 99 ∞ LAST 99 ∞ LAST SortedList 10 Skip-Listen: Einfügen SkipList ObersteEbene FIRST −∞ 20 FIRST −∞ 20 ∞ LAST 80 99 ∞ LAST 99 ∞ LAST 50% UntersteEbene FIRST −∞ 10 20 70 80 SortedList 11 Übungsaufgabe: Kreise suchen Gegeben sei eine einfach verkettete Liste. Nun möchte man seine Liste dahingehend überprüfen, ob es (z.B. durch einen Bug in der Implementierung) zu Schleifen gekommen ist. Wie geht das möglichst effizient? 12 Übungsaufgabe: Kreise suchen Algorithmus𝑓𝑖𝑛𝑑𝑒𝐾𝑟𝑒𝑖𝑠(𝑙) Input: Listel Output: Boolean (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) slow =l.first() fast=l.first() while (fast!=NULLand fast.next !=NULL) do slow =slow.next //einSchritt fast=fast.next.next //zwei Schritte if(slow==fast)then returntrue endif endwhile return false; • Zwei Pointer durchlaufen die List. In jeder Runde geht ein der einen Schritt und der zweite zwei Schritte. • Sobald der schnelle Pointer den langsamen Pointer überrundet gibt es eine Schleife. • Falls der schnelle Pointer bei NULL ankommen ist, gibt es keine Schleife. 13 Tiefensuche Algorithmus𝑑𝑓𝑠(𝑠𝑡𝑎𝑟𝑡,𝑏𝑒𝑠𝑢𝑐ℎ𝑡) Input: Arraybesucht, Integerstart Output: (1) (2) (3) (4) (5) (6) besucht[start]=true;//start wurdebesucht foreach (knotenin nachbarn(start)){//alleNachbarn if (!besucht[knoten]) then //neuerKnoten DFS(knoten, besucht); endif endforeach • Verfolgt einen Pfad so weit wie möglich. • Die zu verarbeitenden Knoten werden in LIFOReihenfolge (last-in first-out / Stack) verarbeitet. • Es gibt zwei Verarbeitungsstufen: 1. Wenn der Knoten als Nachfolger entdeckt wird. 2. Wenn der Knoten abgearbeitet wird. 14 Beispiel: Tiefensuche Algorithmus𝑑𝑓𝑠(𝑠𝑡𝑎𝑟𝑡,𝑏𝑒𝑠𝑢𝑐ℎ𝑡) Ende Input: Arraybesucht, Integerstart Output: (1) (2) (3) (4) (5) (6) besucht[start]=true;//start wurdebesucht foreach (knotenin nachbarn(start)){//alleNachbarn if (!besucht[knoten]) then //neuerKnoten DFS(knoten, besucht); endif endforeach Start 15 Aufgabe: Dynamische Programmierung • Wie kann geprüft werden, ob das Ziel erreicht wurde? • Wie wird der gefundene Weg zurückgegeben? • Wie könnten Hindernisse beachtet werden? 16 Zusatzaufgabe Übungsaufgabe: Suche 1 + 2 + 3 + 2 = 8 Zusatzpunkte Als Redakteur einer Handy-Zeitschrift möchten Sie ein neues Als Redakteur einer Handy-Zeitschrift möchten Sie ein neues Smartphone auf seine Bruchtauglichkeittesten. testen. Sie Ihr haben Testaufbau Smartphone auf seine Bruchtauglichkeit 𝑘 besteht aus Smartphones einer Leiter mit n Sprossen, Smartphones undkeine Leiter mitund 𝑛 Sprossen, durchnummeriert vonvon 1 bis 𝑛. Innach jedem steigen Sie durchnummeriert unten obenVersuch von 1 bis n. In jedem n auf eine Sprosse und lassen ein Smartphone gerade nach steigen das Sie auf eine Sprosse und lassen einFall Smartunten Testversuch fallen. Entweder Smartphone übersteht den von der Sprossenh öhe ausauseinander. gerade nach unten fallen. Entvöllig phone unbeschadet oder es bricht weder das übersteht den Fallbei völlig Sie möchten dieSmartphone höchste Sprosse ermitteln, derunbeschadet ein (und kann für bricht. weitere Tests wiederverwendet werden), oder es Smartphone nicht auseinander. i Da derbricht Redaktionsschluss naht, stehen Sie unter Zeitdruck und möchten die Anzahl der Testversuche minimieren. Konkret möchten Sie die höchste Nummer einer Anzahl Sprosse eri Anderseits kosten Smartphones viel Geld undi ihre mitteln, bei der ein Smartphone nicht bricht. (Alle Smartphones muss auch minimiert werden. Um die Balance zwischen Zeit und Geld zuund verstehen, untersuchen Sie im Folgenden sind besser baugleich zerbrechen ab der gleichen Sprosse.) Falls das Problem für verschiedene 𝑘. das Smartphone bereits ab der ersten Sprosse bricht, geben Sie 1 Geben0 Sie für jeden der folgenden Fälle ein Verfahren an, zurück. dass die Anzahl der Testversuche im Worst-Case minimiert und höchstens 𝑘 Smartphones verwendet: Da der Redaktionsschluss naht, stehen Sie unter Zeitdruck und möchten die Anzahl der Testversuche minimieren. Anderseits kosten Smartphones viel Geld und ihre Anzahl will auch minimiert a)𝑘werden. = 1 Um die Balance b)𝑘 zwischen = ∞ Zeit undc) 𝑘= 2 zu verstehen, untersuchen Sie im Folgenden Geld besser 17 Übungsaufgabe: Suche Sequentiell BinäreSuche 10 9 8 7 6 5 4 3 2 1 10 9 8 X 7 6 5 4 3 2 1 1 Kosten:2 ∑>?@A 𝑖 + 7 Sprung Suche (7 + 6)/2 (10 + 6)/2 (10 + 1)/2 Kosten:2(5 + 8) + 7 10 9 X 8 7 6 5 4 3 2 1 1 10 10 Kosten:2 3 + 6 + 9 + 7 18