(06 - Anwendungen von Stapeln und Schlangen)



Ähnliche Dokumente
Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp/B. Nebel

ALP II Dynamische Datenmengen Datenabstraktion

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

1 Abstrakte Datentypen

Übung Algorithmen und Datenstrukturen

16. Dynamische Datenstrukturen

Kapitel 4: Datentyp Keller und Schlange

5.3 Doppelt verkettete Listen

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Schnittstellen, Stack und Queue

13. Dynamische Datenstrukturen

Vorlesung Datenstrukturen

Spezielle Datenstrukturen

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Übung Algorithmen und Datenstrukturen

Kapitel 3: Datentyp Keller und Schlange

Algorithmen und Datenstrukturen

3 Dynamische Datenstrukturen

ALP II Dynamische Datenmengen

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

7. Verkettete Strukturen: Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

1 of :17:14

Algorithmen und Datenstrukturen

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

ADT: Verkettete Listen

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

ADT: Verkettete Listen

Informatik II, SS 2014

Informatik II Übung 5 Gruppe 3

11. Elementare Datenstrukturen

12. Rekursion Grundlagen der Programmierung 1 (Java)

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Algorithmen und Programmierung III

Algorithmen und Datenstrukturen Kapitel 4 Neue Datenstrukturen, besseres (?) Sortieren

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

ADT: Verkettete Listen

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Algorithmen und Datenstrukturen (für ET/IT)

Teil IV. Grundlegende Datenstrukturen

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

12. Dynamische Datenstrukturen

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

Programmieren 2 15 Abstrakte Datentypen

Algorithmen und Datenstrukturen 1

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Feld. Definition Feld

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Informatik II Übung, Woche 14

SS10 Algorithmen und Datenstrukturen 2. Kapitel Fundamentale Datentypen und Datenstrukturen

Software Entwicklung 1

Informatik II Prüfungsvorbereitungskurs

Klausur zur Informatik A WS 2001/2002 Name: Korrektor: Punkte: a) Zeichnen Sie zu der nachstehenden Syntax in EBNF die passenden Syntaxdiagramme.

Tutoraufgabe 1 (Implementierung eines ADTs):

Programmieren 2 Java Überblick

ihrer Klasse benötigt die Funktion einfuegenan:

Software Entwicklung 1

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Feld. Feld als sequentielle Liste

Informatik II, SS 2016

Datenstrukturen (66) Programmieren 2 - H.Neuendorf

Nachtrag: Vergleich der Implementierungen von Stack

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

B2.1 Abstrakte Datentypen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Java. Wir verwenden oft Java für Datenstrukturen und Algorithmen. Die Vorlesung ist aber von der Programmiersprache unabhängig.

Abstrakte Datentypen und deren Implementierung in Python

Konkatenation zweier Listen mit concat

6. Verkettete Strukturen: Listen

Stapel (Stack, Keller)

Informatik II Prüfungsvorbereitungskurs

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Feld als sequentielle Liste. Definition Feld

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Programmieren 2 Übung Semesterwoche 2

Algorithmen und Datenstrukturen (für ET/IT)

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

4.2 Daten und Datenstrukturen

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Informatik II Übung 5

Algorithmen und Datenstrukturen Einfache Datenstrukturen

11 Abstrakte Datentypen

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

11 Abstrakte Datentypen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Fallstudie: Online-Statistik

Transkript:

Vorlesung Algorithmen und Datenstrukturen (06 - Anwendungen von Stapeln und Schlangen) Prof. Dr. Susanne Albers

