Algorithmen und Datenstrukturen

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

Grundlagen: Algorithmen und Datenstrukturen

Algorithms & Data Structures 2

Algorithmen und Datenstrukturen

A3.1 Sortieralgorithmen

Bucketsort. Korrektheit. Beispiel. Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt.

Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt

Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Algorithmen und Datenstrukturen

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Sortieren und Suchen. Jens Wächtler Hallo Welt! -Seminar LS 2

Algorithmen und Datenstrukturen SS09. Foliensatz 15. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Übung: Algorithmen und Datenstrukturen SS 2007

A6.1 Logarithmus. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. A6.1 Logarithmus. A6.2 Landau-Notation. A6.

Datenstrukturen & Algorithmen

(08 - Einfache Sortierverfahren)

Inhaltsverzeichnis. Teil 1 Grundlagen 21. Teil 2 Datenstrukturen 85

10. Sortieren III. Untere Schranken für das vergleichsbasierte Sortieren, Radix- und Bucketsort

Robert Sedgewick. Algorithmen in Java. Teil 1-4 Grundlagen Datenstrukturen Sortieren Suchen. Java-Beratung durch Michael Schidlowsky

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Aufgabe (Schreibtischtest, Algorithmenanalyse)

4. Sortieren 4.1 Vorbemerkungen

Tutoraufgabe 1 (Sortieralgorithmus):

Robert Sedgewick. Algorithmen in Java. »il 1-4 Grundlagen Datenstrykturen Sortleren Suchen. java-beratung durch Michael Schidlowsky

Inhaltsverzeichnis. Teil 1 Grundlagen 23

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen

Übung Algorithmen I

Übung Algorithmen und Datenstrukturen

Willkommen zur Vorlesung. Algorithmen und Datenstrukturen

Denition: Rang eines Elements e einer Folge s = Position von e in sort(s) (angefangen bei 1). Frage: warum ist r nicht notwendig eindeutig?

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Spezielle Sortierverfahren Autor: Sven Schuierer

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Pat Trees und Pat Arrays Datenstrukturen zur effizienten Suche in Texten

Prof. Dr. Margarita Esponda

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Algorithmen & Komplexität

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Algorithmen und Datenstrukturen 12

Algorithmen und Datenstrukturen

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Abschnitt 19: Sortierverfahren

Algorithmen und Datenstrukturen

3.2. Divide-and-Conquer-Methoden

Kap. 3ff: Untere Laufzeitschranke und Lineare Verfahren

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Auswählen nach Rang (Selektion)

8.4 Suffixbäume. Anwendungen: Information Retrieval, Bioinformatik (Suche in Sequenzen) Veranschaulichung: DNA-Sequenzen

Informatik II Sortieren

Aufgabe (Schreibtischtest, lexikographische Ordnung)

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

Übung Algorithmen und Datenstrukturen

Suchen und Sortieren Sortieren. Heaps

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Grundlagen der Programmierung

Vorlesung Datenstrukturen

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Heapsort. Erstellung eines Heaps

Heapsort. 1. Erstelle aus dem gegebenen Array einen Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

Algorithmen und Datenstrukturen 1

Sortieralgorithmen OOPM, Ralf Lämmel

Grundlegende Sortieralgorithmen

Transkript:

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 1 / 35 Algorithmen und Datenstrukturen D1. Sortieren von Strings Gabi Röger und Marcel Lüthi Universität Basel 16. Mai 2019

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 2 / 35 Algorithmen und Datenstrukturen 16. Mai 2019 D1. Sortieren von Strings D1.1 Motivation D1.2 Strings D1.3 Sortieren von Strings D1.4 LSD-Sortierverfahren D1.5 Quicksort

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 3 / 35 Übersicht A&D Sortieren Komplexitätsanalyse Fundamentale Datenstrukturen Suchen Graphen Strings Sortieren Suchen (Tries) Kompression

String algorithmen oder generische Algorithmen? Alle Algorithmen zum Sortieren / Suchen wurden über beliebige Schlüssel definiert. Können direkt auf Strings angewendet werden. Preis der Abstraktion / Allgemeinheit: Vorhandene Struktur der Schlüssel wird nicht ausgenutzt. Frage Können wir Eigenschaften von Strings ausnutzen um noch effizientere Algorithmen zu entwickeln? M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 4 / 35

Heutiges Programm Motivation Abstraktion: Alphabet LSD-Sort Quicksort für Strings Repetition und Erweiterung bereits bekannter Konzepte M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 5 / 35

D1. Sortieren von Strings Motivation M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 6 / 35 D1.1 Motivation

D1. Sortieren von Strings Motivation Strings als fundamentale Abstraktion Strings / Text ist in vielen Bereichen grundlegende Repräsentation von Informationen Programmcode Datenrepräsentation im Web (HTML / Json / CSS ) Kommunikation (E-Mail, Textmessages) Gensequenzen M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 7 / 35

