28.12.2013 Aufrufe

Teil 4: Algorithmen-Entwurfstechniken Idee der Greedy-Algorithmen ...

Teil 4: Algorithmen-Entwurfstechniken Idee der Greedy-Algorithmen ...

Teil 4: Algorithmen-Entwurfstechniken Idee der Greedy-Algorithmen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Idee</strong> <strong>der</strong> <strong>Greedy</strong>-<strong>Algorithmen</strong><br />

<strong>Teil</strong> 4:<br />

<strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong><br />

• <strong>Greedy</strong>-<strong>Algorithmen</strong><br />

– <strong>Idee</strong><br />

– Job Scheduling<br />

– Datenkompression mit dem Huffman-Verfahren<br />

– Bin Packing<br />

• <strong>Teil</strong>e-und-Herrsche-Verfahren<br />

• Dynamisches Programmieren<br />

<strong>Idee</strong>:<br />

• Löse ein Problem, indem mit einer einfachen <strong>Teil</strong>lösung begonnen und diese<br />

schrittweise erweitert wird.<br />

• Wähle dabei immer den bestmöglichen Schritt,<br />

ohne Berücksichtigung zukünftiger Schritte:<br />

„Nimm immer das größte Stück zuerst“; greedy = gierig, gefräßig.<br />

<strong>Algorithmen</strong>-Schema:<br />

while (Problem nicht gelöst)<br />

{<br />

wähle bestmöglichen Schritt s nach einer greedy-Strategie;<br />

baue Schritt in Lösung ein;<br />

}<br />

<strong>Greedy</strong>-Schritt<br />

Beispiele für <strong>Greedy</strong>-<strong>Algorithmen</strong>:<br />

• Kürzeste Wege in gewichteten Graphen mit dem Algorithmus von Dijkstra<br />

• Minimal aufspannen<strong>der</strong> Baum mit dem Algorithmus von Kruskal<br />

• Minimal aufspannen<strong>der</strong> Baum mit dem Algorithmus von Prim<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-1<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-2<br />

Wechselgeld-Algorithmus<br />

Problem:<br />

Gib einen Betrag in Euro mit möglichst wenig Münzen und Scheinen heraus.<br />

Beispiel: 17,69 € = 10 € + 5 € + 2 € + 50 Ct + 10 Ct + 5 Ct + 2 Ct + 2 Ct<br />

<strong>Greedy</strong>-Algorithmus:<br />

void wechselgeld(double betrag)<br />