Lineare Listen (1) Lineare Anordnung von Elementen eines Grundtyps (elementarer Datentyp oder Grundklasse, etwa Object) Grundtyp ist oft weiter strukturiert, etwa class Grundklasse { int key; // eindeutiger Schlüssel Infoklasse info; // weitere Informationen Bsp: Liste von Zahlen, Zeichenkette Operationen (Methoden) Initialisieren (leere Liste,... ) Länge bestimmen Suchen (inhaltsbasiert), kann aktuelles Element festlegen Positionieren (nach laufender Nummer),... Einfügen, an gegebener oder aktueller Position Entfernen,... Verketten, Ausgeben, Teilliste bilden, Umkehren,... 2

Implementierungen für Lineare Listen (1) Mit Hilfe von Arrays: n a1 a a 2 n Eigenschaften dieser Lösung: - Maximale Anzahl von Elementen vorgegeben (Länge des Arrays) Abhilfe: Dynamisierung - Schlechte Speicherplatzausnutzung für kurze Listen - Teure Verschiebeoperationen beim Einfügen/Entfernen von Elementen + Direkter Zugriff auf feste Positionen 3

Implementierungen für Lineare Listen (2) Zyklische Speicherung mit Hilfe von Arrays: Richtung leer an a1 an Ende Ende Richtung leer a 1 Anfang leer Anfang Besondere Eigenschaften dieser Lösung: + Einfügen/Entfernen an den Listenenden in konstanter Zeit + Umkehren der Liste in konstanter Zeit 4

Implementierungen für Lineare Listen (3) Mit Hilfe einfach verketteter (verlinkter) Elemente: speichere mit jedem Element einen Verweis auf das nächste oder null, falls das Element nicht existiert: Knoten: Inhalt Verweis class node { Grundklasse content; node next; Liste L: Verweis auf das erste Element der Kette... L Besondere Eigenschaften dieser Lösung: + Länge der Liste kann sich beliebig ändern - Kein direkter Zugriff auf Element an der Position p mehr möglich; nur Durchlaufen der Liste in O(p) 5

Implementierungen für Lineare Listen (4) Mit Hilfe doppelt verketteter (verlinkter) Elemente: speichere mit jedem Element zwei Verweise auf das vorherige und nächste Element oder null, falls ein Element nicht existiert. Liste:... head tail Besondere Eigenschaften dieser Lösung: + Umkehren der Liste in Θ(1) + Entfernen von Elementen leichter machbar Θ(1) + Einfügen/Entfernen/Zugriff am Anfang/Ende in Θ(1) + Hintereinanderhängen von Listen in Θ(1) 6

Stacks (Stapel) und Queues (Schlangen) (1) L a,..., 1 an Operation Wirkung Stack Queue Einfügungen L.pushHead(x) L.pushTail(x) Enfernungen L.popHead() L.popTail() Lesen L.top() L.bottom() x, a1,..., an a1,..., an, x a2,..., an a 1 a2,..., an 1 an a 1 a n Diverses L.init() L.empty() ( L ) 7

Stapel/Stack LIFO Speicher Operationen empty, push, pop, top Maxelzahl top 2 1 0 frei Stapel Implementation: In Java in der Klassenbibliothek vorhanden: java.util.stack public class Stack extends Vector { // Default Constructor: public Stack() // Public Instance methods public boolean empty(); public Object top() throws EmptyStackException; public Object pop() throws EmptyStackException; public Object push(object item); public int search(object o) 8

Anwendungen für Stacks (Stapel) (1) Erkennen balancierter Klammerausdrücke (a(b)) Lesen von ( push ("("), Lesen von ) pop ("("), Ausdruck korrekt, wenn Stack am Ende leer. Evaluierung korrekt geklammerter Ausdrücke ((a + b)*(c + d)) + f Iterierte Auswertung rekursiver Funktionen (Methoden). Jede Instanz der Funktion kann auf dem Stack Übergabeparameter, lokale Variablen und Returnwerte ablegen oder entnehmen. Schema dabei: 1. Initialisiere Stack mit dem Anfangsproblem (der zu lösenden Aufgabe) 2. Solange Stack nicht leer: Nimm das oberste Problem vom Stack und löse es. Fallen bei der Bearbeitung wieder Teilprobleme an, lege sie ebenfalls auf den Stack. 3. Wenn Stack leer: Das Problem ist gelöst. 9

10 Anwendungen für Stacks (Stapel) (2) Auswerten einer rekursiv definierten Funktion: Binomialkoeffizient,sonst 1 1 1 0 1, falls 1, falls k n k- n- k k n k n

Anwendungen für Stacks (Stapel) (3) Ackermann-Funktion: A(0,y) = y+1 A(x+1,0) = A(x,1) A(x+1,y+1) = A(x, A(x+1,y)) 11

Anwendungen für Stacks (Stapel) (4) Beispiel: Die Türme von Hanoi (TOH) Bewege n unterschiedlich große Scheiben von Pfahl 1 nach Pfahl 2 mit Hilfe von Pfahl 3. Nie darf eine größere Scheibe auf einer kleineren liegen. Zu jedem Zeitpunkt darf nur eine Scheibe bewegt werden. Codierung für die genannte Problemstellung: n, 1, 2, 3 Bewege Scheibe Nr. n direkt (falls frei) von 1 nach 2, Codierung: -n, 1, 2, 0 1. Initialisierung: s.push(n,1,2,3) 2. Wenn s.pop() n, a, b, c liefert, dann falls (n < 0): Bewege Scheibe Nr. n von a nach b. falls (n = 0): nichts falls (n > 0): s.push(n-1,c,b,a); (zuletzt) s.push(-n,a,b,0); (dann) s.push(n-1,a,c,b); (zuerst) 12

Die Türme von Hanoi 13

Bsp.: Die Türme von Hanoi (1) class ArrNode { // Knoten fuer TOH-Stack private int [] content; private ArrNode next; ArrNode (int [] a, ArrNode n){ // Konstruktor content = a; next = n; public int [] getcontent (){ return content; public ArrNode getnext(){ return next; // ArrNode 14

Bsp.: Die Türme von Hanoi (2) class TohStack { // der Stack fuer TOH ArrNode Head; TohStack (){ // Konstruktor Head = null; public boolean empty (){ // Test ob leer return Head == null; public void push (int a, int b, int c, int d){ int [] arr = { a, b, c, d ; Head = new ArrNode (arr, Head); public int [] pop (){ ArrNode h = Head; Head = Head.getNext(); return h.getcontent (); // TohStack 15

Bsp.: Die Türme von Hanoi (3) public class TohStackTest { public static void main (String args[]){ TohStack s = new TohStack (); s.push (Integer.parseInt (args[0]),1,2,3); // Startproblem while (!s.empty () ) { // Iteration statt Rekursion int [] a = s.pop (); if (a[0] < 0) System.out.println ( "bewege Scheibe Nr. "+(-a[0])+ " von Pfeiler "+a[1]+" nach "+a[2]); else if (a[0]!= 0) { s.push (a[0]-1, a[3], a[2], a[1]); s.push ( -a[0], a[1], a[2], 0 ); s.push (a[0]-1, a[1], a[3], a[2]); // TohStackTest 16

Schlange/Queue FIFO Speicher: empty, enqueue, dequeue frei 0 size-1 tail head Schlange class Queue { Object element[]; int lastop, tail, head, size; static final int deque = 1; static final int enque = 0; Queue(int sz) { size = sz; head = 0; tail = size-1; lastop = deque; element = new Object[sz]; public boolean empty(){ return head==(tail+ 1)%size; public void enqueue(object elem) throws Exception... public Object dequeue() throws Exception... 17

Operationen Test public void enqueue(object elem) throws Exception { if ((head == (tail+1)%size) && lastop == enque) throw new Exception("Queue full"); lastop = enque; tail = (tail + 1) % size; element[tail] = elem; public Object dequeue() throws Exception { if ((head == (tail+1)%size) && (lastop == deque)) throw new Exception("Queue empty"); Object temp = element[head]; lastop = deque; head = (head + 1) % size; return temp; public static void main(string argv[]) { Queue Q = new Queue(10); try { Q.enqueue(new String("Haus")); Q.enqueue(new Integer(10)); Object o = Q.dequeue(); System.out.println(o); catch (Exception e) { System.out.println(e); 18

Anwendung: Topologische Sortierung Definition: Die Relation ist eine vollständige bzw. partielle Ordnung auf M, wenn (1)-(4) bzw. (2)-(4) gelten. (1) x, y M: x y oder y x (Vollständigkeit) (2) x M: x x (Reflexivität) (3) x, y M: Wenn x y und y x, so ist x = y. (Antisymmetrie) (4) x, y, z M: Wenn x y und y z, dann ist x z (Transitivität) Beispiel: Potenzmenge 2 M einer Menge M bezüglich Teilmengenrelation partiell aber nicht vollständig geordnet. Topologische Sortierung: Gegeben M und partiell. Gesucht: Einbettung in vollständige Ordnung, d.h. die Elemente von M sind in eine Reihenfolge m 1,...,m n zu bringen, wobei m i m j für i < j gilt. Lemma: Jede partiell geordnete Menge lässt sich topologisch sortieren. Beweisidee: Es genügt, die Existenz eines minimalen Elements z in M zu zeigen. z muss nicht eindeutig sein. Wähle m 1 = z und sortiere M {z topologisch. 19

Verwendete Datenstrukturen A : Array der Länge n, A[i] natürliche Zahl L[i] : Liste von Zahlenpaaren Q : Queue (Schlange), die ebenfalls Zahlen enthält Algorithmus : Eingabe : p Paare (i,j) mit x i x j und M = {x 1,...,x n (1) Setze alle A[i] auf 0, alle L[i] und Q seien leer (2) Wird (j,k) gelesen, wird A[k] um 1 erhöht und in L[j] eingetragen. (3) Durchlaufe A: Schreibe alle k mit A[k] = 0 in Q (4) While Q { j = Q.dequeue() Gebe x j aus Durchlaufe L[j]: Wird (j,k) gefunden, wird A[k] um 1 verringert. Falls A[k] = 0 ist, Q.enqueue(k) Satz : Der Algorithmus löst das Problem Topologische Sortierung in O(n+p) Zeit. 20

Beispiel Eingabe: (1,3), (3,7), (7,4), (4,6), (9,2), (9,5), (2,8), (5,8), (8,6), (9,7), (9,4) Datenstruktur nach der Vorverarbeitung: 21

Beispiel Eingabe: (1,3), (3,7), (7,4), (4,6), (9,2), (9,5), (2,8), (5,8), (8,6), (9,7), (9,4) Datenstruktur nach der Vorverarbeitung: 1 2 3 4 5 6 7 8 9 A: [0 1 1 2 1 2 2 2 0] L: 1,3 2,8 3,7 4,6 5,8 7,4 8,6 9,2 9,5 9,7 9,4 Ablauf des Algorithmus: Q -----------+--------------------------- Out 22