Departement Informatik
Informatikgrundlagen
Daten einlesen und Sortieren
Hans-Joachim Böckenhauer Dennis Komm
Herbst 2021 – 4. November 2021
Ein schnellerer Primzahltest
from math import sqrt def primetest3(x):
if x < 2 or (x > 2 and x % 2 == 0):
return False d = 3
wurzelx = sqrt(x) while d < x<= wurzelx:
if x % d == 0:
return False d += 2
return True
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 1 / 28
Ein schnellerer Primzahltest
Wie gross ist diesmal die Verbesserung?
Was ist die Laufzeit dieses Algorithmus?
Schleife wird√
x/2Mal durchlaufen
Laufzeit «wächst» mit Grösse des Werts von√ x Laufzeit inO(√
2n) =O(2n/2) =O(1.415n)
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 2 / 28
Ein schnellerer Primzahltest
5 10 15 20 25 30 35 40 45
0 2 000 000 4 000 000 6 000 000 8 000 000 10 000 000
2n 1.415n
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 3 / 28
Ein schnellerer Primzahltest
Nehmen wir vereinfacht an, unser Computer kann1000Durchläufe der Schleife pro Sekunde durchführen; fürx= 100 000 000 000 031bedeutet dies:
. . . d < x . . .
100 000 000 000 031Durchläufe 1000DurchläufeSekunde
>100 000 000 000Sekunden
>3100Jahre
. . . d <= sqrt(x) . . .
√100 000 000 000 031Durchläufe 1000DurchläufeSekunde
≈ 10 000 000Durchläufe 1000DurchläufeSekunde
<3Stunden
Selbst wenn der Computer, auf dem das langsamere Programm läuft, 100 Mal schneller ist, braucht er noch 31 Jahre
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 4 / 28
Ein schnellerer Primzahltest
Oder andersherum. . .
Angenommen, wir wollen maximal zehn Minuten rechnen
Dann ergeben sich maximal «testbare» Primzahlen in den folgenden Grössenordnungen:
. . . d < x . . . xDurchläufe
1000DurchläufeSekunde = 600Sekunden
⇐⇒x= 600 000
. . . d <= sqrt(x) . . .
√xDurchläufe
1000DurchläufeSekunde = 600Sekunden
⇐⇒x= 600 0002
⇐⇒x= 360 000 000 000
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 5 / 28
Ein schnellerer Primzahltest
Best- und Worst-Case-Analyse
Best- und Worst-Case-Analyse
Welcher Algorithmus ist schneller?
def primetest3(x):
if x < 2 or (x > 2 and x % 2 == 0):
return False d = 3
while d <= sqrt(x):
if x % d == 0:
return False d += 2
return True
def primetest4(x):
if x < 2 or (x > 2 and x % 2 == 0):
return False d = 3
isprime = True while d <= sqrt(x):
if x % d == 0:
isprime = False d += 2
return isprime
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 6 / 28
Best- und Worst-Case-Analyse
Angenommen,xist durch 3 teilbar
Dann ist der linke Algorithmus sehr schnell ï Schleife wird nach dem ersten Vergleich verlassen
«Early Exit»
Rechter Algorithmus macht ca.1.415n/2Vergleiche Angenommen,xist Primzahl
Dann machen beide Algorithmen ca.1.415n/2Vergleiche (Natürlich sollte der linke implementiert werden)
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 7 / 28
Was kann man sonst noch machen?
Primzahltest
Jede Zahl zwischen 1undxtesten
Jede zweite Zahl zwischen 1undxtesten
Jede zweite Zahl zwischen 1und√
xtesten
Randomisierter Monte-Carlo- Algorithmus
Polynomieller AKS-Algorithmus
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 8 / 28
Listen
Weiterführende Konzepte
2-dimensionale Listen
Bislang beinhalten Listen Zahlen oder Zeichen Liste kann auch Listen beinhalten
Solche2-dimensionalen Listenspeichern z. B. Tabellen und Matrizen
M =
2 0 3 0 6 3 9 5 1 1 0 0 7 2 7 3 9 5 8 0 8 2 0 3 2 1 6 5 9 6
M = [ [2, 0, 3, 0, 6], [3, 9, 5, 1, 1], [0, 0, 7, 2, 7], [3, 9, 5, 8, 0], [8, 2, 0, 3, 2], [1, 6, 5, 9, 6] ] Zugriff aufi-te Zeile undj-te Spalte mit M[i][j]
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 9 / 28
Listen
Daten einlesen und in Listen speichern
Daten einlesen
Beispiel: Matrix in Datei gegeben Inhalt der Datei ist ein Text Matrix zeilenweise abgespeichert
Einträge in jeder Zeile mit Kommata getrennt Einträge sollen als Zahlen interpretiert werden Drei Schritte
1. Datei Zeile für Zeile einlesen
2. Einträge aus den Zeilen extrahieren (Trennsymbol: Komma) 3. Jeden Eintrag in Zahl konvertieren
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 10 / 28
Daten einlesen
1. Datei Zeile für Zeile einlesen
with open("daten.txt") as file:
lines = file.read().splitlines()
Dateidaten.txtist für den nachfolgenden Anweisungsblock geöffnet Zugreifbar unter dem Namenfile
lines = file.read()speichert den gesamten Text ausdaten.txtin der Variablenlines
lines = file.read().splitlines()speichert die einzelnen Zeilen von daten.txtals Einträge der Listelines
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 11 / 28
Daten einlesen: Beispiel
1. Datei Zeile für Zeile einlesen
with open("daten.txt") as file:
lines = file.read().splitlines()
daten.txt 2, 0, 3, 0, 6 3, 9, 5, 1, 1 0, 0, 7, 2, 7 3, 9, 5, 8, 0 8, 2, 0, 3, 2 1, 6, 5, 9, 6
lines = [ "2, 0, 3, 0, 6",
"3, 9, 5, 1, 1",
"0, 0, 7, 2, 7",
"3, 9, 5, 8, 0",
"8, 2, 0, 3, 2",
"1, 6, 5, 9, 6" ]
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 12 / 28
Daten einlesen
2. Einträge aus erster Zeile extrahieren (Trennsymbol: Komma) tmp = lines[0].split(",")
lines = [ "2, 0, 3, 0, 6",
"3, 9, 5, 1, 1",
"0, 0, 7, 2, 7",
"3, 9, 5, 8, 0",
"8, 2, 0, 3, 2",
"1, 6, 5, 9, 6" ]
tmp = ["2", "0", "3", "0", "6"]
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 13 / 28
Daten einlesen
3. Jeden Eintrag in Zahl konvertieren data = [0] * len(tmp)
for i in range(0, len(tmp)):
data[i] = int(tmp[i])
tmp = ["2", "0", "3", "0", "6"] data = [2, 0, 3, 0, 6]
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 14 / 28
Daten einlesen: Zusammenfassung
def readfile(filename):
# Datei Zeile für Zeile einlesen withopen(filename) as file:
lines = file.read().splitlines()
# Einträge aus erster Zeile extrahieren (Trennsymbol: Komma) tmp = lines[0].split(",")
# Jeden Eintrag in Zahl konvertieren data = [0] * len(tmp)
for iin range(0, len(tmp)):
data[i] = int(tmp[i])
returndata
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 15 / 28
Aufgabe – Daten einlesen
Erweitern Sie die Funktion, sodass alle Zeilen der Datei gelesen und konvertiert werden
der Inhalt in einer 2-dimensionalen Liste gespeichert wird
def readfile(filename):
with open(filename) as file:
lines =file.read().splitlines() tmp = lines[0].split(",")
data = [0] * len(tmp) for i in range(0,len(tmp)):
data[i] =int(tmp[i]) returndata
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 16 / 28
Daten einlesen
def readfile2(filename):
# Datei Zeile für Zeile einlesen withopen(filename) as file:
lines = file.read().splitlines() data = []
# Alle Zeilen nacheinander verarbeiten for iin range(0, len(lines)):
tmp = lines[i].split(",") dataline = [0] * len(tmp) for j in range(0,len(tmp)):
dataline[j] =int(tmp[j]) data.append(dataline) returndata
Oft sind Daten als solchecsv-Dateien (Comma Separated Values) gegeben
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 17 / 28
Sortieren 1
Sortieren und Suchen
Sortieren und Suchen
Daten suchen undsortierensind zwei der grundlegendsten Aufgaben von Informatikerinnen und Informatikern
Standardwerk dreht sich nur um diese Themen Gegeben seiennpositive ganze Zahlen
GenauerunsortierteListedatamitn = len(data) Wir betrachtennals Eingabelänge
Zahlen können mehrfach auftauchen
Sortieremit möglichst kleiner Zeitkomplexität
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 18 / 28
Sortieren 1
Bubblesort
Bubblesort
5
1 1 5 4 3 4 5 3 4 3 5
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 19 / 28
Bubblesort
Idee
Sortieren durch wiederholtes Finden des Maximums Ziel
ListedatamitnElementen sortieren, also Bereich0, . . . , n−1 Finde Maximum und schiebe es an die letzte Position Vergleiche hierzu iterativ alle benachbarten Elemente
Maximum wandert wie Luftblase durch Liste an letzte Position Wiederholen mit Bereich0, . . . , n−2
Fahre fort, bisdatasortiert ist
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 20 / 28
Aufgabe – Eine Bubble-Sequenz
Implementieren Sie eine Bubble-Sequenz Laufe einmal durchdata
Vergleiche jeweils benachbarte Paare Vertausche, wenn das erste Element grösser ist
Maximum «bubblet» nach rechts
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 21 / 28
Eine Bubble-Sequenz
Eine Bubble-Sequenz in Python
data = [6, 22, 61, 1, 89, 31, 9, 10, 76]
n = len(data)
for i in range(0, n-1):
if data[i] > data[i+1]:
tmp = data[i]
data[i] = data[i+1]
data[i+1] = tmp
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 22 / 28
Aufgabe – Bubblesort
Implementieren Sie den vollständigen Algorithmus Iteriere Bubble-Sequenzen
Nachk-ter Sequenz sind die letztenk Elemente vondatasortiert
Bubble-Sequenzen werden mit jeder Iteration kürzer
Verwende hierzu eine äussere Schleife
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 23 / 28
Bubblesort
def bubblesort(data):
n = len(data)
for d in range(n, 1, -1):
for i in range(0, d-1):
if data[i] > data[i+1]:
tmp = data[i]
data[i] = data[i+1]
data[i+1] = tmp return data
print(bubblesort([6, 22, 61, 1, 89, 31, 9, 10, 76]))
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 24 / 28
Sortieren 1
Minsort
Minsort
Idee
Sortieren durch wiederholtes Finden des Minimums
Anders als bei Bubblesort werden nicht benachbarte Elemente verglichen Aktuelles Minimum wird gespeichert
Jedes Element wird mit diesem verglichen
Falls es kleiner ist, werden beide miteinander vertauscht Nach einer Iteration wird Minimum an (aktuellen) Anfang kopiert Fahre fort, bisdatasortiert ist
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 25 / 28
Minsort
def minsort(data):
n = len(data)
for current in range(0, n-1):
minimum = data[current]
for i in range(current+1, n):
if data[i] < minimum:
tmp = data[i]
data[i] = minimum minimum = tmp data[current] = minimum return data
print(minsort([6, 22, 61, 1, 89, 31, 9, 10, 76]))
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 26 / 28
Sortieren 1
Zeitkomplexität von Bubblesort und Minsort
Zeitkomplexität von Bubblesort und Minsort
Zähle die Vergleiche von jeweils zwei Zahlen n−1Vergleiche, um das Maximum zu finden
n−2Vergleiche, um das zweitgrösste Element zu finden . . .
1Vergleich, um die beiden kleinsten Elemente zu sortieren ï InsgesamtPn−1i=1 i= (n−1)·n/2 = (n2−n)/2Vergleiche ï Quadratisch viele Vergleiche
Die Laufzeit von Bubblesort ist inO(n2)
Die Laufzeit von Minsort ist (mit ähnlichen Argumenten) inO(n2)
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 27 / 28
Zeitkomplexität von Bubblesort und Minsort
10 20 30 40 50 60 70 80 90 100
0 1 000 2 000 3 000 4 000 5 000
Bubblesort / Minsort
Ziel
Eingabelängen
Vergleiche
Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 28 / 28