Kap. 1: Priority-Queues - Chair 11: ALGORITHM ENGINEERING

Werbung
Kap. 1: Priority-Queues
1.2 Externe Array-Heaps
Professor Dr. Petra Mutzel
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
4.-6. VO A&D WS 08/09 23./28./30. Oktober 2008
Petra Mutzel
Alg. & Dat.
WS 08/09
1
Literatur für diese VO
Andreas Crauser: LEDA-SM: External Memory Algorithms
and Data Structures in Theory and Praxis. Dissertation,
Max-Planck-Institut für Informatik, Saarbrücken, 2001.
Kapitel 4: Priority Queues;
http://www.mpi-sb.mpg.de/~crauser/degrees.html
•  hierzu gibt es auch ein ausgearbeitetes Skriptum auf
unserer VO Web-Seite
•  Schönes Buch zum Thema (für Interessierte):
•  U. Meyer, P. Sanders und J. Sibeyn (Eds.), Algorithms for
Memory Hierarchies, Advances Lectures, Lecture Notes in
Computer Science 2625, Springer 2003
Petra Mutzel
Alg. & Dat.
WS 08/09
2
Überblick
1.2.1 Einführung
–  Motivation
–  Das Externspeichermodell
–  Exkurs: Grundlegende externe Datenstrukturen
1.2.2 Externe Array Heaps (Prioritätswarteschlange)
-  Modell, Operationen und Realisierung
-  Analyse
Petra Mutzel
Alg. & Dat.
WS 08/09
3
1.2.1 Einführung
Durchwandern eines Arrays:
for (i=0; i<N; i++) D[i]=i
C=Permute(D)
Lineares Durchlaufen:
for (i=0; i<N; i++) A[D[i]]=A[D[i]]+1
Zufälliges Durchlaufen:
for (i=0; i<N; i++) A[C[i]]=A[C[i]]+1
Petra Mutzel
Alg. & Dat.
WS 08/09
4
Durchwandern eines Arrays
sec
k
Größe 2k
223=8.388.608
Rechner: CPU 2.4 GHz mit Cache 512 KB: für N=225: 0,39 Sek. vs. 7,89 Sek.
Hierarchisches Speichermodell moderner Computer
Externspeicher
CPU
Interner
Speicher
(Main
Memory)
Cache
Faktor 100 schneller
als
Faktor 1000-106
schneller als
Secondary Memory
Petra Mutzel
Alg. & Dat.
WS 08/09
7
Probleme klassischer Algorithmen
•  Ein Zugriff im Hauptspeicher spricht jeweils eine
Speicherzelle an und liefert jeweils eine Einheit
zurück
•  Ein Zugriff im Externspeicher (ein I/O) liefert jeweils
einen ganzen Block von Daten zurück
•  Meist keine Lokalität bei Speicherzugriffen, und
deswegen mehr Speicherzugriffe als nötig
Petra Mutzel
Alg. & Dat.
WS 08/09
8
Problem ist aktueller denn je,
denn
•  Geschwindigkeit der Prozessoren verbessert sich
zwischen 30%-50% im Jahr
•  Geschwindigkeit des Speichers nur um 7%-10% pro
Jahr
•  „One of the few resources increasing faster than the
speed of computer hardware is the amount of data
to be processed.“
Petra Mutzel
Alg. & Dat.
WS 08/09
9
Donald E. Knuth: The Art of Computer Programming 1967
(Neuauflage 1998):
•  When this book was first written, magnetic tapes were abundant
and disk drives were expensive. But disks became enormously
better during the 1980s,... . Therefore the once-crucial topic of
patterns for tape merging has become of limited relevance to
current needs. Yet many of the patterns are quite beautiful, and
the associated algorithms reflect some of the best research
done in computer science during its early years;
•  The techniques are just too nice to be discarded abruptly onto
the rubbish heap of history. ...
•  Therefore merging patterns are discussed carefully and
completely below, in what may be their last grand appearance
before they accept a final curtain call.
Petra Mutzel
Alg. & Dat.
WS 08/09
10
Pavel Curtis in Knuth:The Art of Computer Programming 1967
(Neuauflage 1998):
•  For all we know now, these techniques may well
become crucial once again.
Petra Mutzel
Alg. & Dat.
WS 08/09
11
Das
Externspeichermodell
Modell von Aggarwal,Vitter M = Anzahl der
Elemente im
und Shriver 1994
Hauptspeicher
CPU
Rechenoperationen können
nur mit Daten im Hauptspeicher getätigt werden
Annahme: B<M/2
interner
Speicher
(Main
Memory)
Externspeicher
(External
Memory, EM)
1 I/O
B = Anzahl der Elemente,
die in einen Block passen
Analyse von Externen Algorithmen
•  Anzahl der ausgeführten I/O-Operationen
•  Anzahl der ausgeführten CPU-Operationen
im RAM-Modell
•  Anzahl der belegten Blöcke auf dem
Sekundärspeicher
Petra Mutzel
Alg. & Dat.
WS 08/09
13
Ziele beim Entwurf
Externer Algorithmen
•  Interne Effizienz:
–  Anzahl der RAM-Operationen vergleichbar zu den
besten internen Algorithmen
•  Örtliche Lokalität:
–  Ein r/w Block sollte möglichst viele nützliche Daten
enthalten
•  Zeitliche Lokalität:
–  Daten, die im internen Speicher sind, sollten
möglichst verarbeitet werden, bevor sie wieder
herausgeschrieben werden.
Externe Datenstrukturen: Stacks
•  Ein Stack S repräsentiert eine dynamische Menge
von Elementen (maximal N)
•  Operationen:
–  Insert(x): Einfügen eines neuen Elements in S
–  Delete: Ausgabe und Entfernung des letzten
eingefügten Elements aus S
Interne Algorithmen für Stack der Größe N:
•  Array der Länge N und zwei Zeiger
Im Worst Case: 1 I/O per Insert und Delete Operation
Petra Mutzel
Alg. & Dat.
WS 08/09
15
Externe Stacks
•  Buffer für externe Stacks:
–  Array im internen Speicher der Länge 2B
–  enthält zu jedem Zeitpunkt die letzten k eingefügten
Elemente, wobei k ≤ 2B
•  Insert(x):
–  Meistens 0 I/Os benötigt, außer: wenn Buffer voll ist
–  Dann: die B ältesten Elemente werden in EM
ausgelagert.
•  Delete:
–  Meistens 0 I/Os benötigt, außer: wenn Buffer leer
–  Dann: 1 I/O holt die nächsten B Elemente aus dem
EM (diejenigen, die als letztes ausgelagert wurden)
Externe Stacks
•  Analyse der Operationen:
–  Insert(x): 1/B I/Os amortisiert
–  Delete: 1/B I/Os amortisiert
•  Dies ist bestmöglich!
•  Denn: mit einer I/O können nicht mehr als B Elemente
gleichzeitig gespeichert oder gelesen werden
Petra Mutzel
Alg. & Dat.
WS 08/09
17
Externe Datenstrukturen: Queues
•  Operationen:
–  Insert(x): Einfügen eines neuen Elements in S
–  Delete: Ausgabe und Entfernung des ältesten Elem. aus S
•  Zwei Buffer: R und W Buffer:
–  Zwei Arrays im internen Speicher der Länge jeweils B
•  Insert(x):
Analyse: 1/B I/Os
–  zu W Buffer, außer: wenn voll
–  Dann: schreibe alle B Elemente in EM
•  Delete:
Analyse: 1/B I/Os
–  aus R Buffer, außer: wenn Buffer leer
–  Dann: 1 I/O holt die nächsten B Elemente aus dem EM
(wenn keine dort, dann aus W Buffer (Buchführung!))
Externe Datenstrukturen:
Lineare Listen
s. Übung
Untere Schranken im EM-Modell
•  Einlesen einer Menge von N Elementen benötigt
mindestens Θ(N/B) I/O‘s
•  Sortieren einer Menge von N Elementen benötigt
mindestens
Θ(N/B log1+M/B (1+N/B))
•  Suche in dynamischen Daten von N Elementen
benötigt mindestens Zeit
Θ(log N / log B) I/O-Operationen
Petra Mutzel
Alg. & Dat.
WS 08/09
20
1.2.2 Externspeicherdatenstruktur
für Prioritätswarteschlangen
•  Dynamische Datenstruktur für Elemente:
Schlüssel + Information
•  Operationen:
–  Get_Min: Ausgabe der Elemente mit kleinstem
Schlüssel
–  Del_Min: Ausgabe und Entfernung des
kleinsten Elements
–  Insert: Einfügen eines neuen Elements
Welche Datenstrukturen kennen Sie dafür?
Externe Array-Heaps
•  Im internen Arbeitsspeicher: Heap
•  Im externen Speicher: Menge von
sortierten Feldern unterschiedlicher Länge
Petra Mutzel
Alg. & Dat.
WS 08/09
22
Externe Array-Heaps
l1=cM
l2=(cM)2/B
=cM(µ +1)
Lemma 1: li+1=li (µ+1)
L Schichten Li
L3
li=(cM)i/Bi-1
l2
c=1/7
L<=4
L2
l1
L1
µ=(cM/B)-1
µ
µ
jeder Slot
enthält
sortierte Folge
oder ist leer
Die Anzahl der Plätze in einem Slot von Li+1
Externe
Array-Heaps
entspricht der Anzahl aller Plätze in Li plus li
l1=cM
l2=(cM)2/B
=cM(µ +1)
Lemma 1: li+1=li (µ+1)
L Schichten Li
L3
li=(cM)i/Bi-1
l2
c=1/7
L<=4
L2
l1
L1
µ=(cM/B)-1
µ
µ
jeder Slot
enthält
sortierte Folge
oder ist leer
Operation Insert
•  Fügt neue Elemente immer in den internen Heap H ein
•  Falls kein Platz mehr in H ist, dann werden vorher l1=cM
dieser Elemente in den Sekundärspeicher bewegt:
–  Falls freier Slot in L1 existiert, dann werden diese
Elemente in sortierter Folge dorthin bewegt
–  Sonst: Alle Elemente in L1 werden mit den neuen
Elementen aus H zu einer sortierten Liste gemischt,
die dann in einen freien Slot von L2 geschrieben
werden.
–  Falls L2 auch kein freier Slot, wiederhole L3,...bis frei
Petra Mutzel
Alg. & Dat.
WS 08/09
25
Operation Del_Min
•  Invariante: Das kleinste Element befindet sich immer in H
•  Dazu: Heap wird in zwei Heaps geteilt: H1 und H2:
–  H1 enthält immer die neu eingefügten Elemente,
maximal 2cM
–  H2 speichert maximal die kleinsten B Elemente in jedem
belegten Slot j in jeder Schicht Li
•  Lemma 2: Es befinden sich maximal cM(2+L) Elemente im
Hauptspeicher
2cM+BµL < 2cM+B(cM/B)L
•  Zusätzlich wird (µ+1)B=cM gebraucht, um die µ Slots plus
eine Overflow Folge zu mischen
Es muss gelten: M≥cM(3+L);
Operation
Del_Min
Daraus folgt: bei c=1/7 => L≤4
•  Invariante: Das kleinste Element befindet sich immer in H
•  Dazu: Heap wird in zwei Heaps geteilt: H1 und H2:
–  H1 enthält immer die neu eingefügten Elemente,
maximal 2cM
–  H2 speichert maximal die kleinsten B Elemente in
jedem belegten Slot j in jeder Schicht Li
•  Lemma 2: Es befinden sich maximal cM(2+L) Elemente
im Hauptspeicher
•  Zusätzlich wird (µ+1)B=cM gebraucht, um die µ Slots plus
eine Overflow Folge zu mischen
Operationen (1)
•  Merge-Level (i,S,S´):
–  produziert eine sortierte Folge S´ durch das Mischen
der sortierten Folge der µ Slots in Li (inkl. der ersten
Blocks in H2) und der sortierten Sequenz S.
–  Analyse: O(li+1/B) I/O´s
•  Store(i;S):
–  Annahme: Li enthält einen leeren Slot und die Folge S
besitzt Länge im Bereich [li/2 , li]
–  S wird in einen leeren Slot von Li gespeichert und
seine kleinsten B Elemente werden nach H bewegt.
–  Analyse: O(li/B) I/O´s
Petra Mutzel
Alg. & Dat.
WS 08/09
28
Operationen (2)
•  Load (i,j):
–  Holt die nächsten B kleinsten Elemente vom j-ten Slot
aus Li in den internen Heap H2.
–  Analyse: O(1) I/O´s
•  Compact(i):
–  Annahme: es existieren mind. 2 Slots in Li, mit
Gesamtzahl an Elementen (inkl. H2), höchstens li.
–  Diese beiden Slots werden gemischt, und in einen freien
Slot von Li eingetragen. Damit wird ein Slot in Li frei.
–  Analyse: O(li/B) I/O´s
Petra Mutzel
Alg. & Dat.
WS 08/09
29
Operation Insert
•  Fügt neue Elemente immer in den internen Heap H ein
•  Falls kein Platz mehr in H1 ist, dann werden die größten
l1=cM Elemente nach L1 bewegt (und die kleinsten B
davon nach H2):
–  Falls freier Slot in L1 existiert, dann wird Store(1,S)
aufgerufen
–  Sonst: Alle Slots in L1 (bis auf einen) enthalten
mindestens l1/2 Elemente: Merge-Level(1,S,S´)
–  Falls freier Slot in L2 existiert, dann: Store(2,S´)
–  Sonst: wiederhole L3,...bis frei.
Petra Mutzel
Alg. & Dat.
WS 08/09
30
Operation Del_Min
•  Das kleinste Element wird vom internen Heap entfernt
(H1 oder H2).
•  Falls in H2: dann korrespondiert dieses zu Slot j einer
Schicht Li.
•  Falls es das letzte Element in H2 ist, das zu j gehört,
dann werden die nächsten B Elemente von Slot j nach
H2 mittels Load(i,j) bewegt.
•  Nach jedem Load(i,j) wird Compact(i) bei Bedarf
aufgerufen
Petra Mutzel
Alg. & Dat.
WS 08/09
31
Korrektheit
Lemma 3: Das kleinste Element ist immer in H
(H1 oder H2).
Lemma 4: Bei der Ausführung von Store(i,S) ist immer
garantiert, dass S zwischen li/2 und li Elementen enthält.
Beweis: Betrachte Schicht i-1: Sei aj die Anzahl der Elemente
in Slot j. Wir wissen: aj+ak>li-1 für alle Paare j und k
→ Summe über alle Paare:
Hinzu kommt das vorige S mit mindestens li-1/2 Elementen.
Dies sind also zusammen mind. (µ+1) li-1 /2 = li/2 Elemente.
I/O Schranken Annahme: cM>3B
Lemma 5: Nach N Operationen existieren höchstens
L ≤ logcM/B(N/B) Schichten.
Beweis: Im Worst Case sind alle N Operationen Inserts. Dann
wird bei jedem Überlauf die maximal mögliche Anzahl von
Elementen in die nächste Schicht bewegt. Die Anzahl der
Elemente in j Slot-Schichten ist also:
Elemente in H1
Speicherplatz im Hauptspeicher
•  Beobachtung 1: Im Hauptspeicher wird Platz für bis zu
cM(3+L)≤ cM(3+logcM/B(N/B)) Elemente benötigt.
•  Daraus läßt sich nun eine Maximalgrenze für die Anzahl N
an Operationen berechnen, die garantiert, dass alles Platz
hat (M≥cM(3+logcM/B(N/B)) Auflösen nach N und
Abschätzungen (o.Bw.)).
•  Beobachtung 2: Bei einer Folge von bis zu
N≤B(cM/B)(1/c)-3 Operationen haben alle Elemente
ausreichend Platz.
•  Beispielrechnung:
•  Für M=109, B=106 und c=1/7, wäre N≤ 0,416 10 15 und L≤4
I/O Schranken
Annahme: cM>3B
Lemma 6: Store(i,S) benötigt höchstens 3li/B I/O´s. MergeLevel(i,S,S´) und Compact(i+1) benötigen höchstens 3li+1/
B I/O´s.
Beweis:
Store(i,S): r+w: 2⌈li /B⌉≤ 2(li /B)+2≤ 3li/B (wg. li/B>3 da
li≥l1=cM>3B)
Merge-Level(i,S,S´): r+w: 2(µ⌈(li/B)⌉+|S|/B) ≤
≤ 2(⌈(|S|+µli)/B⌉+(µ+1)) ≤ 2(li+1/B)+2cM/B ≤ 3li+1/B (da li+1 ≥ 2cM)
Compact(i): ⌈aj /B⌉ + ⌈ak /B⌉ + ⌈li /B⌉ ≤ (aj+ak)/B+li/B+3 ≤
2li/B+3 ≤
3li/B, wg. li/B>3
Petra Mutzel
Alg. & Dat.
WS 08/09
36
I/O Schranken
Theorem:
Annahme: cM>3B und 0<c<1/3 und N≤B(cM/B)(1/c)-3
In einer Folge von N Operationen vom Typ Insert und
Del_Min benötigt
–  Insert amortisiert 18/B (log cM/B(N/B)) I/O´s und
–  Del_Min 7/B amortisierte I/O´s.
Die Schranke für N kommt aus Platzbeschränkungen her
(s. Beobachtung 2)
Petra Mutzel
Alg. & Dat.
WS 08/09
37
Beweis: Amortisierte Analyse (1)
•  Insert: 18/B(log cM/B(N/B)) ≥ 18L/B amortisierte I/O´s
•  Del_Min 7/B amortisierte I/O´s.
•  Bankkonto-Methode:
–  Jedes Element erhält beim Einfügen ein Guthaben von
18L/B
–  Wir zeigen: es werden höchstens 18/B benötigt um von
einer zur anderen Schicht zu wandern
–  Beim Entfernen werden 7/B Einheiten im Heap
belassen
Beweis: Amortisierte Analyse (2)
•  Insert mit Overflow kostet 6li+1/B, denn:
–  Merge_level(i,S;S´): kostet 3li+1/B und Store(i+1,S´): 3li+1/B
•  Wie können diese Kosten bezahlt werden?
•  Fall 1: Overflow zur Schicht L1:
•  Jedes Element, das nun bewegt wird, gibt von seinem
Bankkonto jeweils 12/B Einheiten dafür ab; da der Slot in
Schicht L1 mindestens zur Hälfte gefüllt ist, kommen so mind.
(12/B) (l1/2)=6l1 / B Einheiten zusammen.
•  (Interpretation: stellen Sie sich vor, jedes Element erhält beim Einfügen
18L/B Einheiten; nun möchten die Elemente in die Schicht L1 wechseln,
das kostet aber insgesamt 6l1/B. Diese können dadurch aufgebracht
werden, indem alle bewegten Elemente jeweils 12/B Einheiten von ihrem
momentanen Bankkonto abgeben.)
Beweis: Amortisierte Analyse (2)
•  Insert mit Overflow kostet 6li+1/B, denn:
–  Merge_level(i,S;S´): kostet 3li+1/B und Store(i+1,S´): 3li+1/B
•  Wie können diese Kosten bezahlt werden?
•  Fall 2: Overflow von Schicht Li nach Li+1:
•  Jedes Element hatte anfangs 18L/B Einheiten zur Verfügung;
das sind für Schicht i genau 18/B Einheiten, die das Element
verbrauchen kann. Da fast alle Slots von Schicht Li mind. zur
Hälfte gefüllt sind, können je 12/B Einheiten von den
Bankkonten der bewegten Elemente genommen werden.
•  Beob.: Damit hat jedes Element nach der Merge_level() und
Store()-Operation noch 6/B Einheiten pro Schicht übrig.
Beweis: Amortisierte Analyse (2)
•  Invariante: Zu jedem nicht-leeren Slot j der Schicht Li gehört
ein Deposit Di,j von 6x/B, wobei x die Anzahl der freien Felder
in j entspricht.
•  Das heisst: Um die Invariante zu erfüllen, muss jedes durch
den Store() Aufruf nach Schicht Li+1 bewegte Element 6/B
Einheiten an Di+1,j abgeben
•  Insgesamt: kostet also eine Merge_Level() und eine Store()
Operation pro Overflow (Schicht) 18/B Einheiten per Element.
Petra Mutzel
Alg. & Dat.
WS 08/09
41
ENDE
Beweis: Amortisierte Analyse (3)
•  Beim Entfernen werden 7/B=(1+6)/B Einh. im Heap belassen
•  Eine Load()-Operation wird durch das Nehmen von B(1/B)=1
Einheiten aus dem Heap bezahlt.
•  Diese Einheiten kamen jeweils durch die letzten (aus Slot j) B
entfernten Elemente zustande.
•  Die restlichen B(6/B)=6 Einheiten dieser entfernten Elemente
werden dem Di,j zugeordnet, auf dem Load() operiert hat
(denn danach sind es dort B Einheiten weniger, es werden
also 6*B/B=6 Einheiten mehr in Di,j benötigt).
•  Insgesamt: sind das 7/B Einheiten für die Load() Operation
Beweis: Amortisierte Analyse (4)
•  Es bleibt: die Bezahlung für Compact(i): 3li/B
•  Dies wird durch die Deposits Di,j an den slots j1 und j2, die
kompaktiert werden, bezahlt:
•  Die Gesamtanzahl der leeren Plätze in den slots j1 und j2 ist
mindestens li.
•  Dafür gibt es in den Deposits Di,j1 und Di,j2 zusammen
mindestens 6li/B Einheiten.
•  Nach dem Mischen gibt es in Di,j1 höchstens li/2 freie Slots,
d.h. für das neue Di,j1 werden nur 3li/B Einheiten benötigt
•  Die anderen 3li/B Einheiten werden für Compact(i)
ausgegeben.
Petra Mutzel
Alg. & Dat.
WS 08/09
43
Speicherplatzbedarf
Lemma 7: Jede Schicht enthält höchstens einen Slot, der
nicht-leer und aus weniger als li/2 Elementen besitzt.
Petra Mutzel
Alg. & Dat.
WS 08/09
44
Speicherplatzbedarf
Theorem 2: Die Gesamtanzahl der benützten externen
Blöcke ist höchstens 2(X/B)+L, wobei X die Anzahl der
Elemente in unserer Datenstruktur ist.
Der Gesamtspeicherplatz im MM beträgt cM(3+L).
Beweis:
•  In jedem Slot jeder Schicht existiert höchstens ein nur
teilweise gefüllter Speicherplatz, nämlich der oberste.
•  Pro Schicht existiert höchstens ein nicht-leerer Slot mit
weniger als li/2 Elementen. Von diesen gibt es zusammen
höchstens L.
•  Für die anderen Slots gilt: für jeden halb gefüllten gibt es
mindestens auch einen ganz gefüllten Block: ≤
2X/B
Petra Mutzel
Alg. & Dat.
WS 08/09
45
Experimentelles Setup
8 verschiedene PQ Implementierungen:
–  extern: Externe Array-Heaps, externe Radix Heaps
(Achtung: nur für monotone DEL-Folgen und integers
einsetzbar), Buffer Trees, B-trees
–  intern: Fibonacci Heaps, k-ary Heaps, Pairing Heaps,
interne Radix Heaps
SPARC ULTRA 1/143:
–  MM: 256 Mbytes (nur M=16 Mbytes genutzt)
–  lokale 9 GBytes fast-wide SCSI disk
–  B=32 kbytes
Petra Mutzel
Alg. & Dat.
WS 08/09
46
Experimentelles Setup
Experimentreihen:
1.  Insert-All-Delete-All: zunächst N Insert, dann N
Del_Min
3.  Intermixed: zunächst N=20 Mio Insert, dann
gemischte Insert mit prob=1/3 und Del_Min
Operationen mit prob=2/3
4.  Dijkstra´s shortest-path: simuliere Dijkstra in MM für
große Graphen und teste die hierbei produzierte
Sequenz von Insert und Del_Mins.
Petra Mutzel
Alg. & Dat.
WS 08/09
47
Laufzeit in Sek.
Laufzeit Insert-All-Delete-All: Insert
*106
Petra Mutzel
Alg. & Dat.
WS 08/09
48
Laufzeit in Sek.
Laufzeit Insert-All-Delete-All: Del_Min
*106
Petra Mutzel
Alg. & Dat.
WS 08/09
49
Total I/Os
I/Os Insert-All-Delete-All: Total I/Os
*106
Petra Mutzel
Alg. & Dat.
WS 08/09
50
I/Os Insert-All-Delete-All: Random I/Os
Zufällige I/Os
d.h. nichtsequentielle
I/Os
*106
Petra Mutzel
Alg. & Dat.
WS 08/09
51
Laufzeit in Sek.
Laufzeit Intermixed
*106
„mixed“ Operationen
Petra Mutzel
Alg. & Dat.
WS 08/09
52
Laufzeit Dijkstra
Array heaps ca. 2 Mal langsamer
als Radix Heaps, ca. 4 Mal schneller
als Buffer Trees
3|V| Kanten,
Kosten ∈ [1,1000]
ENDE
Anzahl der Knoten*106
Petra Mutzel
Alg. & Dat.
WS 08/09
53
Herunterladen