{<br />

herausgegeben = 0;<br />

while (herausgegeben < betrag)<br />

<strong>Greedy</strong>-Schritt<br />

{<br />

wähle größtmögliche Münze bzw. Schein s mit herausgegeben + s ≤ betrag;<br />

cout


Job-Scheduling für Multiprozessorssysteme (1)<br />

Problem:<br />

Gegeben seinen n Jobs<br />

j 1 , j 2 , …, j n<br />

mit den Ausführungszeiten<br />

t 1 , t 2 , …, t n<br />

Die Jobs sollen p Prozessoren so zugeteilt werden, dass eine bestimmte<br />

Zielfunktion minimiert wird:<br />

(1) Minimiere durchschnittliche Abschlusszeit,<br />

wobei: Abschlusszeit für Job = Wartezeit + Ausführungszeit.<br />

(2) Minimiere gesamte Abschlusszeit:<br />

d.h. Zeit, in <strong>der</strong> alle Jobs abgeschlossen sind<br />

<strong>Greedy</strong>-Algorithmus: Shortest-Job-First<br />

Wähle einen noch nicht bedienten Job mit kürzester Ausführungszeit und teile ihn<br />

demjenigen Prozessor zu, <strong>der</strong> als nächster einen Job bedienen kann.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-5<br />

Job-Scheduling für Multiprozessorssysteme (2)<br />

Beispiel:<br />

Job<br />

Zeit<br />

j 1<br />

3<br />

j 2<br />

5<br />

j 3<br />

j 4<br />

6<br />

j 5<br />

10<br />

j 6<br />

11<br />

j 7<br />

14<br />

j 8<br />

15<br />

18<br />

j 9<br />

20<br />

j 1<br />

j 2<br />

j 3<br />

j 4<br />

j 5<br />

j 6<br />

j 7<br />

j 8<br />

j 9<br />

6 20 40<br />

Zuteilung <strong>der</strong> Jobs an 3 Prozessoren mit<br />

dem Shortest-Job-First-Algorithmus<br />

Minimierung <strong>der</strong> durchschnittlichen Abschlusszeit<br />

Der Shortest-Job-First-Algorithmus liefert immer eine optimale Lösung.<br />

Begründung:<br />

Im Beispiel ist die durchschnittliche Abschlusszeit:<br />

[ t 1 + t 2 + t 3 + (t 1 +t 4 ) + (t 2 +t 5 ) + (t 3 +t 6 ) + (t 1 +t 4 +t 7 ) + (t 2 +t 5 +t 8 ) + (t 3 +t 6 +t 9 ) ] / 9<br />

= [ 3t 1 +3t 2 +3t +2t 3 4 +2t 5 +2t 6 + t 7 + t 8 + t 9 ] / 9<br />

Dieser Wert ist minimal, wenn t 1 ,t 2 ,t ≤ t 3 4 ,t 5 ,t 6 ≤ t 7 ,t 8, t 9 .<br />

Das wird jedoch vom Algorithmus gewährleistet.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-6<br />

Job-Scheduling für Multiprozessorssysteme (3)<br />

Minimierung <strong>der</strong> gesamten Abschlusszeit<br />

Der Shortest-Job-First-Algorithmus liefert im allgemeinen nur eine suboptimale Lösung.<br />

Im Beispiel ist die gesamte Abschlusszeit = 40.<br />

Folgendes Lösung zeigt, dass auch eine gesamte Abschlusszeit<br />

von 34 erreicht werden kann.<br />

<strong>Teil</strong> 4:<br />

<strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong><br />

j 1<br />

j 3<br />

j 4<br />

j 7<br />

j 2 j 5<br />

j 8<br />

j 6<br />

j 9<br />

14 34<br />

Das Problem <strong>der</strong> Minimierung <strong>der</strong> gesamten Abschlusszeit beim Job-Scheduling<br />

ist NP-vollständig.<br />

Für NP-vollständige Probleme sind zur Zeit nur exponentielle Verfahren (d.h. O(2 n ))<br />

bekannt.<br />

Es ist ein bisher berühmtes ungelöstes Problem in <strong>der</strong> Informatik, ob es für<br />

NP-vollständige Probleme schnellere Verfahren gibt (d.h. polynomielle Vefahren O(n k )).<br />

Viele Indizien sprechen dafür, dass es für NP-vollständige Probleme keine schnelleren<br />

Verfahren gibt.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-7<br />

• <strong>Greedy</strong>-<strong>Algorithmen</strong><br />

– <strong>Idee</strong><br />

– Job Scheduling<br />

– Datenkompression mit dem Huffman-Verfahren<br />

– Bin Packing<br />

• <strong>Teil</strong>e-und-Herrsche-Verfahren<br />

• Dynamisches Programmieren<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-8


Datenkompression (1)<br />

Problem:<br />

Gegeben ist ein Text t als Folge von ASCII-Zeichen,<br />

<strong>der</strong>en Häufigkeiten im Text bekannt sind.<br />

Beispiel:<br />

Datenkompression (2)<br />

Codebäume:<br />

Wir wollen uns hier auf binäre Codierung <strong>der</strong> Einzelzeichen einschränken,<br />

wobei sich <strong>der</strong> Binärcode in einem Code-Baum darstellen lässt.<br />

Wichtig: Zu codierende Zeichen sind die Blätter des Code-Baums.<br />

Zeichen<br />

a<br />

e<br />

Häufigkeit<br />

10<br />

15<br />

Beispiele:<br />

nl<br />

i<br />

s<br />

12<br />

3<br />

a e i s t sp nl<br />

a e i s<br />

t<br />

sp<br />

t<br />

4<br />

Zeichen<br />

Code<br />

Zeichen<br />

Code<br />

space<br />

newline<br />

13<br />

1<br />

a<br />

e<br />

i<br />

000<br />

001<br />

010<br />

a<br />

e<br />

i<br />

0000<br />

0001<br />

0010<br />

Gesucht ist eine möglichst kurze binäre Codierung des Textes t.<br />

Selbstverständlich sollte <strong>der</strong> codierte Text auch wie<strong>der</strong> decodierbar sein.<br />

s<br />

t<br />

sp<br />

nl<br />

011<br />

100<br />

101<br />

110<br />

s<br />

t<br />

sp<br />

nl<br />

0011<br />

010<br />

011<br />

1<br />

Binärcode mit<br />

konstanter Bitlänge<br />

Binärcode mit<br />

variabler Bitlänge<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-9<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-10<br />

Datenkompression (3)<br />

Fano-Bedingung:<br />

Ein Code erfüllt die Fano-Bedingung, falls keine Codierung eines Zeichens Präfix<br />

(Anfangstück) einer Codierung eines an<strong>der</strong>en Zeichen ist.<br />

Durch Code-Bäume dargestellte Bäume erfüllen immer die Fano-Bedingung.<br />

Codes, die Fano-Bedingung erfüllen, sind eindeutig decodierbar.<br />

Beispiel:<br />

Decodieren Sie folgende Binärfolge mit dem unten gegebenen Binärcode:<br />

0010110110100010<br />

Datenkompression (4)<br />

Algorithmus von Huffman:<br />

• <strong>Idee</strong>:<br />

Verwende einen Binärcode variabler Länge, wobei häufigere Zeichen kürzere<br />

Codierungen erhalten.<br />

• Verfahren:<br />

(1) Beginne mit einem Wald von Code-Bäumen,<br />

wobei je<strong>der</strong> Baum anfangs aus genau einem Zeichen besteht.<br />

Je<strong>der</strong> Baum besitzt außerdem ein Gewicht w, das gleich <strong>der</strong> Summe <strong>der</strong><br />

Häufigkeiten <strong>der</strong> Zeichen im Baum ist.<br />

nl<br />

Zeichen<br />

a<br />

Code<br />

0000<br />

(2) <strong>Greedy</strong>-Schritt:<br />

Wähle die beiden Bäume t 1<br />

und t 2<br />

mit den kleinsten Gewichten w 1<br />

und w 2<br />

und bilde daraus einen neuen Baum mit dem Gewicht w = w 1<br />

+ w 2<br />

:<br />

a e i s<br />

t<br />

sp<br />

e<br />

i<br />

s<br />

0001<br />

0010<br />

0011<br />

t 1<br />

t 2<br />

t<br />

010<br />

sp<br />

nl<br />

011<br />

1<br />

(3) Wie<strong>der</strong>hole Schritt (2) solange, bis nur noch ein Baum vorhanden ist.<br />

Dieser Baum ist dann <strong>der</strong> gesuchte optimale Binärcode.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-11<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-12


Datenkompression (5)<br />

Datenkompression (6)<br />

Beispiel:<br />

Zeichen Häufigkeit<br />

a<br />

e<br />

i<br />

s<br />

t<br />

sp<br />

nl<br />

10<br />

15<br />

12<br />

3<br />

4<br />

13<br />

1<br />

Schritt (1):<br />

Wald von Bäumen mit jeweils genau einem Zeichen und Häufigkeiten als Gewichte (blau)<br />

Beispiel (Fortsetzung):<br />

c)<br />

d)<br />