D1. Sortieren von Strings Motivation Anwendung 1: Programmcode Programme sind Strings Compiler / Interpreter interpretieren und transformieren Strings in ausführbare Programme IDEs bietet Funktionalität zur effizienten Suche und Manipulation von Code Selektion von allen Wörtern, die Suchergebniss entsprechen Suche nach regulärem Ausdrücken Refactoring M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 8 / 35

D1. Sortieren von Strings Motivation Anwendung 2: Informations und Kommunikationssysteme Text ist wichtigste Repräsentation für Information und Kommunikation im Internet E-Mail / SMS /...: Text wird von einem an anderen Ort transferiert. Webbrowser: interpretiert CSS und HTML und stellt diesen formatiert dar. Suchmaschine: Muss grosse Mengen an Text effizient indizieren und durchsuchen. M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 9 / 35

D1. Sortieren von Strings Motivation Anwendung 3: Bioinformatik The digital information that underlies biochemistry, cell biology, and development can be represented by a simple string of G s, A s, T s, and C s. This string is the root data structure of an organism s biology. Maynard Olson - A time to sequence Analyse des Genoms eines Organismus Beispiel: Genom Mensch besteht ist String aus ca. 3 000 000 000 Zeichen Beispielprobleme Suchen von Sequenzen in grossen Datenbanken Vergleichen von (Sub)-Sequenzen von Strings Finden von häufig auftretenden Mustern... M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 10 / 35

D1. Sortieren von Strings Strings M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 11 / 35 D1.2 Strings

D1. Sortieren von Strings Strings Strings String Endliche Folge von Zeichen (Character) Strings sind unveränderlich (immutable). Einmal erzeugt können Strings nicht mehr verändert werden. Ideale Schlüssel für Symboltabellen Intern häufig als Array von Zeichen implementiert. 0 1 2 3 4 5 6 7 8 9 10 11 A T T A C K A T D A W N M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 12 / 35

D1. Sortieren von Strings Strings Characters Früher: 7 Bit Zeichensatz (ASCII) 8 Bit Zeichensatz (extended ASCII) Heute: 8 oder 16 bit Unicode Zeichensatz (UTF-8, UTF-16) Unterschied Java / Python Java Character entspricht 16 bit Unicode Zeichen (UTF-16) Python kennt keinen Charactertyp. Ausdruck s[i] ist (UTF-8) String der Länge 1. M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 13 / 35

D1. Sortieren von Strings Strings Abstraktion: Alphabet Unicode umfasst 1 112 064 Zeichen. Kleineres Alphabet reicht für viele Anwendungen aus Name Radix (R) Bits (log 2 (R)) Zeichen BINARY 2 1 0 1 DNA 4 2 A C G T LOWERCASE 26 5 a - z UPPERCASE 26 5 A-Z ASCII 128 7 ASCII Characters EXTENDED ASCII 256 8 EXTENDED ASCII UNICODE 1 114 112 21 UNICODE M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 14 / 35

D1. Sortieren von Strings Strings Alphabet Abstraktion Alphabet erlaubt uns Code unabhängig vom benutzten Alphabet zu schreiben. class Alphabet : def init (s : List [ char ]) def tochar ( index : Int ) -> char def toindex ( c : Char ) -> int def contains ( c : Char ) -> boolean def R() -> int # Radix M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 15 / 35

D1. Sortieren von Strings Sortieren von Strings M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 16 / 35 D1.3 Sortieren von Strings

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 17 / 35 D1. Sortieren von Strings Sortieren von Strings Sortieralgorithmen Algorithmus Laufzeit O( ) Speicherbedarf O( ) stabil best/avg./worst best/avg./worst Selectionsort n 2 1 nein Insertionsort n/n 2 /n 2 1 ja Mergesort n log n n ja Quicksort n log n/n log n/n 2 log n/log n/n nein Heapsort n log n 1 nein O(n log n) ist beweisbar der lower bound für allgemeine, vergleichsbasierte, Sortierverfahren.

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 18 / 35 D1. Sortieren von Strings Sortieren von Strings Idee 1 Zeichen in Alphabet sind geordnet. Sortierung kann durch Fachverteilen hergestellt werden Vergleiche: Radixsort Erinnerung: Radixsort Zahlen: z.b. 763, 983, 96, 286, 462 Teile Zahlen nach letzter Stelle auf: 0 1 2 3 4 5 6 7 8 9 462 763 983 96 286 Sammle Zahlen von vorne nach hinten/oben nach unten auf 462, 763, 983, 96, 286 Wiederhole mit zweitletzter Stelle, etc. Grundlage LSD-Sortierverfahren

