Algorithmen I Sascha Witt 10.05.2017 Institut für Theoretische Informatik Web: https://crypto.iti.kit.edu/index.php?id=799 (Folien von Peter Sanders) KIT Institut für Theoretische Informatik 1
Erinnerung VL vom 08.05.2017 Letztes Mal: Heute: Folgen als Listen Folgen als Felder (Arrays), beschränkt / unbeschränkt Amortisierte Analyse Weitere Repräsentationen von Folgen Motivation Hashtabellen KIT Institut für Theoretische Informatik 2
Stapel und Schlangen einfache Schnittstellen vielseitig einsetzbar austauschbare, eziente Implementierungen wenig fehleranfällig stack... FIFO queue... popfront pushfront deque... pushback popback KIT Institut für Theoretische Informatik 3
Stapel Operationen: push/pop, entsprechen pushfront/popfront oder pushback/popback für Folgen a b c d pop b c d push x x b c d KIT Institut für Theoretische Informatik 4
Stapel Implementierungsvarianten Operationen: push/pop, entsprechen pushfront/popfront oder pushback/popback für Folgen List: OK aber doppelte Verkettung ist overkill SList: mittels pushfront/popfront. Endezeiger unnötig, dummy item unnötig UArray: mittels pushback/popback. Cache-ezient aber nur amortisierte konstante Laufzeit pro Operation In der Vorlesung Algorithm Engineering lernen wir bessere Implementierungen kennen. a b c d pop b c d push x x b c d KIT Institut für Theoretische Informatik 5
Stapel Anwendungen Rekursion Klammerstrukturen,..., Parser Daten irgendwie ablegen und wieder herausholen KIT Institut für Theoretische Informatik 6
Warteschlangen / First-In-First-Out / FIFO Operationen: enqueue/dequeue, entsprechen pushfront/popback oder pushback/popfront für Folgen Beispiel: a b c enqueue dequeue x a b c x a b x c KIT Institut für Theoretische Informatik 7
FIFO Implementierungsvarianten Operationen: enqueue/dequeue, entsprechen pushfront/popback oder pushback/popfront für Folgen List: OK aber doppelte Verkettung ist overkill SList: mittels pushback/popfront. Endezeiger wichtig, dummy item unnötig Array,UArray: scheinbar nicht ezient möglich CArray: zyklisches Array In der Vorlesung Algorithm Engineering lernen wir bessere Implementierungen kennen. KIT Institut für Theoretische Informatik 8
Class BoundedFIFO(n : N) of Element b : Array [0..n] of Element // CArray h=0 : N // head t=0 : N // tail Function isempty : {0, 1}; return h = t h n 0 Function rst : Element; assert isempty; return b[h] Function size : N; return (t h + n + 1) mod (n + 1) Procedure pushback(x : Element) assert size< n b[t] := x t := (t + 1) mod (n + 1) Procedure popfront assert isempty; h := (h + 1) mod (n + 1) Einsparung von einem Element durch gesonderte Variable s (für size) b t KIT Institut für Theoretische Informatik 9
Warteschlangen Anwendungen Datenpuer für Netzwerke Pipeline-Verarbeitung Job-Queues (Fairness...) Breitensuche in Graphen (siehe Kapitel 9.1) KIT Institut für Theoretische Informatik 10
Deque Double-Ended Queues Aussprache wie dek. List: OK SList: Nein (aber push/pop-front und pushback OK) Array,UArray: Nein CArray: Ja KIT Institut für Theoretische Informatik 11
Deque Anwendungen Relativ selten. Oft werden nur 3 der vier Operationen benötigt. Work Stealing Load Balancing Undo/Redo Operationspuer KIT Institut für Theoretische Informatik 12
Vergleich: Listen Felder Vorteile von Listen exibel remove, splice,... kein Verschnitt Vorteile von Feldern beliebiger Zugri einfach kein Overhead für Zeiger Cache-ezientes scanning KIT Institut für Theoretische Informatik 13
Operation List SList UArray CArray explanation ` ' [ ] n n 1 1 1 1 1 1 not with inter-list splice rst 1 1 1 1 last 1 1 1 1 insert 1 1 n n insertafter only remove 1 1 n n removeafter only pushback 1 1 1 1 amortized pushfront 1 1 n 1 amortized popback 1 n 1 1 amortized popfront 1 1 n 1 amortized concat 1 1 n n splice 1 1 n n ndnext,... n n n n cache-ecient KIT Institut für Theoretische Informatik 14
Ausblick: Weitere Repräsentationen von Folgen Hashtabellen: schnelles Einfügen, Löschen und Suchen Kapitel 4 Prioritätslisten: schnelles Einfügen, Minimum Entfernen Kapitel 6 Suchbäume,... : sortierte Folgen einfügen, löschen, suchen, Bereichsanfragen,... Kapitel 7 KIT Institut für Theoretische Informatik 15
Hashing (Streuspeicherung) to hash völlig durcheinander bringen. Paradoxerweise hilft das, Dinge wiederzunden KIT Institut für Theoretische Informatik 16
Hashtabellen speichere Menge M Element. key(e) ist eindeutig für e M. unterstütze Wörterbuch-Operationen in Zeit O(1). M.insert(e : Element): M := M {e} M.remove(k : Key): M := M \ {e}, key(e) = k M.nd(k : Key): return e M with key(e) = k; falls nichts gefunden Anderes Interface: map/partielle Funktion Key Element M[k] = M.nd(k) KIT Institut für Theoretische Informatik 17
Exkurs: Konventionen für Elemente Viele Datenstrukturen repräsentieren Mengen (engl. auch collection classes). Die Mengenelemente e haben Schlüssel key(e). Elementvergleich hier gleichbedeutend mit Schlüsselvergleich. e = e gdw. key(e) = key(e ) (analog für e < e und e > e ). KIT Institut für Theoretische Informatik 18
Hashing: Anwendungen Auslieferungsregale der UB Karlsruhe Entfernen exakter Duplikate Schach (oder andere kombinatorische Suchprogramme): welche Stellungen wurden bereits durchsucht? Symboltabelle bei Compilern Assoziative Felder bei Script-Sprachen wie perl oder python Datenbank-Gleichheits-Join (wenn eine Tabelle in den Speicher passt) Routenplaner: Teilmengen von Knoten, z. B. Suchraum... KIT Institut für Theoretische Informatik 19