Randomisierte Algorithmen Randomisierte Algorithmen Bin Hu Algorithmen und Datenstrukturen 2 Arbeitsbereich für Algorithmen und Datenstrukturen Institut für Computergraphik und Algorithmen Technische Universität Wien Randomisierte Algorithmen Einführung Grundlagen Einführung Definition Randomisierter Algorithmus = Deterministischer Algorithmus mit Zufallsexperimente als zusätzliche Operation 2 Klassen von randomisierten Algorithmen Las-Vegas-Verfahren: immer ein korrektes Ergebnis Monte-Carlo-Verfahren: gewisse Fehlerwahrscheinlichkeiten vorhanden Randomisierte Algorithmen Einführung Vergleich Unterschiede zwischen deterministischen und randomisierten Algorithmen Zufallsexperimente Aufbau Analyse Laufzeit Korrektheit Deterministisch nein komplex einfach garantiert garantiert Randomisiert ja einfach komplex variabel/probabilistisch garantiert/probabilistisch Randomisierte Algorithmen Einführung Beispiel Beispiel: Randomisiertes Quicksort Motivation Klassischer Quicksort hat im Falle einer vorsortierten Folge eine Worst Case Laufzeit von O(n2 ) Realisierung Pivotelement nicht fix festlegen, sondern zufällig bestimmen Eingabefolge zu Beginn zufällig durchmischen Randomisierte Algorithmen Part I Randomisierter Primzahltest Randomisierte Algorithmen Randomisierter Primzahltest Grundlagen Randomisierter Primzahltest Gegeben Ganze Zahl n (üblicherweise sehr groß) Gesucht Ist n eine Primzahl? Anwendung Kryptographie (z.B. RSA-Verfahren) Randomisierte Algorithmen Randomisierter Primzahltest Grundlagen Bitkomplexität “Lange” Zahlen können z.B. nicht in konstanter Zeit addiert werden ⇒ Darstellung von n als Binärzahl mit k = dlog(n + 1)e Bits, Anzahl der Bitoperationen als Kriterium für Komplexität Divisionsmethode Überprüfen, ob n durch 2 oder eine ungerade Zahl aus dem √ Bereich {3, . . . , b nc} teilbar ist √ k Anzahl der Divisionen = O( n) = O(2 2 ) mit k = Θ(log n) ⇒ Nicht praktikabel! Randomisierte Algorithmen Algorithmus von Miller-Rabin Grundlagen Algorithmus von Miller-Rabin Satz von Fermat Ist n eine Primzahl, so gilt für alle a ∈ {1, . . . , n − 1} an−1 ≡ 1 mod n Folgerung Gilt für eine Basis a: an−1 6≡ 1 mod n ⇒ n sicherlich keine Primzahl (a ist ein Zeuge für die Zusammengesetztheit) an−1 ≡ 1 mod n ⇒ n mit gewisser Wahrscheinlichkeit eine Primzahl Randomisierte Algorithmen Algorithmus von Miller-Rabin Algorithmus Algorithmus 1 Primzahltest von Miller-Rabin 1: für i = 1, . . . , s { 2: falls Zeuge (Random (2, n − 1), n) dann { 3: Retourniere “nicht prim” 4: } 5: } 6: Retourniere “prim” Idee Wenn nach s Iterationen kein Zeuge für die Zusammengesetztheit gefunden wurde, so ist n wahrscheinlich eine Primzahl Randomisierte Algorithmen Algorithmus von Miller-Rabin Algorithmus Frage Wie berechnet man effizient an−1 mod n? Umformulierungen a2c mod n = (ac mod n)2 mod n ac+1 mod n = (ac mod n) · a mod n Randomisierte Algorithmen Algorithmus von Miller-Rabin Algorithmus Algorithmus 2 Zeuge (a, n) 1: ergebnis = 1; // c = 0 2: für i = k − 1, . . . , 0 { 3: ergebnis = (ergebnis · ergebnis) mod n; // c = 2c 4: falls (bi == 1) dann { 5: ergebnis = (ergebnis · a) mod n; // c = c + 1 6: } 7: } 8: Retourniere NOT(ergebnis == 1) bi . . . i-te Bit der Zahl n − 1 Randomisierte Algorithmen Algorithmus von Miller-Rabin Analyse Analyse Multiplikation bzw. Modulo von zwei k-Bit Zahlen: O(k 2 ) Zeuge-Funktion: O(k 3 ) Gesamtaufwand von Miller-Rabin-Algorithmus: O(s · k 3 ) Fehlerrate Wenn n > 2, ungerade und nicht prim: Es gibt mindestens n−1 2 Zeugen (ohne Beweis) In jeder Iteration ist ein zufälliges a mit der Wahrscheinlichkeit ≥ 21 ein Zeuge Nach s Iterationen ist die Wahrscheinlichkeit ≤ Zeuge gefunden wurde 1 2s , dass kein Randomisierte Algorithmen Part II Randomisierte Datenstrukturen: Skiplisten Randomisierte Algorithmen Perfekte Skiplisten Einführung Perfekte Skiplisten Eigenschaften Skiplisten = Verallgemeinerung von einfach verketteten Listen Daten + Schlüssel werden in Containern abgelegt Container sind nach Schlüssel sortiert 2 Pseudo-Container Kopf und Ende begrenzen die Liste 3 2 1 0 2 4 47 15 8 17 20 43 Beispiel: Perfekte Skipliste mit 8 Containern ∞ Randomisierte Algorithmen Perfekte Skiplisten Einführung Weitere Eigenschaften Jeder Container c hat Höhe c.höhe und (c.höhe + 1) Zeiger auf nachstehenden Containern Jeder 2i -te Container hat auf Level i einen Zeiger c.next[ i ] auf den 2i Positionen weiter hinten stehenden Container Kopf und Ende sind so hoch wie der höchste Container Suchen von Elementen in O(log n) 3 2 1 0 2 4 47 15 8 17 20 43 Beispiel: Perfekte Skipliste mit 8 Containern ∞ Randomisierte Algorithmen Perfekte Skiplisten Suchen Algorithmus 3 Suchen(L,x) Eingabe: Skipliste L, ganze Zahl x Ausgabe: Zeiger auf Container mit Schlüssel x falls existent und Nil sonst p = L.kopf für i = L.höhe bis 0 { solange p.next[ i ].key < x { p = p.next[ i ] } } p = p.next[ 0 ] falls p.key == x dann { return p } sonst { return Nil } Randomisierte Algorithmen Perfekte Skiplisten Analyse Speicherplatz Anzahl der Zeiger in “echten” Containern: log Pn n n n = 2n − 1 = O(n) n + 2 + 4 + ··· + 1 = 2i i=0 Laufzeit beim Suchen Anweisung p = p.next[ i ] in der solange-Schleife wird nur höchstens 1x pro Level ausgeführt Skipliste mit n Elementen hat Höhe O(log n) Fragen Laufzeit beim Einfügen? Laufzeit beim Löschen? Randomisierte Algorithmen Randomisierte Skiplisten Randomisierte Skiplisten Randomisierte Skiplisten Keine strikte Einschränkung für die Höhe der Container Verteilung der Höhen soll in etwa die der perfekten Skipliste entsprechen Wahrscheinlichkeit für die Höhe von Container c: 1 p(c.höhe = i) = 2i+1 3 2 1 0 2 4 8 17 15 ∞ 20 43 47 Beispiel: Randomisierte Skipliste mit 8 Containern Randomisierte Algorithmen Randomisierte Skiplisten Einfügen und Entfernen Einfügen Einzufügendes Element hat Schlüssel x, Skipliste L: 1 In der Skipliste L nach x suchen 2 Während der Suche die Quellen der durchgegangenen Zeiger in einem update-Array speichern 3 Höhe vom neuen Container “auswürfeln” 4 Zeiger im update-Array auf den neuen Container “umbiegen” 5 Gegebenenfalls Höhe der Pseudo-Containern Kopf und Ende raufsetzen Entfernen Analog zum Einfügen, gegebenenfalls Höhe der Pseudo-Containern runtersetzen Randomisierte Algorithmen Randomisierte Skiplisten Einfügen und Entfernen Algorithmus 4 Einfügen(L,x) p = L.kopf für i = L.höhe bis 0 { solange p.next[ i ].key < x { p = p.next[ i ] } update[ i ] = p } p = p.next[ 0 ] falls p.key ! = x dann { neuehöhe = randomhöhe() p = newContainer (x, neuehöhe) für i = 0 bis neuehöhe { p.next[ i ] = update[ i ].next[ i ] update[ i ].next[ i ] = p } } Randomisierte Algorithmen Randomisierte Skiplisten Einfügen und Entfernen Algorithmus 5 Entfernen(L,x) p = L.kopf für i = L.höhe bis 0 { solange p.next[ i ].key < x { p = p.next[ i ] } update[ i ] = p } p = p.next[ 0 ] falls p.key == x dann { für i = 0 bis p.höhe { update[ i ].next[ i ] = p.next[ i ] } lösche p aktualisiere die Höhe der Liste } Randomisierte Algorithmen Randomisierte Skiplisten Analyse Analyse 2 Typen von Bewegungsoperationen: Sprung zum nächsten Container auf aktuellem Level Abstieg um einen Level im aktuellen Container Typ 2 Höhe der Skipliste ist erwartungsmäßig O(log n) Typ 1 Container, die auf Lvl. i durchlaufen wurden, haben Höhe i Mit Wahrscheinlichkeit 1 2 wären sie noch höher gewesen Erwartungsmäßig wird nur 2 Container auf diesem Level besucht → O(1) Randomisierte Algorithmen Part III Zusammenfassung Randomisierte Algorithmen Zusammenfassung Randomisierter Primzahltest von Miller-Rabin Test ob n eine Primzahl ist mittels Zeugen a ∈ {1, . . . , n − 1} Berechne zu einem a: an−1 ≡ 1 mod n? Nein? → n sicherlich keine Primzahl Ja? → n könnte Primzahl sein Skiplisten Verkettete Listen, die Sprünge über mehreren Containern zulassen Perfekte Skiplisten: Höhe der Container fix vorgegeben. Nachteil: Einfügen und Entfernen in O(n) Randomisierte Skiplisten: Höhe der Container zufällig, Verteilung der Höhen entspricht in etwa die der perfekten Skipliste. Suchen, Einfügen und Entfernen in O(log n)