D1. Sortieren von Strings Sortieren von Strings Idee 2 Wie viele Character Vergleiche müssen durchgeführt werden um zwei Strings zu vergleichen? 0 1 2 3 4 5 6 7 p r e f e t c h p r e f i x e s Worst case: Proportional zur Stringlänge Aber: Oft sublinear Wir können Sortieralgorithmen so schreiben, dass sie Vergleiche auf einzelne Zeichen reduzieren. Grundlage von 3-Wege Quicksort für Strings M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 19 / 35

D1. Sortieren von Strings LSD-Sortierverfahren M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 20 / 35 D1.4 LSD-Sortierverfahren

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 21 / 35 D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren (1 Zeichen) Input: Array a, Output: Sortiertes array aux N = len ( a) # Anzahl zu sortierender Zeichen count = [0] * ( alphabet. radix () + 1) aux = [ None ] * N # Zeichen zaehlen for i in range (0, N): indexofchar = alphabet. toindex ( a[ i]) count [ indexofchar + 1] += 1 # Kummulative Summe for r in range (0, alphabet. radix ()): count [r +1] += count [r] # Verteilen for i in range (0, N): indexofchar = alphabet. toindex ( a[ i]) countforchar = count [ indexofchar ] aux [ indexofchar ] = a[ i] count [ indexofchar ] += 1

D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren (1 Zeichen) N = len ( a) # Anzahl zu sortierender Zeichen in array a count = [0] * ( alphabet. radix () + 1) # Zeichen Zaehlen for i in range (0, N): indexofchar = alphabet. toindex ( a[ i]) count [ indexofchar + 1] += 1 M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 22 / 35

D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren (1 Zeichen) # Kummulative Summe for r in range (0, alphabet. radix ()): count [r +1] += count [r] M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 23 / 35

D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren (1 Zeichen) # Verteilen for i in range (0, N): indexofchar = alphabet. toindex ( a[ i]) countforchar = count [ indexofchar ] aux [ indexofchar ] = a[ i] count [ indexofchar ] += 1 M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 24 / 35

D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren (1 Zeichen) Verfahren ist stabil Zeitaufwand: Proportional zu N + R, wobei R Grösse des Alphabets ist Speicher: Proportional zu N + R (aux-array und count Array) M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 25 / 35

D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren Sortiere jedes Zeichen einzeln beginnend mit letztem (least significant digit) Funktioniert, da Sortierung stabil ist M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 26 / 35

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 27 / 35 D1. Sortieren von Strings LSD-Sortierverfahren LSD-Sortierverfahren N = len ( a); aux = [ None ] * N ; d = numdigits - 1 while d >= 0: count = [0] * ( alphabet. radix () + 1) for i in range (0, N): indexofcharatposdina = alphabet. toindex ( a[ i][ d]) count [ indexofcharatposdina + 1] += 1 for r in range (0, alphabet. radix ()): count [r +1] += count [r] for i in range (0, N): indexofcharatposdina = alphabet. toindex ( a[ i][ d]) countforchar = count [ indexofcharatposdina ] aux [ countforchar ] = a[ i] count [ indexofcharatposdina ] += 1 for i in range (0, N): a[i] = aux [i] d -= 1

D1. Sortieren von Strings Quicksort M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 28 / 35 D1.5 Quicksort

M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 29 / 35 D1. Sortieren von Strings Quicksort Erinnerung: Quicksort Wähle Pivot Element Partitioniere Array Rekursion auf linkes und rechtes Teilarray

D1. Sortieren von Strings Quicksort Quicksort: Gleiche Schlüssel Was passiert bei vielen gleichen Schlüsseln? Unnötige Partitionierung von gleichen Schlüsseln. M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 30 / 35

D1. Sortieren von Strings Quicksort 3-Wege Quicksort Gleiche Schlüssel sind bereits sortiert. Kein rekursiver Aufruf mehr nötig. M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 31 / 35

D1. Sortieren von Strings Quicksort Quicksort für Strings 3-Wege Quicksort per Buchstabe Bei gleichen Anfangsbuchstaben, vergleiche nächsten Buchstaben. M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 32 / 35

D1. Sortieren von Strings Quicksort Quicksort für Strings Quelle: Sedgewick & Wayne, Algorithmen, Abbildung 5.18 M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 33 / 35

D1. Sortieren von Strings Quicksort Laufzeit Theorem Um ein Array von N zufälligen Strings zu sortieren, benötigt der 3-Weg-Quicksort für Strings im Durchschnitt 2NlnN Zeichenvergleiche. Gleiche Anzahl Vergleiche wie standard (3-Wege) Quicksort Aber: Wir haben Zeichenvergleiche und nicht Schlüsselvergleiche M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 34 / 35

D1. Sortieren von Strings Quicksort Implementation Jupyter Notebooks: Stringsort.ipynb M. Lüthi (Universität Basel) Algorithmen und Datenstrukturen 16. Mai 2019 35 / 35