10 15 12 13<br />

a e i sp<br />

15 12 13<br />

e i sp<br />

s<br />

nl<br />

t<br />

s<br />

18<br />

a<br />

8<br />

nl<br />

t<br />

f)<br />

g)<br />

i<br />

25<br />

sp<br />

s<br />

nl<br />

58<br />

33<br />

e<br />

a<br />

t<br />

a)<br />

10 15 12 3 4 13 1<br />

a e i s t sp nl<br />

Schritt (2) wie<strong>der</strong>holt angewendet:<br />

Baue die beiden Bäume mit geringstem Gewicht zu einem Baum zusammen.<br />

b)<br />

10 15 12 4 13 4<br />

a e i t sp<br />

s nl<br />

e)<br />

15<br />

e<br />

i<br />

25<br />

sp<br />

s<br />

nl<br />

18<br />

t<br />

a<br />

s<br />

nl<br />

t<br />

e<br />

a<br />

Fertig!<br />

i<br />

sp<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-13<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-14<br />

Beispiel (Fortsetzung):<br />

Optimaler Code:<br />

s<br />

nl<br />

t<br />

e<br />

a<br />

58<br />

Datenkompression (7)<br />

i<br />

sp<br />

Zeichen Häufigkeit<br />

a<br />

e<br />

i<br />

s<br />

t<br />

sp<br />

nl<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-15<br />

10<br />

15<br />

12<br />

3<br />

4<br />

13<br />

1<br />

Code<br />

001<br />

01<br />

10<br />

00000<br />

0001<br />

11<br />

00001<br />

Bemerkung:<br />

