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

Ähnliche Dokumente
(06 - Anwendungen von Stapeln und Schlangen)

Vorlesung Datenstrukturen

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Advanced Programming in C

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

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

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

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

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Algorithmen und Datenstrukturen (für ET/IT)

Kapitel 3: Datentyp Liste

II.3.1 Rekursive Algorithmen - 1 -

Große Übung Praktische Informatik 1

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

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

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einführung in die Programmierung

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Programmieren in Java

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Inhalte Informatik. I1 Grundprinzip des objektorientierten Modellierens I3 Modellieren von Netzwerkanwendungen

1 Polymorphie (Vielgestaltigkeit)

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

Programmierkurs Java

Geordnete Binärbäume

Abstrakte Datentypen.

2. Einfache Suchverfahren. Beispiel-Spezifikation in Java. Lineare Listen (2) Lineare Listen Sequentielle Suche Binäre Suche

Javakurs zu Informatik I. Henning Heitkötter

Java-Schulung Grundlagen

Überblick. Lineares Suchen

12. Rekursion Grundlagen der Programmierung 1 (Java)

Objektorientierte Programmierung

Einstieg in die Informatik mit Java

11. Rekursion, Komplexität von Algorithmen

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Datenstrukturen und Algorithmen

Algorithmen und Datenstrukturen

Informatik II, SS 2014

Datenstrukturen & Algorithmen

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Institut für Informatik

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

6 Speicherorganisation

Distributed Computing Group

Dr. Monika Meiler. Inhalt

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

Primitive Datentypen

JAVA KURS COLLECTION

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Suchen und Sortieren Sortieren. Heaps

Algorithmen und Datenstrukturen 1

