Departement Mathematik und Informatik Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin 26. April 2017 Graphenalgorithmen IV Strings I Algorithmen und Datenstrukturen, FS17 Wiederholung I Was leistet der Floyd-Warshall Algorithmus? I Was ist der “Fluss” in einem Graphen? 26. April 2017 — 2 / 25 Algorithmen und Datenstrukturen, FS17 26. April 2017 — 3 / 25 Uebersicht 2017-04-26 I Zweites Beispiel Ford-Fulkerson I Zentralität: – Degree Centrality, Betweenness Centrality I Symboltabelle für Strings: Trie Algorithmen und Datenstrukturen, FS17 26. April 2017 — 4 / 25 Ford-Fulkerson: 2. Beispiel (1/4) I (s,t)-Cut: Teilt Knoten in zwei Partitionen S und T auf. Cut-Kapazität: Summe der Gewichte der gerichteten Kanten von Partition S nach Partition T I Minimaler Cut: Cut mit der kleinsten Kapazität Algorithmen und Datenstrukturen, FS17 26. April 2017 — 5 / 25 Ford-Fulkerson: 2. Beispiel (2/4) Zusammenhang “minimaler Cut” und “maximaler Fluss”: I Max. Fluss hat genau Kapazität des minimalen Cuts. (Beweis 1956 durch Ford und Fulkerson, sowie unabhängig durch Elias, Feinstein and Shannon) I Recap Ford-Fulkerson-Konstruktion: a) Starte mit (irgend einem erlaubten) Fluss: b) solange es einen Restfluss gibt c) addiere ihn zum bisherigen Fluss Initialer Fluss habe Kapazität 10 Algorithmen und Datenstrukturen, FS17 26. April 2017 — 6 / 25 Ford-Fulkerson: 2. Beispiel (3/4) I Abgeleiteter Graph (um einen Restfluss zu finden): Pfad gefunden, Weite ist 5 Algorithmen und Datenstrukturen, FS17 26. April 2017 — 7 / 25 Ford-Fulkerson: 2. Beispiel (4/4) I Residual (Weite des Restpfads, 5) entlang dem Restpfad auf bisherigen Fluss anwenden: Fluss nun 15 I In diesem Beispiel: kein Restfluss mehr zu finden, ist maximaler Fluss. Algorithmen und Datenstrukturen, FS17 26. April 2017 — 8 / 25 Centrality (1/3) I In einem Graphen sind nicht alle Knoten gleich “wichtig”: Wie graduelles Mass definieren für “Zentralität”? Algorithmen und Datenstrukturen, FS17 26. April 2017 — 9 / 25 Degree Centrality (2/3) I Degree Centrality: misst Anzahl Nachbarn I Normierung: Division durch N − 1 I Idee: 3 Nachbarn in einem 10er-Netz ist zentraler als 3 Nachbarn in einem 1000er-Netz I Erfasst “Transit-Rolle” nicht. Algorithmen und Datenstrukturen, FS17 26. April 2017 — 10 / 25 Betweenness Centrality (3/3) Wieviel “Transit-Verkehr” geht durch einen Knoten? Zähle Anzahl Paare, zwischen denen ein Knote sitzt. Beispiel Knote B → 3 (A-C, A-D, A-E) Als Formel: I djk = Anzahl kürzeste Wege zw Knoten j und k djk (i) = Anzahl kürzeste Wege durch Knoten i I Normierung: Division durch (N − 1)(N − 2)/2 Algorithmen und Datenstrukturen, FS17 26. April 2017 — 11 / 25 Symbol-Tabelle für Stringschlüssel I Bisher gesehen: – Sortieren von beliebigen Schlüsseln – Quicksort, oder Radix-Sort wenn feste Länge I Sortierte Ablage wird zur einer Symboltabelle – erlaubt Suche – z.B. mit binary search (Alternative: Hash-Tabelle) I Neues Ziel: Symboltabellen für String-Schlüssel – Suchzeit proportional zur (Abfrage-)Stringlänge – Existenzabfrage mit nur wenigen Buchstaben Algorithmen und Datenstrukturen, FS17 Symboltabelle für Strings (Forts.) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class StringST<Value> { void put(String key, Value val) // put key-value pair into the table Value get(String key) // (null if key is absent) void delete(String key) // remove key (and its value) boolean contains(String key) // is there a value paired with key? boolean isEmpty() // is the table empty? String longestPrefixOf(String s) // the longest key that is a prefix of s Iter keysWithPrefix(String s) // all the keys having s as a prefix Iter keysThatMatch(String s) // all the keys that match s int size() // number of key-value pairs Iter keys() // all the keys in the table } 26. April 2017 — 12 / 25 Algorithmen und Datenstrukturen, FS17 26. April 2017 — 13 / 25 “Trie”-Datenstruktur . . . zur Implementierung von String-Symboltabellen. Trie ist ein Kunstwort: I Wortspiel von E. Fredkin 1960 eingeführt: – wegen einer Datenstruktur für Retrieval I Phonetische Verwechslungsgefahr mit “tree” – deshalb oft Aussprache als “try” I Andere Namen für Trie: – digital tree – prefix tree (vergleiche Baum für Morse-Code) I Varianten: bitwise trie, compact prefix trie, radix trie u.m. Algorithmen und Datenstrukturen, FS17 26. April 2017 — 14 / 25 Edward Fredkin (1934 – ) I Verlässt Caltech Uni mit 19, wird USAF-Pilot I Nach Armeedienst bei Bolt Beranek & Newman angestellt – sieht PDP-1 Prototyp, überzeugt BBN zu Kauf I Es gibt noch keine Software für die PDP-1: – erster Assembler, gründet DECUS (DEC user soc) – schlägt PDP-1 Umbau vor, führt zum “Interrupt”-Konzept I 1968 Professur MIT, Boston – Zusammenarbeit mit Feynman (Physik) I Beiträge: – Fredkin Gate, reversible computing – zelluläre Automaten, KI – Digital Philosophy, Reduktionskette : – Biologie → Chemie → Physik → Informatitionsberechnung Algorithmen und Datenstrukturen, FS17 26. April 2017 — 15 / 25 Trie-”Anatomie” Algorithmen und Datenstrukturen, FS17 26. April 2017 — 16 / 25 Suche und Einfügen im Trie Zu vorangehendem Beispiel: I Buchstabenweise den Links in die Tiefe folgen I Bei Suchbegriffende: – Knoten muss Wert haben – sonst ein “miss” Laufzeit: proportional zur Länge Suchbegriff I Einfügen im Trie: – zuerst Suche Dort wo Suche endet: entweder Wert setzen, oder neuer Kindknoten Algorithmen und Datenstrukturen, FS17 26. April 2017 — 17 / 25 Trie – Darstellung im Speicher Bei 26 Buchstaben (A-Z): Jeder Knoten hat Feld mit 26 Zeiger! I Bemerkung: Die Schlüssel sind implizit dargestellt. Wie einen Iterator bauen, der alle Schlüssel ausgibt? Algorithmen und Datenstrukturen, FS17 26. April 2017 — 18 / 25 Iteratoren für Trie (1/2) Iterator für alle Prefixe: Preorder-Traversierung (plus Testen auf Vorhandensein eines Werts) Algorithmen und Datenstrukturen, FS17 26. April 2017 — 19 / 25 Iteratoren für Trie (2/2) Iterator bei Vorgabe eines Prefixes: → nur dessen Unterbaum traversieren Algorithmen und Datenstrukturen, FS17 26. April 2017 — 20 / 25 Trie Eigenschaften I Es gilt: Anzahl Links ist zwischen O(RN) und O(RNw). (N = Anzahl Einträge, R = Alphabetumfang, w = durchschn. Schlüssellänge), d.h. recht gross! Algorithmen und Datenstrukturen, FS17 26. April 2017 — 21 / 25 Kompaktierung (wg. one-way branching) I I I Folge von internen “one-way branches” wird zusammengefasst, ebenso “external one-way branches” (zu Blättern) (Kann auch mit nachfolgender TST-Darstellung kombiniert werden) Algorithmen und Datenstrukturen, FS17 26. April 2017 — 22 / 25 Ternary Search Tries (TST): 1/3 Alternative, um Trie-Speicherbedarf zu reduzieren: TST I TST: Jeder Knoten hat genau drei Links I Mittlerer Link: wie bisher für Prefix I Links-/Rechts-Link: für Unterbäume mit “kleiner/grösser” als Knoten-Buchstaben I Beachte sells und shells (virtueller Link s-->e) Algorithmen und Datenstrukturen, FS17 26. April 2017 — 23 / 25 Ternary Search Tries (TST): 2/3 1 2 3 4 5 6 7 8 9 Node get(Node x, String key, int d) // d ist aktuelle Prefix-Länge { if (x == null) return null; char c = key.charAt(d); if (c < x.c) return get(x.left, key, d); else if (c > x.c) return get(x.right, key, d); else if (d < key.length() - 1) return get(x.mid, key, d+1); else return x; } Vergleich Speicherbedarf eines Feldes von R Zeigern vs TST: Algorithmen und Datenstrukturen, FS17 26. April 2017 — 24 / 25 TST Eigenschaft, Vergleich: 3/3 I Für TST gilt: Anzahl Links ist zwischen O(3N) und O(3Nw) (N = Anzahl Stringschlüssel, w = durschn. Schlüssellänge) Algorithmen und Datenstrukturen, FS17 26. April 2017 — 25 / 25 Ausblick I Strings II: Suchen in Strings (= substring finden) I Nächste Woche: Hackaton zu “auto-completion”