Verwendet man den optimalen Code, dann benötigt man für die oben<br />

angegebenen Häufigkeiten:<br />

10*3 + 15*2 + 12*2 + 3*5 + 4*4 + 13*2 + 1*5 = 146 Bit<br />

Damit benötigt man 146/58 = 2.5 Bit/Zeichen<br />

Im Vergleich dazu benötigt man beim Bitcode mit konstanter Bitlänge 3 Bit/Zeichen.<br />

Bemerkungen<br />

Datenkompression (8)<br />

• Die Häufigkeitsanalyse kann auch einmalig (statisch) erfolgen.<br />

Beispielsweise kommt in typisch deutschen Texten <strong>der</strong> Buchstabe ‚e‘ (ohne<br />

Berücksichtigung von Groß- und Kleinschreibung) mit <strong>der</strong> Häufigkeit 0.175 vor.<br />

Nimmt man einen Code mit konstanter Bitlänge, dann benötigt man ⎣log 2 26⎦ = 5<br />

Bit/Zeichen. Mit einer Huffman-Codierung erhält man etwa 4.1 Bit/Zeichen.<br />

Verbessern lässt sich das Verfahren, indem Buchstabenpaare o<strong>der</strong> noch längere<br />

Buchstabenfolgen betrachtet werden. Bei Buchstabenpaaren erreicht man etwa 3.5<br />

Bit/Zeichen.<br />

• Das Huffman-Verfahren gehört zu <strong>der</strong> Klasse <strong>der</strong> statistikbasierten<br />

Kompressionsverfahren. Kritisch bei diesen Verfahren ist die Erstellung einer<br />

Häufigkeitstabelle, insbeson<strong>der</strong>e wenn längere Buchstabenfolgen berücksichtigt<br />

werden und die Erstellung <strong>der</strong> Tabelle dynamisch erfolgen soll.<br />

Dagegen werden bei den wörterbuchbasierten Verfahren bereits komprimierte<br />

Zeichenfolgen in einem Wörterbuch gehalten und beim wie<strong>der</strong>holten Auftreten in <strong>der</strong><br />

codierten Zeichenfolge lediglich ein Verweis auf den Tabelleneintrag abgespeichert.<br />

Diese Verfahren gehen auf Lempel und Ziv zurück. Alle Abkömmlinge dieses<br />

Verfahrens werden daher mit LZxxx bezeichnet. Beispielsweise wird eine Kombination<br />

von LZ77 und dem Huffman-Verfahren in den Kompressionsprogrammen Zip und Gzip<br />

eingesetzt.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-16


Bin Packing - Problemstellung<br />

<strong>Teil</strong> 4:<br />

<strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong><br />

• <strong>Greedy</strong>-<strong>Algorithmen</strong><br />

– <strong>Idee</strong><br />

– Job Scheduling<br />

– Datenkompression mit dem Huffman-Verfahren<br />

– Bin Packing<br />

• <strong>Teil</strong>e-und-Herrsche-Verfahren<br />

• Dynamisches Programmieren<br />

Problem:<br />

Gegeben seien n Gegenstände mit den Größen<br />

s 1 , s 2 , …, s n ,<br />

wobei 0 < s i ≤ 1.<br />

Gesucht ist eine möglichste geringe Zahl von Behältern (bins) mit Größe 1,<br />

so dass alle Gegenstände untergebracht werden können.<br />

Aproximative <strong>Algorithmen</strong><br />

Da Bin Packing NP-vollständig ist, kann nicht erwartet werden, dass es ein effizientes<br />

Verfahren zum Finden einer optimalen Lösung gibt.<br />

Wir werden effiziente <strong>Greedy</strong>-<strong>Algorithmen</strong> behandeln, die nur suboptimale Lösung liefern,<br />

d.h. die die optimale Lösung wird approximiert.<br />

Online- und Offline-<strong>Algorithmen</strong><br />

Bei Online-<strong>Algorithmen</strong> muss <strong>der</strong> Algorithmus einen Gegenstand sofort einem Behälter<br />

zuordnen, ohne die nächsten Gegenstände zu kennen.<br />

Bei den Offline-<strong>Algorithmen</strong> kennt <strong>der</strong> Algorithmus alle Gegenstände im voraus.<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-17<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-18<br />

Online Bin Packing (1)<br />

Next Fit:<br />

Verwalte die Behälter in einer festen Reihenfolge.<br />