Rekursion. Was heißt "rekursiv" Page 1. Eine Methode m() heißt rekursiv, wenn sie sich selbst aufruft. Beispiel: Berechnung der Fakultät (n!

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einführung in die Programmierung für Wirtschaftsinformatik

Einführung in die Informatik 2

Studentische Lösung zum Übungsblatt Nr. 7

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

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

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

368 4 Algorithmen und Datenstrukturen

Java Einführung Collections

Vorkurs Informatik WiSe 16/17

Repetitorium Informatik (Java)

Datenbankanwendungsprogrammierung Crashkurs Java

Programmieren in Java

Programmdokumentation

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Bäume, Suchbäume und Hash-Tabellen

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Rekursive Funktionen

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

Einstieg in die Informatik mit Java

3. Grundlegende Sprachkonstruktionen imperativer Programme

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Binärbäume. Prof. Dr. E. Ehses,

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

5. Tutorium zu Programmieren

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Musterlösungen zur Klausur Informatik 3

Allgemeine Informatik 2 im SS 2007 Programmierprojekt

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Objektorientierte Programmierung

Javakurs für Anfänger

Transkript:

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Elementare Datenstrukturen Autor: Stefan Edelkamp Institut für Informatik Georges-Köhler-Allee Albert-Ludwigs-Universität Freiburg

1 Überblick Überblick Datenstrukturen Arrays Listen Stapel/Stack Schlange/Queue: Mengen Überblick 1-1

2 Datenstrukturen Motivation: Wozu sind Datenstrukturen nützlich? Arrays mit Adressierung Listen mit - 4 verschiedenen Implementierungen Stapel/Schlangen - Anwendung Stapel: Towers of Hanoi - Anwendung Schlange: Topologische Sortierung Mengen dargestellt als - Bitvektoren Datenstrukturen 2-1

Algorithmen und Datenstrukturen Algorithmus: Endliche Sequenz von Instruktionen, die angeben, wie ein Problem gelöst werden soll. Datenstrukturen (DS): Dienen zur Organisation von Daten, um bestimmte Operationen (effizient) zu unterstützen. Hier und heute: Werden DS isoliert betrachtet, in der Praxis sind sie wichtige Bestandteile von Algorithmen. Verbindung: Datenstrukturen lassen sich vielfältig ineinander schachteln. Eignung: Demnach ist es stets nützlich, sich Anwendungs- und Nichtanwendungssituationen zu überlegen Unabhängigkeit: Darstellung im Grunde unabhängig von der Programmiersprache Konkretisierung: Imperative Programmiersprachen, speziell: Programmiersprache Java Datenstrukturen 2-2

3 Arrays 1-dimensional: Array a für den Bereich [1::n] sieht n Positionen für Daten des gewählten Typs vor. Darstellung im Rechner: Array der Länge n blegt die Speicherplätze an den n Positionen N + 1;:::N + n. Mit a[i] sprechen wir das Datum an Position N + i an. Wesentlich: Arrays erlauben den Zugriff auf Komponenten über einen (berechenbaren) Index Zugriffe: In Zeit O(1). Keine Unterstützung von Operationen vom Typ Nimm a[i] und füge es zwischen a[j] und a[j + 1] ein. 2-dimensional: Array [1::n 1 ] [1::n 2 ]. Arrayelement A[i][j] findet man an der Speicherplatzposition N + (i 1)n 2 + j k-dimensional: Array [1::n 1 ] :::[1::n k ] Element a[i 1 ] :::[i k ]findet sich an Speicherplatzposition N + 8 < : X 1jk 1 (i j 1) Y j<lk n l 9 = ; + i k Arrays 3-1

4 Listen Definition: Sei L = (a 1 ;a 2 ;:::;a n )geordnete Folge von Objekten eines bestimmten Typs, dann heißt: a 1 Anfangsobjekt (Kopf), a n Endobjekt (Schwanz), a i+1 Nachfolger von a i, a i Vorgänger von a i+1. Nachfolger von a n und Vorgänger von a 1 ist null. Falls n = 0 heißt die Liste leer. Operationen: insert(x; L): Füge das Objekt x in L ein. Ergebnis ist eine Liste. find(x; L): Falls x 2 L ist Antwort true, sonst false delete(x; L): Entferne x aus L. Falls x 62 L Fehlerbehandlung. Ergebnis ist eine Liste. Weiterhin: pred(x; L), succ(x; L), null(l), first(l), last(l), length(l), union(l 1 ;L 2 ;L), copy(l; L 0 ), split(x; L; L 1 ;L 2 ) Listen 4-1

Listenoperationen mit Zeigern Zeiger (Handle): p zum Zugriff, z.b. vom Typ Object Operationen: insert(x; p; L): Füge das Objekt x an Stelle p in L ein. Ergebnis ist eine Liste. delete(p; L): Entferne Element an Stelle p aus L. Ergebnis ist eine Liste. search(x; L): Liefert die erste Position als Zeiger, an der x in L vorkommt, und null, falls x in L nicht vorkommt Weiterhin: pred(p; L), succ(p; L), null(l), first(l), last(l), length(l), union(l 1 ;L 2 ;L), copy(l; L 0 ), split(p; L; L 1 ;L 2 ) Listen 4-2

Implementationen von Listen Version 1: Als Array. Zeiger p vom Typ int (in search: p = 0 falls nicht vorhanden). Version 2: Einfach verkettet, Listenende null a 1 a 2 - ::: - r L - - a n Version 3: Einfach verkettet, am Listenanfang und -ende ein dummy Element? - a1 - a2 - ::: - an - 6 head 6 tail Version 4: Doppelt verkettet, Listenanfang und Listenende null - - r a 1 a ::: - 2 a n r 6 head 6 tail Listen 4-3

Grundtypen und Knoten Der Grundtyp beinhaltet Schlüssel bzw. Datensatz public class Grundtyp { int key; // eventuell weitere Komponenten Grundtyp() { this.key = 0; Grundtyp(int key) { this.key = key; public boolean equals(grundtyp dat) { return this.key == dat.key; public String tostring() { StringBuffer st = new StringBuffer(""+key); return st.tostring(); Knoten dient zur Speicherung des Dateninhaltes und der (einfachen) Verkettung von Listenelementen. Wird ausschliesslich in der zugehörigen Listenklasse genutzt. class Knoten { Grundtyp dat; Knoten next; // Grundtyp // Zeiger auf Nachfolgerknoten Knoten(Grundtyp dat, Knoten next) { this.dat = dat; this.next = next; Listen 4-4

Arraydarstellung Liste repräsentiert als Array: public class Liste { Grundtyp[] L; int elzahl; Liste(int maxelzahl) { L = new Grundtyp[maxelzahl+1]; elzahl = 0; public int search(grundtyp x) { L[0] = x; int pos = elzahl; while (!L[pos].equals(x)) pos--; return pos; public void insert(grundtyp x, int p) { for (int pos=elzahl; pos >= p; pos--) L[pos+1] = L[pos]; L[p] = x; elzahl++; public void delete(int p) { elzahl--; for(int pos=p;pos<=elzahl;pos++) L[pos] = L[pos+1]; public String tostring () { StringBuffer st = new StringBuffer(""); for (int pos = 1; pos <= elzahl; pos++) st.append(pos == elzahl? L[pos].toString(): L[pos].toString()+", "); return st.tostring(); Listen 4-5

Dynamisch Liste implementiert als einfach verkettete Struktur: public class Liste { Knoten head; // Kopfelement Liste() { head = null; // leere Liste public void insert (Grundtyp x) { head = new Knoten(x,head); public boolean find(grundtyp x) { for (Knoten i = head;i!= null;i = i.next) if (i.dat.equals(x)) return true; return false; public void delete(grundtyp x) throws Exception { if (head.dat.equals(x)) head = head.next; for (Knoten i = head;i.next!= null;i = i.next) if (i.next.dat.equals(x)) { i.next = i.next.next; return throw new Exception("x kommt nicht vor"); public String tostring() { StringBuffer st = new StringBuffer(""); for (Knoten i = head;i!= null;i = i.next) st.append(i.next == null? i.dat.tostring() : i.dat.tostring()+", "); return st.tostring(); Listen 4-6

Verfeinerung... nach (Ottmann / Widmayer): public class Liste { Knoten head, tail; Liste() { Grundtyp dummy = new Grundtyp(); head = new Knoten(dummy,null); tail = new Knoten(dummy,head); head.next = tail; public void insert (Grundtyp x, Knoten p) { Knoten hilf; if (p == tail) hilf = tail; else hilf = p.next; p.next = new Knoten(p.dat,hilf); p.dat = x; if (p == tail) tail = tail.next; if (hilf == tail) tail.next = p.next; public void delete (Grundtyp x) throws Exception { tail.dat = x; Knoten pos = head; while(!pos.next.dat.equals(x)) pos = pos.next; if (pos.next!= tail) pos.next = pos.next.next; else throw new Exception("x kommt nicht vor"); if (pos.next == tail) tail.next = pos; public Knoten search(grundtyp x) { tail.dat = x; Knoten pos = head; do pos = pos.next; while (!pos.dat.equals(x)); if (pos == tail) return null; return pos; Listen 4-7

Veranschaulichung von Listenoperationen Einfache Verkettung Vor dem Einfügen 6 head - a1 - :::- ap 1 - ap - :::- an -? 6 tail Nach dem Einfügen 6 head - a1 - ::: - ap 1 - x - ap - ::: - an -? 6 tail Doppelte Verkettung Löschen in doppelt verketteter Liste: ::: - - ::: a p 1 a p 6 p - - a p+1 ::: ::: Listen 4-8

Doppelte Verkettung public class Knoten { Grundtyp dat; // Grundtyp Knoten next; // Zeiger auf Nachfolgerknoten Knoten prev; // Zeiger auf Vorgaengerknoten... public class Liste { Knoten head, tail; Liste() { head = null; tail = null; public void insert (Grundtyp x) { if (head == null) head = tail = new Knoten(x,null,null); else insert(x,head); public void insert (Grundtyp x, Knoten p) { Knoten hilf = new Knoten(x,p.next,p); p.next = hilf; if (hilf.next == null) tail = hilf; else hilf.next.prev = hilf; public void delete (Grundtyp x, Knoten p) { if (p == head) head = p.next; p.prev.next = p.next; if (p == tail) tail = p.prev; p.next.prev = p.prev; public Knoten search(grundtyp x) { for (Knoten i = head;i!= null;i = i.next) if (i.dat.equals(x)) return i; return null; Listen 4-9

5 Stapel/Stack LIFO Speicher Operationen empty, push, pop (, peek) maxelzahl top r 2 1 0 9 >= >; frei 9 >= >; 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 peek() throws EmptyStackException; public Object pop() throws EmptyStackException; public Object push(object item); public int search(object o) Stapel/Stack 5-1

Beispiel: Tower-of-Hanoi Problem Problem: n Scheiben: 1; 2; 3;:::;n, 3Pfeiler: A,B,C (1,2,3). Invarianz: Immer kleinere Scheibe auf der Größeren. A B C TOH: Live-Vorführung Stapel/Stack 5-2

Rekursive Lösung class Pfeiler { String name; Pfeiler(String n) { name=n; public String tostring(){ return name; public class ToHP { static long count = 0; static Pfeiler A, B, C; public static void main (String args[]){ int n = Integer.parseInt (args[3]); A = new Pfeiler (args[0]); B = new Pfeiler (args[1]); C = new Pfeiler (args[2]); umschichten (n, A, B, C); System.out.println(count+" Scheibenbewegungen."); public static void umschichten (int n, Pfeiler von, Pfeiler nach, Pfeiler mit) { if (n > 0) { umschichten(n-1,von, mit, nach); System.out.println(von+" --> "+nach); count++; umschichten(n-1,mit, nach, von); Stapel/Stack 5-3

Aufrufbaum Tupel der Form: (n; von; nach; mit) : 4,1,2,3 3,1,3,2 3,3,2,1 2,1,2,3 2,2,3,1 1,1,3,2 1,3,2,1 1,2,1,3 1,1,3,2 Stackreihenfolge: +--+ +--+ +--+ +--+ Problem: Ausgabe in inneren Knoten Stapel/Stack 5-4

Spezielle Stackimplementierung für TOH Genauer: Lineare Liste ohne explizites Knotenelement class TohStack { int [] arr; TohStack next; TohStack (){ next = null; // Konstruktor 1 TohStack (int [] a, TohStack n){ // Konstruktor 2 arr = a; next = n; public boolean empty () { return next == null; public void push (int a, int b, int c, int d) { int [] A = { a, b, c, d ; if ( empty () ) next = this; else next = new TohStack(arr, next); arr = A; public int [] pop (){ int [] a = arr; if ( next == this ) next = null; else { arr = next.arr; next = next.next; return a; Stapel/Stack 5-5

Testen: Tower-of-Hanoi-Stack Idee: Auflösung der Rekursion durch Verwaltung der lokalen Variablen auf einem Stack. public class tohstacktest { public static void main (String args[]) { TohStack s = new TohStack (); s.push (Integer.parseInt(args[0]), 1, 2, 3); while (!s.empty ()) { 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]); // > javac tohstacktest.java // > java tohstacktest 4 // bewege Scheibe Nr. 1 von Pfeiler 1 nach 3 // bewege Scheibe Nr. 2 von Pfeiler 1 nach 2 // bewege Scheibe Nr. 1 von Pfeiler 3 nach 2 //... Stapel/Stack 5-6

6 Schlange/Queue: FIFO Speicher: empty, enqueue, dequeue frei 0 size-1 6 tail @@ @ Schlange class Queue { Object element[]; int lastop, tail, head, size; static final int deque = 1; static final int enque = 0; 6 head 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... Schlange/Queue: 6-1

Operationen 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; Test 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); Schlange/Queue: 6-2

Anwendung: Topologische Sortierung Definition: Die Relation ist eine vollständige bzw. partielle Ordnung auf M, wenn (1)-(4) bzw. (2)-(4) gelten. (1) 8x; y 2 M : x y oder y x (2) 8x 2 M : x x (3) 8x; y 2 M : x y und y x ) x = y (4) 8x; y 2 M : x y und y z ) x z 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äßt sich topologisch sortieren. Beweisidee: Es genügt, die Existenz eines minimalen Elements z in M zu zeigen. z muß nicht eindeutig sein. Wähle m 1 = z und sortiere M fzg topologisch. Schlange/Queue: 6-3

Verwendete Datenstrukturen A: Array der Länge n, A[i] natürliche Zahl V : Array der Länge n, V [i] Zeiger auf L[i] L[i]: Liste von Zahlenpaaren Q: Queue (Schlange), die ebenfalls Zahlen enthält Algorithmus: Eingabe: p Paare (i; j), mitx i x j und M = fx 1 ;:::;x n g (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 6= fg j = Q.dequeue() Gebe x j aus Durchlaufe L[j]: Wird 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. Schlange/Queue: 6-4

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] V: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 1 2 3 4 5 6 7 8 9 -----------+--------------------------- {1,9 0 1 1 2 1 2 2 2 0 Schlange/Queue: 6-5

7 Mengen Unterscheidung: Bitvektordarstellung und Listendarstellung Eignung: Bitvektordarstellung für feste Grundmenge G = f1;:::;ng. und (relativ) großen Teilmengen M von G. Bitvektor-Darstellung: M durch Array A mit Operationen: A[i] = 1, i 2 M, und A[i] = 0 sonst. - i 2 M? -füge i zu M hinzu? - entferne i aus M? - M = M 1 [ M 2? - M = M 1 \ M 2? - M = M 1 M 2? - M = M 1 M 2? Machinenwortdarstellung: w Bits in einem Machinenwort. Komplexität entweder O(1) oder O(dn=we) Mengen 7-1

Überblick, 2 Algorithmen und Datenstrukturen, 4 Anwendung: Topologische Sortierung, 23 Arraydarstellung, 10 Arrays, 5 Aufrufbaum, 18 Beispiel:, 25 Beispiel: Tower-of-Hanoi Problem, 16 Datenstrukturen, 3 Doppelte Verkettung, 14 Dynamisch, 11 Grundtypen und Knoten, 9 Implementationen von Listen, 8 Listen, 6 Listenoperationen mit Zeigern, 7 Mengen, 26 Operationen, 22 Rekursive Lösung, 17 Schlange/Queue:, 21 Spezielle Stackimplementierung für TOH, 19 Stapel/Stack, 15 Testen: Tower-of-Hanoi-Stack, 20 Veranschaulichung von Listenoperationen, 13 Verfeinerung, 12 Verwendete Datenstrukturen, 24