Algorithmen I Prof. Jörn Müller-Quade 07.06.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 Adressierbare Prioritätslisten Procedure build({e1 , . . . , en }) M:= {e1 , . . . , en } Function size return |M| Procedure insert(e) M:= M ∪ {e} Function min return min M Function deleteMin e:= min M ; M:= M \ {e}; return e Function remove(h : Handle) e:= h; M:= M \ {e}; return e Procedure decreaseKey(h : Handle, k : Key) assert key(h) ≥ k ; key(h):= k Procedure merge(M 0 ) M:= M ∪ M 0 KIT Institut für Theoretische Informatik 2 Adressierbare Prioritätslisten: Anwendungen Greedy-Algorithmus: while solution not complete do add the best available piece to the solution update piece priorities // e.g., using addressable priority queue Beispiele: I Dijkstras Algorithmus für kürzeste Wege I Jarník-Prim Algorithmus für minimale Spannbäume I Scheduling: Jobs → am wenigsten belastete Maschine I Hierarchiekonstruktion für Routenplanung I Suche nach erfüllenden Belegungen aussagenlog. Formeln? KIT Institut für Theoretische Informatik 3 Adressierbare Binäre Heaps 1 Problem: 3 Elemente bewegen sich. 4 Dadurch werden Elementverweise ungültig. 7 68 9 Ausweg: Unbewegliche Vermittler-Objekte. Invariante: proxy(e) verweist auf Position von e . (Ein) Vermittler bei jeder Vertauschung aktualisieren. Rückverweis Element → 1 Vermittler 3 4 7 6 8 9 Laufzeit: O(log n) für alle Operationen ausser merge und buildHeap, die O(n) brauchen. KIT Institut für Theoretische Informatik 4 Adressierbare Prioritätslisten Laufzeiten Operation build size min insert deleteMin remove decreaseKey merge Binary Heap Fibonacci-Heap (Buch) O(n) O(1) O(1) O(log n) O(log n) O(log n) O(log n) O(n) O(n) O(1) O(1) O(1) O(log n) O(log n) O(1) am. O(1) KIT Institut für Theoretische Informatik 5 Prioritätslisten: Zusammenfassung I Häug benötigte Datenstruktur I Adressierbarkeit ist nicht selbstverständlich I Binäre Heaps sind einfache, relativ eziente Implementierung KIT Institut für Theoretische Informatik 6 Was haben wir jenseits von Prioritätslisten gelernt? I implizites Layout von Binärbäumen ∑j j 2j I Heapsort (inplace!) I KIT Institut für Theoretische Informatik 7 Sortierte Folgen KIT Institut für Theoretische Informatik 8 Sortierte Folgen: he1 , . . . , en i mit e1 ≤ · · · ≤ en kennzeichnende Funktion: M.locate(k):= addressof min {e ∈ M : e ≥ k} Navigations−Datenstruktur 2 3 5 7 11 13 17 19 00 Annahme: Dummy-Element mit Schlüssel ∞ Achtung: In Abbildungen sieht ∞ wie 00 aus KIT Institut für Theoretische Informatik 9 Statisch: Sortiertes Feld mit binärer Suche // Find min {i ∈ 1..n + 1 : a[i] ≥ k} Function locate(a[1..n], k : Element) (`, r ):= (0, n + 1) // Assume a[0] = −∞, a[n + 1] = ∞ while ` + 1 < r do invariant 0 ≤ ` < r ≤ n + 1 and a[`] < k ≤ a[r ] m:= b(r + `)/2c // ` < m < r if k ≤ a[m] then r := m else `:= m return r Übung: Übung: Müssen die Sentinels ∞ / −∞ tatsächlich vorhanden sein? Variante von binärer Suche: bestimme `, r so dass a[`..r − 1] = [k, . . . , k], a[` − 1] < k und a[r ] > k KIT Institut für Theoretische Informatik 10 Statisch: Sortiertes Feld mit binärer Suche // Find min {i ∈ 1..n + 1 : a[i] ≥ k} Function locate(a[1..n], k : Element) (`, r ):= (0, n + 1) // Assume a[0] = −∞, a[n + 1] = ∞ while ` + 1 < r do invariant 0 ≤ ` < r ≤ n + 1 and a[`] < k ≤ a[r ] m:= b(r + `)/2c // ` < m < r if k ≤ a[m] then r := m else `:= m return r O(log n) Beweisidee: r − ` Zeit: halbiert sich in jedem Schritt KIT Institut für Theoretische Informatik 11 Binäre Suche Beispiel: k = 15 Function locate(a[1..n], k : Element) // min {i ∈ 1..n + 1 : a[i] ≥ k} (`, r ):= (0, n + 1) // Assume a[0] = −∞, a[n + 1] = ∞ while ` + 1 < r do invariant 0 ≤ ` < r ≤ n + 1 and a[`] < k ≤ a[r ] m:= b(r + `)/2c // ` < m < r if k ≤ a[m] then r := m else `:= m return r Indizes: Einträge: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [−∞, 2, 3, 5, 7, 11, 13, 17, 19, [−∞, 2, 3, 5, 7, 11, 13, 17, 19, [−∞, 2, 3, 5, 7, 11, 13, 17, 19, [−∞, 2, 3, 5, 7, 11, 13, 17, 19, ∞] ∞] ∞] ∞] KIT Institut für Theoretische Informatik 12 Dynamische Sortierte Folgen Grundoperationen insert, remove, update, locate (M.locate(k):= min {e O(log n) ∈ M : e ≥ k}) KIT Institut für Theoretische Informatik 13 Mehr Operationen hmin, . . . , a, . . . , b, . . . , maxi min: Erstes Listenelement Zeit O(1) max: Letztes Listenelement Zeit O(1) // O(log n + |result|) rangeSearch(a, b) hi h:= locate(a) while h → e ≤ b do result:= result.pushBack(h → e) Navigations−Datenstruktur h:= h →next return result 2 3 5 7 11 13 17 19 00 KIT Institut für Theoretische Informatik 14 Noch mehr Operationen I (re)build: Navigationsstruktur für sortierte Liste aufbauen I I hw , . . . , xi.concat(hy , . . . , zi) = hw , . . . , x, y , . . . , zi hw , . . . , x, y , . . . , zi.split(y ) = (hw , . . . , xi, hy , . . . , zi) Zählen: rank, select, rangeSize O(n) O(log n) O(log n) O(log n) KIT Institut für Theoretische Informatik 15 Abgrenzung Hash-Tabelle: nur insert, remove, nd. Kein locate, rangeQuery Sortiertes Feld: nur bulk-Updates. Aber: Hybrid-Datenstruktur oder log n M geometrisch wachsende statische Datenstrukturen Prioritätsliste: nur insert, deleteMin, (decreaseKey, remove). Dafür: schnelles merge Sortierte Folgen allgemein: die eierlegende Wollmilchdatenstruktur. Etwas langsamer als speziellere Datenstrukturen KIT Institut für Theoretische Informatik 16 Sortierte Folgen Anwendungen I Best-First Heuristiken I Algorithmische Geometrie: Sweepline-Datenstrukturen I Datenbankindex I ... KIT Institut für Theoretische Informatik 17 Anwendungsbeispiel: Best Fit Bin Packing Procedure binPacking(s) B : SortedSequence // used bins sorted by free capacity foreach e ∈ s by decreasing element size // sort if ¬∃b ∈ B : free(b) ≥ e then B.insert(new bin) locate b ∈ B with smallest free(b) ≥ e insert e into bin b Zeit: O(|s| log |s|) Qualität: gut. Details: nicht hier KIT Institut für Theoretische Informatik 18 Binäre Suchbäume Blätter: Elemente einer sortierten Folge. Innere Knoten v = (k, `, r ), (Spalt-Schlüssel, Invariante: über über ` r linker Teilbaum, rechter Teilbaum). erreichbare Blätter haben Schlüssel erreichbare Blätter haben Schlüssel ≤k >k 17 7 3 13 2 2 5 3 5 11 7 11 19 13 17 19 00 KIT Institut für Theoretische Informatik 19 Varianten, Bemerkungen I Dummy-Element im Prinzip verzichtbar I Oft speichern auch innere Knoten Elemente I Suchbaum wird oft als Synomym für sortierte Folge verwendet. (Aber das vermischt (eine) Implementierung mit der Schnittstelle) 17 7 3 2 13 5 11 19 KIT Institut für Theoretische Informatik 20