Sortieren Ziel: Bringe Folge von Objekten in eine bestimmte Reihenfolge Beispiel ( Müller, Darmstadt, 456) ( Meier, Wiesbaden,123 ) ( Schmitt, Frankfurt, 789) ( Adam, Hamburg, 999) Aufsteigend nach Namen sortiert: ( Adam, Hamburg, 999) ( Meier, Wiesbaden, 456) ( Müller, Darmstadt, 123) ( Schmitt, Frankfurt, 789) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 1
Sortieren, Beispiel (2) Aufsteigend nach Kundennummer sortiert: ( Müller, Darmstadt, 123) ( Meier, Wiesbaden, 456) ( Schmitt, Frankfurt, 789) ( Adam, Hamburg, 999) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 2
Sortieren Eingabe: Liste von Objekten Vergleichsoperator auf den Objekten Ausgabe: Liste der Objekte mit i.a. anderer Reihenfolge [a 1,... a n ] so dass i j a i a j Annahme: Ordnung ist transitiv, reflexiv, total, aber nicht notwendig antisymmetrisch total : es gilt a b oder b a. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 3
Sortiermethoden Annahme im Folgenden: Liste von Zahlen. Wir betrachten: Insert-Sort Bubble-Sort Merge-Sort Quick-Sort Sortieren durch Einfügen Sortieren durch binäres Vertauschen Sortieren durch rekursives Mischen Sortieren durch rekursive Zerlegung und Vergleichen Es gibt noch weitere Sortierverfahren P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 4
Sortieren Sortierprogramme in Haskell für Listen Demonstration der Prinzipien Abschätzung der Komplexität Sortierprogramme in Python für Array Prinzipien der destruktiven Abänderung In-place-Algorithmen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 5
Sortieren durch Einfügen (Insert-Sort) Idee: geordnetes Einfügen der Elemente in die bereits sortierte Liste Sortiere: 5,3,99,1,2,7 sortierte Liste restliche Elemente 5 3,99,1,2,7 3,5 99,1,2,7 3,5, 99 1,2,7 1,3,5, 99 2,7 1,2,3,5, 99 7 1,2,3,5, 7, 99 P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 6
Insert-Sort: Haskell-Programm Sortieren durch Einfügen: sorteinfuegen xs = sorteinfuegenr xs [] sorteinfuegenr: unsortierter Rest, sortierter Anteil sorteinfuegenr [] ys = ys sorteinfuegenr (x:xs) [] = sorteinfuegenr xs [x] sorteinfuegenr (x:xs) ys = sorteinfuegenr xs (sorteinfuegenr1 x ys) sorteinfuegenr1 x [] = [x] sorteinfuegenr1 x (y:ys) = if x <= y then x:y:ys else y : (sorteinfuegenr1 x ys) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 7
Sortieren mit Blasensort (Bubble-Sort) Vertauschung von benachbarten Elementen; falls notwendig: Mehrfaches Durcharbeiten der Liste 5 3 99 1 2 7 5 3 99 1 2 7 5 3 99 1 2 7 5 3 1 99 2 7 5 1 3 99 2 7 1 5 3 99 2 7 1 5 3 99 2 7 1 5 3 99 2 7 1 5 3 2 99 7 1 5 2 3 99 7 1 2 5 3 99 7... P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 8
Bubble-Sort: Haskell-Programm Sortieren durch Vertauschen von benachbarten Feldern bubblesort [] = [] bubblesort [x] = [x] bubblesort xs = let y:resty = bubblesort1 xs in y: (bubblesort resty) bubblesort1 [x] = [x] bubblesort1 (x:rest) = let (y:resty) = bubblesort1 rest in if x > y then y:x: resty else (x: y:resty) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 9
Bubble-Sort mit Optimierung: Haskell-Programm bubblesorto [] = [] bubblesorto [x] = [x] bubblesorto xs = let (aenderung,y:resty) = bubblesorto1 xs in if aenderung then y: (bubblesorto resty) else xs bubblesorto1 [x] = (False,[x]) bubblesorto1 (x:rest) = let (aenderung, y:resty) = bubblesorto1 rest in if x > y then (True,y:x: resty) else (aenderung,x: y:resty) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 10
Quicksort: Rekursives Zerlegen Idee Pivot = erstes Element der Liste: Zerlege Liste in Teillisten von Elemente, die bzgl Pivot: kleinere, grössere und gleiche Elemente enthalten Sortiere diese rekursiv (Quicksort) Füge sie zusammen. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 11
Quicksort: Beispiel Sortiere: 5,3,99,1,2,7 Pivot 5 kleinere/größere Elte 3,1,2 99,7 Pivots 1 99 kleinere/größere Elte 2,3 7 - Pivots 2 kleinere/größere Elte 3 Zusammensetzen: 1,2,3,5,7,99 P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 12
Sortieren mit Quicksort: Haskell-Programm quicks [] = [] quicks [x] = [x] quicks [x,y] = if x <= y then [x,y] else [y,x] quicks (x:xs) = let (llt,lge) = splitlist x xs in (quicks llt) ++ (x: (quicks lge)) splitlist x y = splitlistr x y [] [] splitlistr x [] llt lge = (llt,lge) splitlistr x (y:ys) llt lge = if y < x then splitlistr x ys (y: llt) lge else splitlistr x ys llt (y:lge) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 13
Mergesort: Sortieren durch Mischen Rekursives Verfahren: Zerlege Liste in erste und zweite Hälfte sortiere beide rekursiv zusammenmischen Sortiere: 5,3,99,1,2,7 Zerlegen 5,3,99 1,2,7 Zerlegen 5 3,99 1 2,7......... 5 3,99 1 2,7 Merge 3,5,99 1,2,7 Merge 1,2,3,5,7,99 P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 14
Sortieren mittels Mischen: Haskell-Programm mischsort xs = mergesort (length xs) xs mergesort _ [] = [] mergesort _ [x] = [x] mergesort _ [x,y] = if x <= y then [x,y] else [y,x] mergesort len xs = let lenh = len div 2 in mische (mergesort lenh (take lenh xs)) (mergesort (len -lenh) (drop lenh xs)) mische [] ys = ys mische xs [] = xs mische (x:xs) (y:ys) = if x <= y then x: (mische xs (y:ys)) else y: (mische (x:xs) ys) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 15
Sortieren: Mindestanzahl der Vergleiche Satz Sortieren einer Liste von n Zahlen durch Vergleichsoperationen benötigt im schlechtesten Fall mindestens n log 2 (n) Vergleiche. Argumentation: Ein Entscheidungsbaum-Programm zur Länge n sortiert eine Eingabeliste [a 1,..., a n ] der Länge n folgendermaßen: An den Verzweigungen wird die Frage gestellt: ist a i > a j? für bestimmte (feste) Indizes i, j, die Ausgabe am Ende ist die sortierte Permutation der Eingabeliste. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 16
Sortieren: Mindestanzahl der Vergleiche Es gibt immer eine Eingabeliste, so dass n log 2 (n) Vergleiche zum Sortieren nötig sind Begründung: Der Entscheidungsbaum hat n! Blätter, da jede Eingabereihenfolge möglich ist. Die Tiefe d des Baumes > log 2 (n!). Offenbar: n! 1... 1 } {{ } n/2 n/2... n/2 } {{ } n/2 = (n/2) (n/2). log 2 (n!) > log((n/2) (n/2) ) = 0.5 n llog(n/2) = 0.5 n (log 2 (n) 1). D.h. Ω(n llog 2 (n)). P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 17
Sortieren: Mindestanzahl der Vergleiche(3) Abschätzung kann leicht verbessert werden mittels der Stirlingformel für n!. Aber: Man konnte noch nicht allgemein nachweisen, dass dies auch eine untere Schranke ist, wenn man alle Algorithmen zulässt. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 18
Eigenschaften der Sortierverfahren Zeitbedarf im schlechtesten Fall / besten Fall / im Mittel Stabilität Ein Sortierverfahren ist stabil, wenn die Reihenfolge von Elementen mit gleichem Sortierschlüssel erhalten bleibt. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 19
Eigenschaften des Insert-Sort Gut für kleinere Listen, oder fast sortierte Listen im schlechtesten Fall: O(n 2 ): Für Listen der Länge n höchstens: 1 + 2 +... + (n 1) Vergleiche im besten Fall: O(n) für vorsortierte Listen. Die Haskell-Implementierung ist stabil. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 20
Insert-Sort: Variante Folgende Variante des Insert-sort ist stabil und hat Komplexität O(n) für vorsortierte Listen: sorteinfuegeno xs = reverse (sorteinfuegenor xs []) sorteinfuegenor [] ys = ys sorteinfuegenor (x:xs) [] = sorteinfuegenor xs [x] sorteinfuegenor (x:xs) ys = sorteinfuegenor xs (sorteinfuegenor1 x ys) sorteinfuegenor1 x [] = [x] sorteinfuegenor1 x (y:ys) = if x >= y then x:y:ys else y : (sorteinfuegenor1 x ys) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 21
Eigenschaften des Bubble-Sort Gut: wenn Elemente schon in der Nähe ihres endgültigen Platzes sind. im schlechtesten Fall: (n 1) + (n 2) +... + 1 = O(n 2 ) im besten Fall: O(n), wenn Liste schon sortiert Stabil, wenn gleiche Elemente nicht vertauscht werden. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 22
Eigenschaften des Quicksort im schlechtesten Fall: O(n 2 ), wenn Liste bereits sortiert im besten Fall: O(n log(n)) Im Mittel: O(n log(n)) Gut: wenn Listen groß und Werte zufällig verteilt. Beim Experimentieren in Haskell mit zufällig erzeugten Listen ist es das beste Verfahren Haskell-Implementierung ist stabil, P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 23
Eigenschaften des Mischsort im schlechtesten Fall: O(n log(n)). Im besten Fall: auch O(n log(n)). Gut: Wenn keine Komplexitäts-Ausrutscher vorkommen sollen Experiment: in Haskell ist es nur dann besser als Quicksort, wenn Teile der Listen bereits sortiert sind. Stabil, wenn der Merge Stabilität beachtet: D.h. wenn gleiche Elemente aus der linken Liste vor denen aus der rechten Liste einsortiert werden. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 24
Genauere Begründung Komplexität des Mischsort Behauptung: Mischsort hat einen Zeitbedarf von O(n log(n)) Abschätzung von red ms : red ms (n) = c + red mische (n) + 2 red ms (n/2) = c + n + 2 red ms (n/2) c + n + 2 (c + n/2) + 4 red ms (n/4) = (c + n) + (2c + n) + (4c + n) + (8c + n) +... Tiefe der Rekursionen: log 2 (n) c n + n log 2 (n) + 2 log 2 (n). d.h. der Mischsort ist O(n log(n)). P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 25
Sortierprogramme in imperativen Programmiersprachen, Speicherverwaltung Zusätzlicher Aspekt: effiziente Speicherverwaltung Falls Sortierung innerhalb des Eingabe-Arrays: In-Place- Verfahren. Insertion-Sort, Bubble-Sort, Quick-Sort: In-Place-Verfahren Merge-Sort: Es gibt ein effizientes In-Place-Merge-Verfahren, der Algorithmus ist nicht so offensichtlich zu finden. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 26
Bubblesort in Python, in-place def Bubblesort(soArray): laenge = len(soarray) for i in range(0,laenge-1): aenderung = 0 for j in range(0,laenge-1-i): if soarray[j] > soarray[j+1]: vertausche(soarray,j, j+1) aenderung = 1 if aenderung == 0: break P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 27
Insertsort in Python, in-place def Insertsort(soArray): laenge = len(soarray) for i in range(1,laenge): for j in range(i,0,-1): if soarray[j] < soarray[j-1]: vertausche(soarray,j, j-1) else: break P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 28
Quicksort in Python, in-place def Quicksort(soArray): return Quicksortr(soArray,0,len(soArray)-1) def Quicksortr(soArray,iLo,iHi): if (ihi-ilo == 1): ##Optimierung if_groesser_then_tausch(soarray,ilo,ihi); return soarray; Lo = ilo; Hi = ihi; Mid = (Lo + Hi) / 2; P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 29
Quicksort in Python, in-place, (2) while (Lo <= Hi): while (iskleiner(soarray,lo,mid)): Lo = Lo+1 while (isgroesser(soarray,hi,mid)): Hi = Hi -1; if (Lo <= Hi): if (Mid == Hi): Mid = Lo; elif (Mid == Lo): Mid = Hi; if (Lo!= Hi): vertausche(soarray,lo, Hi); Lo = Lo +1; Hi = Hi-1; if (Hi > ilo): Quicksortr(soArray,iLo, Hi); if (Lo < ihi): Quicksortr(soArray,Lo, ihi); return soarray P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 30
Quicksort in Python, in-place, (3) def isgroesser(soarray,x,y): def iskleiner(soarray,x,y): return (soarray[x] > soarray[y]) return (soarray[x] < soarray[y]) def vertausche(soarray,ind1, ind2): x = soarray[ind1]; soarray[ind1] = soarray[ind2]; soarray[ind2] = x; def if_groesser_then_tausch(soarray,ind1,ind2): if isgroesser(soarray,ind1,ind2): vertausche(soarray,ind1, ind2); P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 31
Eigenschaften der in-place Sortierverfahren Imperative in-place Sortierverfahren: Isert-Sort ist stabil Bubble-Sort ist stabil imperativer Quicksort ist nicht stabil effizienter Merge-Sort ist stabil P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 32
Datenabstraktion, Abstrakte Daten-Typen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 33
Datenabstraktion Strukturierungsmethode für Programme und Implementierungen unabhängig von einer Programmiersprache verwendbar Prinzip: Trennung von interner Implementierung der Daten, interner Zugriffsfunktionen externem Zugriff P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 34
Was man vermeiden sollte Gilt auch für Module Durchgriff auf die Implementerung Schein-Argumente: Effizienz, Bequemlichkeit kann langfristig zu Wartungs-Problemen führen, z.b. bei Änderung der internen Implementierung des Moduls Verwenden des durch die Implementierung bedingten, aber nicht garantierten, Verhaltens Z.B. bei Implementierung von Mengen: Reihenfolge der Elemente nicht ausnutzen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 35
Datenabstraktion Funktionen auf einem abstrakten Datentyp: Konstruktoren bzw. Eingabe der Objekte Fallunterscheidung nach den Konstruktoren und Selektoren; bzw. Frage nach der logischen Struktur der Datenobjekte, bzw. Ausgabe der Objekte, interne Service-Funktionen. Z.B. Operatoren auf Objekten, Gleichheitstests, usw. externe Service-Funktionen. Z.B. die Funktion map auf Listen. Datenkonversionen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 36
Datenabstraktion Wesentliche Aspekte, analog zu Modulen, sind: Die Daten sind über klar definierte Zugriffsfunktionen verfügbar Die Algorithmen verwenden nur diese Zugriffsfunktionen Die Daten haben eine Semantik, die von der Implementierung respektiert wird. Die Implementierung der Daten und Zugriffe ist nicht sichtbar (Kapselung, Information hiding). Schnittstellen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 37
Beispiel: Listen Konstruktoren: Selektoren: cons, nil head, tail Beispiel für Gleichheitsaxiome: head(cons s t) = s tail(cons s t) = t nil (cons s t) P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 38
Haskell-Listen Haskell-Listen erfüllen diese Axiome: Definitionen: head (x:y) = x tail (x:y) = y cons x y = x:y nil = [] Nachrechnen ergibt: [] s : t. head (cons s t ) reduziert zu s. tail (cons s t) reduziert zu t. head nil führt zu einem Fehler (d.h. undefiniert). P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 39
Datentyp natürliche Zahl Konstruktoren Null, S S(S(S(Null))) der Zahl: 3. alle arithmetischen Operatoren sind implementierbar Zahlen in Programmiersprachen: binäre Strings Gleiche Funktionalität, aber effizienter P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 40
Datentyp ganze Zahlen Benutzt Datentyp der natürlichen Zahlen Darstellung als Paar (s, n) Vorzeichen positive Zahl Diese Darstellung hat eine Doppeldeutigkeit (+, 0) oder (, 0) sind zwei Darstellungen der 0. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 41
Der Datentyp Rationale Zahlen Funktionen zum Erzeugen und Anzeigen arithmetische Operationen:, /, +, Vergleiche: <, Konversionen Int Rational Axiom: beim Drucken erscheint stets die gekürzte Darstellung Verschiedene interne Darstellungen sind möglich: man hat freie Wahl, ob und wann (intern) gekürzt wird. Datekonversionen: Integer Rational Rational Integer P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 42
Gleitkommazahlen Funktionen: Erzeugen, Anzeigen, mathematische Operationen:, /, +, Vergleiche... Erfüllen nicht die mathematischen Axiome für reelle Zahlen sinnvoll wäre: Axiome, die Näherung an reelle Zahlen beschreiben. Standardisierungen und Normierungen: auf der Basis der internen Darstellung für Rundungen und Fehlermeldungen bei Ausnahmen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 43
Der abstrakte Datentyp Menge Endliche Mengen mit Elementen von gleichem Typ folgende Funktionalität ist sinnvoll: Erzeugen von Mengen, gegeben endliche Aufzählung der Elemente Test auf Enthaltensein eines Elementes in einer Menge Drucken einer Menge Kardinalität einer Menge Bildung von Schnitt, Vereinigung, Differenz, Potenzmenge Test auf Gleichheit von Mengen Notwendig: Gleichheitstest für Elemente. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 44
Datentyp Menge : Beispiel Eingabe: {(1, 2), (2, 4)} = {(1, 2)} falls rationale Zahlen gemeint sind. Aber: = {(1, 2), (2, 4)}, falls Paare komplexe Zahlen darstellen. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 45
Der abstrakte Datentyp Multimenge Endliche Multimengen mit Elementen von gleichem Typ, wobei Elemente mehrfach vorkommen dürfen. Multimengen sind wie Listen, bei denen man von der Reihenfolge der Elemente absieht. Notwendige Funktionalitäten analog wie bei Mengen. Beispielsweise gilt für Multimengen {1, 1, 1, 2, 2} {1, 1, 2, 2, 2} = {1, 1, 2, 2} und {1, 1, 1, 2, 2} {1, 1, 2, 2, 2} = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2}. Implementierung von Multimengen: auf der Basis von Listen. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 46
Datentyp Multi-Menge : Beispiel Notwendig auch für Multimengen: Gleichheitstest für Elemente. Beispiel-Eingabe: {(1, 2), (2, 4)} = {(1, 2), (1, 2)} falls Paare rationale Zahlen darstellen. Aber: = {(1, 2), (2, 4)}, mit (1, 2) (2, 4) falls Paare komplexe Zahlen darstellen. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 47
Axiome für Multimenge Konstruktoren und Funktionen: cons, null, anzahl, einfuegen,... Typ wäre (Multimenge a) Zwei exemplarische Axiome: anzahl null = 0 s :: a, t :: Multimenge a : anzahl(einfuegen s t) = (anzahl t) + 1 Implementierung mit anzahl = length, einfuegen = cons Diese ist korrekt, denn: anzahl null length [] 0 anzahl (einfuegen s t) length (cons s t) (length t) + 1. P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 48
Mengen: Implementierung endliche Mengen: Implementierungsmöglichkeiten: Listen von Elementen sortierte Listen von Elementen Such-Bäume Multimengen von Elementen Aber: problematisch: Datentyp unendliche Liste oder unendliche Menge nur eingeschränkt implementierbar nicht alle unendlichen Mengen sind endlich darstellbar. Gleichheitstest von unendlichen Mengen P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 49
Abstraktionsbarrieren Abstraktionsbarrieren für die Beispiele Mengen / Multimengen / Listen sind: Mengen: Schnitt,... Schnittstellenfunktionen Multimengen: Schnitt, Vereinigung, Gleichheit,... Schnittstellenfunktionen Listen. append, element,... P raktische Informatik 1, W S 2004/05, F olien Sortieren 1, (14. Januar2005) Seite 50
Die Barrieren (Schnittstellen) erlauben sauberes zverlässiges Programmieren Die Effizienz kann durch Schnittstellen etwas verschlechtert werden.