VL-21: Greedy Algorithmen
(Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger
SS 2017, RWTH
Organisatorisches
• Vorlesung: Gerhard Woeginger (Zimmer 4024 im E1) Sprechstunde: Mittwoch 11:15–12:00
• Übungen: Tim Hartmann, David Korzeniewski, Björn Tauer Email: dsal-i1@algo.rwth-aachen.de
• Webseite:http://algo.rwth-aachen.de/Lehre/SS17/DSA.php
• Nächste Vorlesung:
Dienstag, Juli 18, Aula 1, zur gewohnten Zeit
Greedy Algorithmen
• Grundlegendes
optimal versus gut versus schlecht
• Sequentielle Speicherung
• Stundenplanung
• Huffman Codes
Grundlegendes
Greedy Algorithmen
Greedy Algorithmen (greedy = gierig)
Trifft in jedem Schritt eine Entscheidung, die bezüglich eines
“kurzsichtigen” Kriteriums optimal ist.
Dieses Kriterium ist einfach und schnell auszuwerten.
Wenn eine Wahl getroffen wurde, kann sienicht mehr rückgängig gemacht werden.
Greedy Algorithmen finden nicht immer die beste Lösung:
Wiederholte Wahl eines lokalen Optimums führt nicht automatisch zum globalen Optimum
Greedy kannoptimalsein (Beispiel folgt) Greedy kanngutsein (Beispiel folgt)
Greedy kannbeliebig schlecht sein (Beispiel folgt)
Greedy Algorithmen
Greedy Algorithmen (greedy = gierig)
Trifft in jedem Schritt eine Entscheidung, die bezüglich eines
“kurzsichtigen” Kriteriums optimal ist.
Dieses Kriterium ist einfach und schnell auszuwerten.
Wenn eine Wahl getroffen wurde, kann sienicht mehr rückgängig gemacht werden.
Greedy Algorithmen finden nicht immer die beste Lösung:
Wiederholte Wahl eines lokalen Optimums führt nicht automatisch zum globalen Optimum
Greedy kannoptimalsein (Beispiel folgt) Greedy kanngutsein (Beispiel folgt)
Greedy kannbeliebig schlecht sein (Beispiel folgt)
Greedy Algorithmen
Greedy Algorithmen (greedy = gierig)
Trifft in jedem Schritt eine Entscheidung, die bezüglich eines
“kurzsichtigen” Kriteriums optimal ist.
Dieses Kriterium ist einfach und schnell auszuwerten.
Wenn eine Wahl getroffen wurde, kann sienicht mehr rückgängig gemacht werden.
Greedy Algorithmen finden nicht immer die beste Lösung:
Wiederholte Wahl eines lokalen Optimums führt nicht automatisch zum globalen Optimum
Greedy kannoptimalsein (Beispiel folgt) Greedy kanngutsein (Beispiel folgt)
Greedy kannbeliebig schlecht sein (Beispiel folgt)
Greedy Algorithmen
Greedy Algorithmen (greedy = gierig)
Trifft in jedem Schritt eine Entscheidung, die bezüglich eines
“kurzsichtigen” Kriteriums optimal ist.
Dieses Kriterium ist einfach und schnell auszuwerten.
Wenn eine Wahl getroffen wurde, kann sienicht mehr rückgängig gemacht werden.
Greedy Algorithmen finden nicht immer die beste Lösung:
Wiederholte Wahl eines lokalen Optimums führt nicht automatisch zum globalen Optimum
Greedy kannoptimalsein (Beispiel folgt) Greedy kanngutsein (Beispiel folgt)
Greedy kannbeliebig schlecht sein (Beispiel folgt)
Greedy Algorithmen
Greedy Algorithmen (greedy = gierig)
Trifft in jedem Schritt eine Entscheidung, die bezüglich eines
“kurzsichtigen” Kriteriums optimal ist.
Dieses Kriterium ist einfach und schnell auszuwerten.
Wenn eine Wahl getroffen wurde, kann sienicht mehr rückgängig gemacht werden.
Greedy Algorithmen finden nicht immer die beste Lösung:
Wiederholte Wahl eines lokalen Optimums führt nicht automatisch zum globalen Optimum
Greedy kannoptimalsein (Beispiel folgt) Greedy kanngutsein (Beispiel folgt)
Greedy kannbeliebig schlecht sein (Beispiel folgt)
Greedy: kann optimal sein
Wiederholung aus VL-16: Minimale Spannbäume
Eingabe:ein gewichteter zusammenhängender GraphG mitnKnoten Ausgabe:ein minimaler Spannbaum vonG
Kruskal’s Algorithmus
So lange weniger alsn−1 Kanten markiert sind:
1 Wähle eine billigste unmarkierte Kante
2 Markiere sie, falls sie keinen Kreis mit anderen markierten Kanten schliesst
• Bei Terminierung bilden die markierten Kanten einen MST
• n−1 kurzsichtige, lokale Entscheidungen ergeben globales Optimum
Greedy: kann gut sein
Wiederholung aus VL-18: Matchings
Eingabe:ein ungerichteter Graph G= (V,E) Ausgabe:ein Matching mit maximaler Kardinalität
Greedy Algorithmus
Wiederhole so lange es geht:
Markiere neue Kante, die mit keiner markierten Kante kollidiert
• Bei Terminierung bilden die markierten Kanten ein MatchingM
• Kardinalität von Greedy MatchingM ist
mindestens 50% der Kardinalität des optimalen Matchings (Beweis: Jede Greedy Kante blockiert ≤2 optimale Kanten)
Greedy: kann gut sein
Wiederholung aus VL-18: Matchings
Eingabe:ein ungerichteter Graph G= (V,E) Ausgabe:ein Matching mit maximaler Kardinalität
Greedy Algorithmus
Wiederhole so lange es geht:
Markiere neue Kante, die mit keiner markierten Kante kollidiert
• Bei Terminierung bilden die markierten Kanten ein MatchingM
• Kardinalität von Greedy MatchingM ist
mindestens 50% der Kardinalität des optimalen Matchings (Beweis: Jede Greedy Kante blockiert ≤2 optimale Kanten)
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 gilt χ(C2n+1) =3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =
n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 gilt χ(C2n+1) =3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 gilt χ(C2n+1) =3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =
2
• Fürn≥1 gilt χ(C2n+1) =3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 gilt χ(C2n+1) =3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 giltχ(C2n+1) =
3
Greedy: kann beliebig schlecht sein (1)
Knotenfärbungsproblem für Graphen
Gegeben: ein ungerichteter GraphG = (V,E)
Ziel: Färbe die Knoten inV mit möglichst wenigen Farben, sodass benachbarte Knoten immer verschiedene Farben erhalten
Offizielle Definition
• EineFärbungist eine Funktionf :V → {1, . . . ,k}
sodassf(x)6=f(y)für alle{x,y} ∈E gilt.
• Diechromatische Zahlχ(G)ist die kleinste Zahlk, für die eine derartige Färbung der Knoten existiert.
• χ(Kn) =n
• Für jeden BaumT mit mindestens zwei Knoten giltχ(T) =2
• Fürn≥1 giltχ(C2n+1) =3
Greedy: kann beliebig schlecht sein (2)
Greedy Algorithmus für Knotenfärbung So lange es einen ungefärbten Knoten gibt:
1 Wähle einen beliebigen Knoten v
2 Färbe Knoten v mit der kleinstmöglichen legalen Farbe
Beispiel
Wir betrachten bipartiten Graphen mit
• Knotenx1, . . .xn undy1, . . .yn
• Kanten{xi,yj} ∈E genau dann wenni6=j
Falls Greedy die Reihenfolgex1,y1, x2,y2, x3,y3, . . .xn,yn verwendet, so braucht Greedy nverschiedene Farben
Aber:χ(G) =2 !!
Greedy: kann beliebig schlecht sein (2)
Greedy Algorithmus für Knotenfärbung So lange es einen ungefärbten Knoten gibt:
1 Wähle einen beliebigen Knoten v
2 Färbe Knoten v mit der kleinstmöglichen legalen Farbe
Beispiel
Wir betrachten bipartiten Graphen mit
• Knotenx1, . . .xn undy1, . . .yn
• Kanten{xi,yj} ∈E genau dann wenni6=j
Falls Greedy die Reihenfolgex1,y1, x2,y2, x3,y3, . . .xn,yn verwendet, so braucht Greedy nverschiedene Farben
Aber:χ(G) =2 !!
Greedy: kann beliebig schlecht sein (2)
Greedy Algorithmus für Knotenfärbung So lange es einen ungefärbten Knoten gibt:
1 Wähle einen beliebigen Knoten v
2 Färbe Knoten v mit der kleinstmöglichen legalen Farbe
Beispiel
Wir betrachten bipartiten Graphen mit
• Knotenx1, . . .xn undy1, . . .yn
• Kanten{xi,yj} ∈E genau dann wenni6=j
Falls Greedy die Reihenfolgex1,y1, x2,y2, x3,y3, . . .xn,yn verwendet, so braucht Greedy nverschiedene Farben
Aber:χ(G) =2 !!
Greedy: kann beliebig schlecht sein (2)
Greedy Algorithmus für Knotenfärbung So lange es einen ungefärbten Knoten gibt:
1 Wähle einen beliebigen Knoten v
2 Färbe Knoten v mit der kleinstmöglichen legalen Farbe
Beispiel
Wir betrachten bipartiten Graphen mit
• Knotenx1, . . .xn undy1, . . .yn
• Kanten{xi,yj} ∈E genau dann wenni6=j
Falls Greedy die Reihenfolgex1,y1, x2,y2, x3,y3, . . .xn,yn verwendet, so braucht Greedy nverschiedene Farben
Aber:χ(G) =2 !!
Sequentielle Speicherung
Sequentielle Speicherung
Problem: Dateien am Magnetband
Eingabe: 1 DateienD1, . . . ,Dn mit LängenL[1], . . . ,L[n]
2 Ein Magnetband
Ausgabe: Eine Anordnung der Dateien auf dem Magnetband, die die durchschnittliche Lesezeit minimiert.
Angenommen, die Dateien sind in ReihenfolgeD1, . . . ,Dn abgespeichert Bei jedem Lesezugriff wird das Band vom Anfang an gelesen, bis korrekte Datei gefunden
Lesezeit fürDk ist dannPk i=1L[i] Durchschnittliche Lesezeit beträgt dann
1 n
n
X
k=1 k
X
i=1
L[i] = 1 n
n
X
k=1
(n−k+1)L[k]
Sequentielle Speicherung
Problem: Dateien am Magnetband
Eingabe: 1 DateienD1, . . . ,Dn mit LängenL[1], . . . ,L[n]
2 Ein Magnetband
Ausgabe: Eine Anordnung der Dateien auf dem Magnetband, die die durchschnittliche Lesezeit minimiert.
Angenommen, die Dateien sind in ReihenfolgeD1, . . . ,Dn abgespeichert Bei jedem Lesezugriff wird das Band vom Anfang an gelesen, bis korrekte Datei gefunden
Lesezeit fürDk ist dannPk i=1L[i]
Durchschnittliche Lesezeit beträgt dann 1
n
n
X
k=1 k
X
i=1
L[i] = 1 n
n
X
k=1
(n−k+1)L[k]
Sequentielle Speicherung
Problem: Dateien am Magnetband
Eingabe: 1 DateienD1, . . . ,Dn mit LängenL[1], . . . ,L[n]
2 Ein Magnetband
Ausgabe: Eine Anordnung der Dateien auf dem Magnetband, die die durchschnittliche Lesezeit minimiert.
Angenommen, die Dateien sind in ReihenfolgeD1, . . . ,Dn abgespeichert Bei jedem Lesezugriff wird das Band vom Anfang an gelesen, bis korrekte Datei gefunden
Lesezeit fürDk ist dannPk i=1L[i]
Durchschnittliche Lesezeit beträgt dann 1
n
n
X
k=1 k
X
i=1
L[i] = 1 n
n
X
k=1
(n−k+1)L[k]
Sequentielle Speicherung: Analyse
Problem
Eingabe: ZahlenL[1], . . . ,L[n]
Ausgabe: Permutationπ, die 1 n
n
X
k=1
(n−k+1)L[π(k)]minimiert
Angenommen,
an Stellek liegt Datei mit Längex und an Stellek+1 liegt Datei mit Längey<x
• Beitrag zur Zielfunktion ist(n−k+1)x+ (n−k)y
• Vertauschen der Dateien liefert neuen Beitrag(n−k+1)y+ (n−k)x
• Neuer Beitrag ist besser/kleiner
Sequentielle Speicherung: Analyse
Problem
Eingabe: ZahlenL[1], . . . ,L[n]
Ausgabe: Permutationπ, die 1 n
n
X
k=1
(n−k+1)L[π(k)]minimiert
Angenommen,
an Stellek liegt Datei mit Längex und an Stellek+1 liegt Datei mit Längey<x
• Beitrag zur Zielfunktion ist(n−k+1)x+ (n−k)y
• Vertauschen der Dateien liefert neuen Beitrag(n−k+1)y+ (n−k)x
• Neuer Beitrag ist besser/kleiner
Sequentielle Speicherung: Analyse
Problem
Eingabe: ZahlenL[1], . . . ,L[n]
Ausgabe: Permutationπ, die 1 n
n
X
k=1
(n−k+1)L[π(k)]minimiert
Angenommen,
an Stellek liegt Datei mit Längex und an Stellek+1 liegt Datei mit Längey<x
• Beitrag zur Zielfunktion ist(n−k+1)x+ (n−k)y
• Vertauschen der Dateien liefert neuen Beitrag(n−k+1)y+ (n−k)x
• Neuer Beitrag ist besser/kleiner
Sequentielle Speicherung: Analyse
Problem
Eingabe: ZahlenL[1], . . . ,L[n]
Ausgabe: Permutationπ, die 1 n
n
X
k=1
(n−k+1)L[π(k)]minimiert
Angenommen,
an Stellek liegt Datei mit Längex und an Stellek+1 liegt Datei mit Längey<x
• Beitrag zur Zielfunktion ist(n−k+1)x+ (n−k)y
• Vertauschen der Dateien liefert neuen Beitrag(n−k+1)y+ (n−k)x
• Neuer Beitrag ist besser/kleiner
Sequentielle Speicherung: Lösung
Satz / Folgerung / Zusammenfassung
Um die durchschnittliche Lesezeit zu minimieren,
müssen Dateien nach monoton steigender Länge abgespeichert werden.
Greedy Algorithmus für Sequentielle Speicherung So lange noch (ungespeicherte) Dateien vorhanden sind:
1 Wähle eine kürzeste Datei
2 Speichere die Datei an der nächsten Stelle am Band ab Resultierende Laufzeit istO(nlogn)
Sequentielle Speicherung: Lösung
Satz / Folgerung / Zusammenfassung
Um die durchschnittliche Lesezeit zu minimieren,
müssen Dateien nach monoton steigender Länge abgespeichert werden.
Greedy Algorithmus für Sequentielle Speicherung So lange noch (ungespeicherte) Dateien vorhanden sind:
1 Wähle eine kürzeste Datei
2 Speichere die Datei an der nächsten Stelle am Band ab Resultierende Laufzeit istO(nlogn)
Variante mit Wahrscheinlichkeiten
Problem
Eingabe: 1 DateienD1, . . . ,Dn
2 LängenL[1], . . . ,L[n]der Dateien
3 Zugriffswahrscheinlichkeitenp[1], . . . ,p[n]der Dateien (wobei Summe derp[i]gleich 1)
Ausgabe: Eine Anordnung der Dateien auf dem Magnetband, die die erwartete Lesezeit minimiert.
Angenommen, die Dateien sind in ReihenfolgeD1, . . . ,Dn abgespeichert Lesezeit fürDk ist dannPk
i=1L[i] Durchschnittliche Lesezeit beträgt dann
n
X
k=1
p[k]
k
X
i=1
L[i] =
n
X
i=1
L[i]
n
X
k=i
p[k]
Variante mit Wahrscheinlichkeiten
Problem
Eingabe: 1 DateienD1, . . . ,Dn
2 LängenL[1], . . . ,L[n]der Dateien
3 Zugriffswahrscheinlichkeitenp[1], . . . ,p[n]der Dateien (wobei Summe derp[i]gleich 1)
Ausgabe: Eine Anordnung der Dateien auf dem Magnetband, die die erwartete Lesezeit minimiert.
Angenommen, die Dateien sind in ReihenfolgeD1, . . . ,Dn abgespeichert Lesezeit fürDk ist dannPk
i=1L[i]
Durchschnittliche Lesezeit beträgt dann
n
X
k=1
p[k]
k
X
i=1
L[i] =
n
X
i=1
L[i]
n
X
k=i
p[k]
Variante mit Wahrscheinlichkeiten: Analyse
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
Beitrag =(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+qx
Beitrag nach Vertauschen der beiden Dateien
=(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+py
Genaues Hingucken liefert:
alter Beitrag <neuer Beitrag genau dann wenn qx <py
Variante mit Wahrscheinlichkeiten: Analyse
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
Beitrag =(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+qx
Beitrag nach Vertauschen der beiden Dateien
=(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+py
Genaues Hingucken liefert:
alter Beitrag <neuer Beitrag genau dann wenn qx <py
Variante mit Wahrscheinlichkeiten: Analyse
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
Beitrag =(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+qx
Beitrag nach Vertauschen der beiden Dateien
=(p+q)
k−1
X
i=1
L[i] + (x+y)
n
X
j=k+2
p[j] + px+qy+py
Genaues Hingucken liefert:
alter Beitrag <neuer Beitrag genau dann wenn qx<py
Variante mit Wahrscheinlichkeiten: Lösung
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
• alter Beitrag<neuer Beitrag genau dann wenn qx<py
• alter Beitrag<neuer Beitrag genau dann wenn x/p<y/q
Satz / Folgerung / Zusammenfassung Um die erwartete Lesezeit zu minimieren,
müssen die Dateien nach monoton steigendem Quotienten L[i]/p[i] abgespeichert werden.
• Wir erhalten einfachen Greedy Algorithmus
• Kurze und populäre Dateien am Anfang des Bandes Lange und unpopuläre Dateien am Ende des Bandes
• Resultierende Laufzeit istO(nlogn)
Variante mit Wahrscheinlichkeiten: Lösung
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
• alter Beitrag<neuer Beitrag genau dann wenn qx<py
• alter Beitrag<neuer Beitrag genau dann wenn x/p<y/q
Satz / Folgerung / Zusammenfassung Um die erwartete Lesezeit zu minimieren,
müssen die Dateien nach monoton steigendem Quotienten L[i]/p[i]
abgespeichert werden.
• Wir erhalten einfachen Greedy Algorithmus
• Kurze und populäre Dateien am Anfang des Bandes Lange und unpopuläre Dateien am Ende des Bandes
• Resultierende Laufzeit istO(nlogn)
Variante mit Wahrscheinlichkeiten: Lösung
Angenommen,
an Stellek liegt Datei mit Längex und Wahrscheinlichkeitp an Stellek+1 liegt Datei mit Längey und Wahrscheinlichkeitq
• alter Beitrag<neuer Beitrag genau dann wenn qx<py
• alter Beitrag<neuer Beitrag genau dann wenn x/p<y/q
Satz / Folgerung / Zusammenfassung Um die erwartete Lesezeit zu minimieren,
müssen die Dateien nach monoton steigendem Quotienten L[i]/p[i]
abgespeichert werden.
• Wir erhalten einfachen Greedy Algorithmus
• Kurze und populäre Dateien am Anfang des Bandes Lange und unpopuläre Dateien am Ende des Bandes
• Resultierende Laufzeit istO(nlogn)
Stundenplanung
Stundenplanung: Beispiel
Stundenplanung: Beispiel
Stundenplanung: Problemstellung
Problem: Stundenplanung
Eingabe: 1 VorträgeV1, . . . ,Vn
2 StartzeitenL[1], . . . ,L[n]der Vorträge
3 EndzeitenR[1], . . . ,R[n]der Vorträge
Ausgabe: Eine möglichst grosse Teilmenge von Vorträgen, die zeitlich nicht überlappen
Stundenplanung: Beispiel, umgeordnet
Greedy Algorithmus
1 S o r t i e r e V o r t r a e g e n a c h a n s t e i g e n d e m E n d p u n k t R [ i ] 2 // R [1] <= R [2] <= ... <= R [ n ]
3
4 c o u n t = 1;
5 L o e s u n g [ c o u n t ] = 1;
6
7 for ( i =2; i <= n ; i ++) { 8 if ( L [ i ] > R [ c o u n t ])
9 { L o e s u n g [++ c o u n t ] = i ; }
10 }
11
12 r e t u r n L o e s u n g [ 1 . . c o u n t ];
Korrektheit (1)
Wir nehmenR[1]≤R[2]≤R[3]≤ · · · ≤R[n]an Satz
Es gibt eine optimale Lösung des Stundenplanung-Problems, die VortragV1(mit kleinstem rechten Endpunkt R[1]) verwendet.
Beweis:
• Betrachte beliebige optimale LösungX∗, dieV1nicht verwendet
• Betrachte VortragVk in X∗ mit kleinstem rechten Endpunkt R[k]
• Dann giltR[k]≥R[1]
• Wir können problemlos inX∗ den VortragVk durchV1ersetzen
• Neue zulässige Lösung mit gleich vielen Vorträgen wieX∗
• Ergo: neue Lösung ebenfalls optimal
Korrektheit (1)
Wir nehmenR[1]≤R[2]≤R[3]≤ · · · ≤R[n]an Satz
Es gibt eine optimale Lösung des Stundenplanung-Problems, die VortragV1(mit kleinstem rechten Endpunkt R[1]) verwendet.
Beweis:
• Betrachte beliebige optimale LösungX∗, dieV1nicht verwendet
• Betrachte VortragVk in X∗ mit kleinstem rechten Endpunkt R[k]
• Dann giltR[k]≥R[1]
• Wir können problemlos inX∗ den VortragVk durchV1ersetzen
• Neue zulässige Lösung mit gleich vielen Vorträgen wieX∗
• Ergo: neue Lösung ebenfalls optimal
Korrektheit (2)
Wir nehmenR[1]≤R[2]≤R[3]≤ · · · ≤R[n]an Satz
Der Greedy Algorithmus berechnet eine optimale Lösung.
Beweis:
• Wir betrachten optimale LösungX∗ , dieV1enthält
• Dann enthältX∗ keinen Vortrag, der mitV1überlappt
• Wir löschenV1und alle überlappenden Vorträge
• Wir argumentieren induktiv für die weiteren Vorträge
Korrektheit (2)
Wir nehmenR[1]≤R[2]≤R[3]≤ · · · ≤R[n]an Satz
Der Greedy Algorithmus berechnet eine optimale Lösung.
Beweis:
• Wir betrachten optimale LösungX∗, die V1 enthält
• Dann enthältX∗ keinen Vortrag, der mitV1überlappt
• Wir löschenV1und alle überlappenden Vorträge
• Wir argumentieren induktiv für die weiteren Vorträge
Intermezzo: Anmerkung zu Greedy
Algorithmen
Anmerkung zu Greedy Algorithmen
Die Korrektheitsargumente
• für den Greedy Algorithmus zur sequentiellen Speicherung und
• für den Greedy Algorithmus zur Stundenplanung sind ganz ähnlich strukturiert.
Angenommen, es gibt eine optimale Lösung, die sich von der Greedy Lösung unterscheidet
Finde den “ersten”Unterschied zwischen den beiden Lösungen Argumentiere, dass man die optimale Entscheidung durch die Greedy Entscheidung ersetzen kann, ohne die Qualität zu verschlechtern
• Sequentielle Speicherung: kleinster Index mitL[π(k)]>L[π(k+1)]
• Stundenplanung: frühester Vortrag mit (lokal) nicht-kleinstem rechten Endpunkt
Huffman Codes
Definitionen (1)
Ein Binär-Codekodiert jeden Buchstaben eines Alphabets Σdurch einen String von0en und1en
Ein Binär-Code istpräfix-frei, wenn kein Codewort der Präfix eines anderen Codeworts ist.
Beispiel
7-Bit ASCII kodiert jeden Buchstaben durch einen String mit 7 Bits. 7-Bit ASCII ist ein präfix-freier Binär-Code.
Der Morse-Code ist ein Binär-Code. Der Morse-Code ist nicht präfix-frei:
Codewort fürA(·–) ist Präfix des Codeworts fürJ(·– – –)
Definitionen (1)
Ein Binär-Codekodiert jeden Buchstaben eines Alphabets Σdurch einen String von0en und1en
Ein Binär-Code istpräfix-frei, wenn kein Codewort der Präfix eines anderen Codeworts ist.
Beispiel
7-Bit ASCII kodiert jeden Buchstaben durch einen String mit 7 Bits.
7-Bit ASCII ist ein präfix-freier Binär-Code.
Der Morse-Code ist ein Binär-Code. Der Morse-Code ist nicht präfix-frei:
Codewort fürA(·–) ist Präfix des Codeworts fürJ(·– – –)
Definitionen (1)
Ein Binär-Codekodiert jeden Buchstaben eines Alphabets Σdurch einen String von0en und1en
Ein Binär-Code istpräfix-frei, wenn kein Codewort der Präfix eines anderen Codeworts ist.
Beispiel
7-Bit ASCII kodiert jeden Buchstaben durch einen String mit 7 Bits.
7-Bit ASCII ist ein präfix-freier Binär-Code.
Der Morse-Code ist ein Binär-Code.
Der Morse-Code ist nicht präfix-frei:
Codewort fürA(·–) ist Präfix des Codeworts fürJ(·– – –)
Definitionen (2)
Jeder präfix-freie Binär-Code kann durch Binär-Baum dargestellt werden:
Die Buchstaben des AlphabetsΣsind in den Blättern
Das Codewort für Buchstaben entspricht Pfad von Wurzel zu Blatt Entlang des Pfades gilt: Links=0 und Rechts=1
Längedes Codeworts =Tiefedes Blattes im Baum
Definitionen (3)
Optimierungsziel: Kodierte Botschaften sollen so kurz wie möglich sein Problem: Optimaler präfix-freier Binär-Code
Eingabe: 1 Ein AlphabetΣmitnBuchstaben
2 Die Texthäufigkeitenh1,h2, . . . ,hn der Buchstaben Ausgabe: Ein präfix-freier Binär-Code, der die Gesamtlänge der
kodierten Botschaft minimiert:
Gesamtlänge =
k
X
i=1
hi·Tiefe[i]
Beispiel (1)
A C D E F G H I L N
3 3 2 26 5 3 8 13 2 16
O R S T U V W X Y Z
9 6 27 22 2 5 8 4 5 1
Beispiel (2)
170
59 111
32 60 51
25
12
6 6
3
39 21
17 10 11
8
4 16
27S
16N
W8 H8
X4
O9 22T
F5 V
5 Y
5 R
6
A3 C
3 G
3
D2 Z 1 13I
26E
U2 L2
Huffman Algorithmus
David Albert Huffman (1925–1999):
Amerikanischer Computer Scientist; MIT; UC Santa Cruz
Greedy Algorithmus (Huffman, 1951)
So lange zwei oder mehr Buchstaben vorhanden sind:
1 Verschmilz die beiden Buchstaben mit kleinster Häufigkeithundh0
2 Das verschmolzene Resultat erhält Häufigkeit h+h0 Implementierung: mit MinHeap (ExtractMin; Insert)
Huffman Algorithmus
Build-Huffman-Tree
1 v o i d H u f f m a n T r e e ( int & f r e q u e n c y [2 n ] ,
2 & L [2 n ] , & R [2 n ] , & p a r e n t [2 n ]) { 3
4 for ( i =1; i <= n ; i ++) { 5 L [ i ] = 0 ; R [ i ] = 0 ;
6 i n s e r t ( i , f r e q u e n c y [ i ])
7 }
8
9 for ( i = n +1; i <=2 n -1; i ++) { 10 x = E x t r a c t M i n () ; 11 y = E x t r a c t M i n () ;
12 f r e q u e n c y [ i ] = f r e q u e n c y [ x ]+ f r e q u e n c y [ y ]
13 L [ i ]= x ; R [ i ]= y ;
14 p a r e n t [ x ]= i ; p a r e n t [ y ]= i ; 15 I n s e r t ( i , f r e q u e n c y [ i ])
16 }
17
18 p a r e n t [2 n - 1 ] = 0;
19 }
Korrektheit (1)
Unser Ziel:
Wir wollen nun zeigen, dass der Huffman Algorithmus für jede Folge h1, . . . ,hnvon Häufigkeiten einen optimalen präfix-freien Binär-Code berechnet.
Die Fällen≤2sind trivial.
Wir nehmen von jetzt ann≥3 an.
Beobachtung
Wir betrachten einen optimalen präfix-freien Binär-Code.
Es seibein Blatt mit maximaler Tiefe im entsprechenden Binär-Baum.
Dann gibt es ein anderes Blattb0,
das die selbe Tiefe und den selben Vater wiebhat.
Korrektheit (2)
Beobachtung
Es seiena mit Häufigkeitha undb mit Häufigkeithb zwei Buchstaben mit geringster Häufigkeit.
Dann existiert ein optimaler präfix-freier Binär-Code, in dessen Baum die beiden Buchstabenaundb
1 Geschwister sind, und
2 zwei Blätter mit maximaler Tiefe sind.
Beweis:
• Andernfalls vertauschen wir Blatta mit Blattx mit maximaler Tiefe
• Tiefe[a] = alte Tiefe vona; Tiefe[x]= alte Tiefe vonx
• Man rechnet leicht nach:
ha·Tiefe[a] +hx·Tiefe[x] ≥ ha·Tiefe[x] +hx·Tiefe[a]
Korrektheit (2)
Beobachtung
Es seiena mit Häufigkeitha undb mit Häufigkeithb zwei Buchstaben mit geringster Häufigkeit.
Dann existiert ein optimaler präfix-freier Binär-Code, in dessen Baum die beiden Buchstabenaundb
1 Geschwister sind, und
2 zwei Blätter mit maximaler Tiefe sind.
Beweis:
• Andernfalls vertauschen wir Blatta mit Blattx mit maximaler Tiefe
• Tiefe[a] = alte Tiefe vona; Tiefe[x]= alte Tiefe vonx
• Man rechnet leicht nach:
ha·Tiefe[a] +hx·Tiefe[x] ≥ ha·Tiefe[x] +hx·Tiefe[a]
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (3)
• Wir betrachten HäufigkeitenH= (h1, . . . ,hn)mith1≥h2≥ · · · ≥hn
• Es seiT der optimale Baum fürH
• OBdA: Die beiden Buchstaben mit Häufigkeitenhn−1undhnsind Blätter inT, mit maximaler Tiefe und mit selbem Vater
• Wir konstruieren neuen BaumT0: Wir verschmelzen diese beiden Blätter mit Vater, und geben Vaterv0 die Häufigkeith0:=hn−1+hn
• Tiefe[v0]= Tiefe[n]−1
cost(T) =
k
X
i=1
hi·Tiefe[i]
= cost(T0) +hn−1·Tiefe[n] +hn·Tiefe[n]−h0·Tiefe[v0]
= cost(T0) + (hn−1+hn−h0)·Tiefe[n] + h0
= cost(T0) + (hn−1+hn)
Korrektheit (4)
Aus der Gleichung
cost(T) = cost(T0) +(hn−1+hn)
folgt, dass wir nur die Kosten von T0 minimieren müssen, falls wir die Kosten vonT minimieren wollen
Restproblem: Finde einen optimalen präfix-freien Binär-Code für die HäufigkeitenH0= (h1,h2, . . . ,hn−2, hn−1+hn)
Induktives Argument: Huffman liefert optimalen Binär-Baum für H0 Ergo: Huffman liefert optimalen Binär-Baum fürH
Satz
Der Huffman Algorithmus bestimmt für jede Häufigkeits-Verteilung einen optimalen präfix-freien Binär-Code.
Korrektheit (4)
Aus der Gleichung
cost(T) = cost(T0) +(hn−1+hn)
folgt, dass wir nur die Kosten von T0 minimieren müssen, falls wir die Kosten vonT minimieren wollen
Restproblem: Finde einen optimalen präfix-freien Binär-Code für die HäufigkeitenH0= (h1,h2, . . . ,hn−2, hn−1+hn)
Induktives Argument: Huffman liefert optimalen Binär-Baum für H0 Ergo: Huffman liefert optimalen Binär-Baum fürH
Satz
Der Huffman Algorithmus bestimmt für jede Häufigkeits-Verteilung einen optimalen präfix-freien Binär-Code.
Korrektheit (4)
Aus der Gleichung
cost(T) = cost(T0) +(hn−1+hn)
folgt, dass wir nur die Kosten von T0 minimieren müssen, falls wir die Kosten vonT minimieren wollen
Restproblem: Finde einen optimalen präfix-freien Binär-Code für die HäufigkeitenH0= (h1,h2, . . . ,hn−2, hn−1+hn)
Induktives Argument: Huffman liefert optimalen Binär-Baum für H0 Ergo: Huffman liefert optimalen Binär-Baum fürH
Satz
Der Huffman Algorithmus bestimmt für jede Häufigkeits-Verteilung einen optimalen präfix-freien Binär-Code.
Korrektheit (4)
Aus der Gleichung
cost(T) = cost(T0) +(hn−1+hn)
folgt, dass wir nur die Kosten von T0 minimieren müssen, falls wir die Kosten vonT minimieren wollen
Restproblem: Finde einen optimalen präfix-freien Binär-Code für die HäufigkeitenH0= (h1,h2, . . . ,hn−2, hn−1+hn)
Induktives Argument: Huffman liefert optimalen Binär-Baum für H0 Ergo: Huffman liefert optimalen Binär-Baum fürH
Satz
Der Huffman Algorithmus bestimmt für jede Häufigkeits-Verteilung einen optimalen präfix-freien Binär-Code.
Organisatorisches
• Nächste Vorlesung:
Dienstag, Juli 18, Aula 1, zur gewohnten Zeit
• Webseite:http://algo.rwth-aachen.de/Lehre/SS17/DSA.php