Erinnerung VL vom 09.05.2016 Analyse von Hashtabellen mit verketteten Listen Erwartete Laufzeit O(1) bei zuf. Hashfkt. und falls M O(m) Guter Ersatz (hier) für zuf. Hashfkt.: universelle Hashfunktionen Hashtabellen mit linearer Suche: Schwierigkeit bei remove Heute: Gegenüberstellung Hashing mit Verketten mit linearer Suche (Probleme bei) Anwendungen von Hashtabellen Sortieren: Motivation(, Insertion Sort) KIT Institut für Theoretische Informatik 1
Verketten Lineare Suche Volllaufen: Verketten weniger empndlich. Unbeschränktes Hashing mit lin. Suche hat nur amortisiert konst. Einfügezeit Cache: Lineare Suche besser. Vor allem für doall Platz/Zeit Abwägung: Kompliziert! Abhängig von n, Füllgrad, Elementgröÿe, Implementierungsdetails bei Verketten (shared dummy!, t speichert Zeiger oder item), Speicherverwaltung bei Verketten, beschränkt oder nicht,... Referentielle Integrität: Nur bei Verketten! Leistungsgarantien: Universelles Hashing funktioniert so nur mit Verketten KIT Institut für Theoretische Informatik 2
Perfektes Hashing hier nicht KIT Institut für Theoretische Informatik 3
Mehr Hashing Hohe Wahrscheinlichkeit, Garantien für den schlechtesten Fall, Garantien für linear probing höhere Anforderungen an die Hash-Funktionen Hashing als Mittel zur Lastverteilung z. B., storage servers, (peer to peer Netze,... ) Zufallsextraktion durch universelles Hashing O(1) nd / perfektes Hashing KIT Institut für Theoretische Informatik 4
Hashtabellen für assoziative Arrays In Java: java.util.hashtable, in Python: dict Beispiel (Python): args["username"]="fred" (CGI-Skripte) Beispiel für Sicherheitsproblem (gelöst seit 2012): Webserver beantwortet HTTP-Anfragen mit Python-Skript HTTP-Parameter werden für Skript in dict eingelesen Problem: Hashfunktion h deterministisch (d.h. fest, bekannt!) Bösartige Anfrage: viele HTTP-Parameter x y mit gleichem h(x) Konsequenz: quadratischer Aufwand bei Einlesen/Verarbeiten von Skriptparametern Denial of Service Wie reparieren? KIT Institut für Theoretische Informatik 5
Kryptographische Hashfunktionen Universelle Hashfunktionen: kurze Ausgabe (typisch: 32 Bit), Kollisionen gleichmäÿig Kryptographische Hashfunktionen: längere Ausgabe (typisch: 128512 Bit), Kollisionen existieren, sind aber schwer zu nden Anwendungen für kryptographische Hashfunktionen: Fingerabdruck von groÿen Datenmengen Zertikate (z.b. für Webserver) Nutzerauthentikation (Unix: /etc/passwd) Beispiele: MD5 (unsicher), SHA-1 (unsicher), SHA-256, SHA-3 Mehr in Sicherheits-Vorlesung KIT Institut für Theoretische Informatik 6
Sortieren & Co KIT Institut für Theoretische Informatik 7
Formaler Gegeben: Elementfolge s = e 1,...,en Gesucht: s = e 1,...,e n mit s ist Permutation von s e e 1 n für eine Totalordnung ` ' KIT Institut für Theoretische Informatik 8
Anwendungsbeispiele Allgemein: Vorverarbeitung Suche: Telefonbuch unsortierte Liste Gruppieren (Alternative Hashing?) KIT Institut für Theoretische Informatik 9
Beispiele aus Kurs/Buch Aufbau von Suchbäumen Kruskals MST-Algorithmus Rucksackproblem Scheduling, die schwersten Probleme zuerst Sekundärspeicheralgorithmen, z. B. Datenbank-Join Viele verwandte Probleme. Zum Beispiel Transposition dünner Matrizen, invertierten Index aufbauen, Konversion zwischen Graphrepräsentationen. KIT Institut für Theoretische Informatik 10
Überblick Einfache Algorithmen / kleine Datenmengen Mergesort ein erster ezienter Algorithmus Eine passende untere Schranke Quicksort das Auswahlproblem ganzzahlige Schlüssel jenseits der unteren Schranke KIT Institut für Theoretische Informatik 11
Einfache Sortieralgorithmen Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] move a[i] to the right place Beispiel: 4, 7,1,1 4,7, 1,1 1,4,7, 1 1,1,4,7, KIT Institut für Theoretische Informatik 12
Sentinels am Beispiel Sortieren durch Einfügen Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] // move a[i] to the right place e:= a[i] if e < a[1] then // new minimum for j := i downto 2 do a[j]:= a[j 1] a[1]:= e else // use a[1] as a sentinel for (j := i; a[j 1] > e; j ) a[j]:= a[j 1] a[j]:= e KIT Institut für Theoretische Informatik 13
Analyse Die i-te Iteration braucht Zeit Θ(i). n i=2 i = n(n + 1) 1 = Θ ( ) n 2 2 Die i-te Iteration braucht Zeit O(1) z. B. (beinahe) sortiert. n i=2 O(1) O(n) KIT Institut für Theoretische Informatik 14
Sortieren durch Mischen Idee: Teile und Herrsche Function mergesort( e 1,...,en ) : Sequence of Element if n = 1 then return e 1 // base case else return merge( mergesort( e,...,e 1 n/2 ), mergesort( e n/2 +1,...,en )) Gegeben: zwei sortierte Folgen a und b Berechne: sortierte Folge der Elemente aus a und b KIT Institut für Theoretische Informatik 15
Beispiel KIT Institut für Theoretische Informatik 16
Mischen Jeweils min(a, b) in die Ausgabe schieben. a b c operation 1,2,7 1,2,8,8 move a 2,7 1,2,8,8 1 move b 2,7 2,8,8 1,1 move a 7 2,8,8 1,1,2 move b 7 8,8 1,1,2,2 move a 8,8 1,1,2,2,7 concat b 1,1,2,2,7,8,8 Zeit O(n) KIT Institut für Theoretische Informatik 17
Analyse Analyse: T (n) = O(n) + T ( n/2 ) + T ( n/2 ) = O(n log n). KIT Institut für Theoretische Informatik 18
Analyse T (n) = Θ(n) + T ( n/2 ) + T ( n/2 ) Problem: Runderei Ausweg: genauer rechnen (siehe Buch) Dirty trick: Eingabe auf Zweierpotenz aufblasen (z. B. (2 log n n) anhängen) normales Master-Theorem anwendbar Zeit Θ(n log n) KIT Institut für Theoretische Informatik 19