Randomisierte Algorithmen

Werbung
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 (1, 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 ]
}
Höhe der Liste aktualisieren
}
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)
Herunterladen