Gehe vom zuletzt verwendeten Behälter (einschl.) aus und<br />

ordne den Gegenstand i dem nächst besten Behälter zu, in dem i noch Platz hat.<br />

Beispiel<br />

Gegenstände: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8<br />

leer<br />

0.5<br />

0.2<br />

B 1<br />

leer<br />

0.1<br />

0.7<br />

B 3<br />

leer<br />

0.8<br />

leer<br />

leer<br />

0.4<br />

0.3<br />

Eigenschaft<br />

Sei m die optimale Anzahl Behälter, um n Gegenstände einzupacken.<br />

Dann benötigt Next Fit maximal 2m Behälter.<br />

Es gibt eine Folge von Gegenstände, so dass Next Fit 2m-2 Behälter benötigt.<br />

(Beweis siehe [Weiss 1999])<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-19<br />

B 5<br />

Online Bin Packing (2)<br />

First Fit:<br />

Verwalte die Behälter in einer festen Reihenfolge.<br />

Gehe immer vom ersten Behälter aus und<br />

ordne den Gegenstand i dem erst besten Behälter zu, in dem i noch Platz hat.<br />

Beispiel<br />

Gegenstände: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8<br />

leer<br />

0.1<br />

0.5<br />

leer<br />

0.3<br />

0.4<br />

0.2<br />

B 1<br />

B 2<br />

leer<br />

0.7<br />

B 3<br />

leer<br />

0.8<br />

B 4<br />

Eigenschaft<br />

Sei m die optimale Anzahl Behälter, um n Gegenstände einzupacken.<br />

Dann benötigt First Fit maximal ⎡(17/10)m⎤ Behälter.<br />

Es gibt eine Folge von Gegenstände, so dass First Fit (17/10)(m-1) Behälter benötigt.<br />

(Beweis siehe [Weiss 1999])<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-20


Online Bin Packing (3)<br />

Best Fit<br />

Ordne einen Gegenstand i immer demjenigen Behälter mit dem kleinsten verfügbaren<br />

Platz zu, in dem i noch Platz hat. Man wählt also den am besten passenden Behälter.<br />

Beispiel<br />

Gegenstände: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8<br />

leer<br />

0.1<br />

0.5<br />

leer<br />

0.4<br />

0.2<br />

B 1<br />

B 2<br />

0.3<br />

0.7<br />

B 3<br />

leer<br />

0.8<br />

B 4<br />

Eigenschaft<br />

Best Fit hat den gleichen Worst Case wie First Fit. Jedoch ist eine kleine mittlere Behälter-<br />

Anzahl als bei First Fit zu erwarten.<br />

(Beweis siehe [Weiss 1999])<br />

Offline Bin Packing (1)<br />

First Fit Decreasing<br />

Sortiere die Gegenstände ihrer Größe nach absteigend und<br />

teile dann die Gegenstände nach <strong>der</strong> First-Fit-Strategie zu.<br />

Best Fit Decreasing<br />

Sortiere die Gegenstände ihrer Größe nach absteigend und<br />

teile dann die Gegenstände nach <strong>der</strong> Best-Fit-Strategie zu.<br />

Beispiel für First Fit Decreasing<br />

Gegenstände: 0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8<br />

0.2<br />

0.3<br />

0.4<br />

0.8<br />

0.7<br />

0.5<br />

B 1<br />

B 3<br />

B 2<br />

0.1<br />

Algorithmus liefert optimale Lösung!<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-21<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-22<br />

Offline Bin Packing (2)<br />

Eigenschaft<br />

• Sei m die optimale Anzahl Behälter, um n Gegenstände einzupacken.<br />

Dann benötigt First Fit Decreasing maximal ⎡(11/9)m + 4⎤ Behälter.<br />

Es gibt eine Folge von Gegenstände, so dass First Fit Decreasing ⎡(11/9)m⎤ Behälter<br />

benötigt.<br />

• Sind die Größen <strong>der</strong> Genestände im Interval [0,1] gleichverteilt, dann benötigt First Fit<br />

Decreasing im Schnitt O(√m) Behälter mehr als die optimale Lösung.<br />

• Die Eigenschaften für Best Fit Decreasing sind fast identisch.<br />

(Beweis siehe [Weiss 1999])<br />

O. Bittel; Juli 2007 <strong>Algorithmen</strong> und Datenstrukturen - <strong>Algorithmen</strong>-<strong>Entwurfstechniken</strong> 4-23

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!