parasitär

Werbung
Sanders / van Stee: Algorithmentechnik October 30, 2007
2 Folgen als Felder und Listen
1
Sanders / van Stee: Algorithmentechnik October 30, 2007
Beschränkte Felder (Bounded Arrays)
Eingebaute Datenstruktur.
Größe muss von Anfang an bekannt sein
2
Sanders / van Stee: Algorithmentechnik October 30, 2007
Unbeschränke Felder
z.B. std::vector
pushBack: Element anhängen
popBack: Letztes Element löschen
Idee: verdopple wenn der Platz ausgeht.
Hhalbiere wenn Platz verschwendet wird
Wenn man das richtig macht, brauchen
n pushBack/popBack Operationen Zeit O(n)
Algorithmese: pushBack/popBack haben konstante amortisierte
Komplexität
3
Sanders / van Stee: Algorithmentechnik October 30, 2007
Class UArray of Element
w =1 : N
n=0 : N
invariant n ≤ w < α n or n = 0 and w ≤ 2
b : Array [0..w − 1] of Element
w
n
···
// b → e0 · · · en−1
Operator [i : N] : Element
assert 0 ≤ i < n
return b[i]
Function size : N return n
4
// allocated size
// current size.
Sanders / van Stee: Algorithmentechnik October 30, 2007
Procedure pushBack(e : Element)
if n = w then
reallocate(2n)
b[n]:= e
n++
Procedure reallocate(w′ : N)
w:= w′
5
// Example for n = w = 4:
// b → 0 1 2 3
// b → 0 1 2 3
// b → 0 1 2 3 e
// b → 0 1 2 3 e
// Example for w = 4, w′ = 8:
// b → 0 1 2 3
b′ := allocate Array [0..w′ − 1] of Element// b′ →
(b′ [0], . . . , b′ [n − 1]):= (b[0], . . . , b[n − 1])// b′ → 0 1 2 3
dispose b
b:= b′
// b → 0 1 2 3
// pointer assignment b → 0 1 2 3
Sanders / van Stee: Algorithmentechnik October 30, 2007
Kürzen
Procedure popBack
// Example for n = 5, w = 16:
assert n > 0 // b → 0 1 2 3 4
n−−
// b → 0 1 2 3 4
if 4n ≤ w ∧ n > 0 then
// reduce waste of space
// b → 0 1 2 3
reallocate(2n)
6
Sanders / van Stee: Algorithmentechnik October 30, 2007
Amortisierte Komplexität unbeschr. Felder
Sei u ein anfangs leeres, unbeschränktes Feld.
Jede Operationenfolge σ
= hσ1 , . . . , σm i
von pushBack oder popBack Operationen auf u
wird in Zeit O(m) ausgeführt.
Sprechweise:
pushBack und popBack haben amortisiert konstante Ausführungszeit
—

#Ops

z}|{

O m / |{z}
m  = O(1) .
Gesamtzeit
7
Sanders / van Stee: Algorithmentechnik October 30, 2007
Beweis: Konto-Methode (oder Versicherung)
Operation
Kosten
pushBack
◦◦
(2 Token)
einzahlen
popBack
◦
(1 Token)
einzahlen
n×◦
(n Token)
abheben
reallocate(2n)
Typ
Zu zeigen: keine Überziehungen
Erster Aufruf von reallocate: kein Problem
8
Sanders / van Stee: Algorithmentechnik October 30, 2007
Beweis: Konto-Methode (oder Versicherung)
Operation
Kosten
pushBack
◦◦
(2 Token)
einzahlen
popBack
◦
(1 Token)
einzahlen
n×◦
(n Token)
abheben
reallocate(2n)
Typ
Weitere Aufrufe von reallocate:
≥n×pushBack
rauf: reallocate(2n) |
{z
≥n×◦◦
} reallocate(4n)
≥n/2×popBack
runter: reallocate(2n) |
{z
≥n/2×◦
} reallocate(n)
9
Sanders / van Stee: Algorithmentechnik October 30, 2007
Doppelt verkettete Listen
10
Sanders / van Stee: Algorithmentechnik October 30, 2007
11
Class Item of Element
// one link in a doubly linked list
e : Element
next : Handle
//
prev : Handle
invariant next→prev=prev→next=this
Trick: dummy header
⊥
-
-
···
···
-
Sanders / van Stee: Algorithmentechnik October 30, 2007
Procedure splice(a,b,t : Handle)
assert b is not before a ∧ t 6∈ ha, . . . , bi
′
a
a
// Cut out ha, . . . , bi
a′ := a→prev
b′ := b→next
a′ →next := b′
//
b′ →prev := a′
// Y
t
// insert ha, . . . , bi after t
t ′ := t→next
// 12
b′
b
- ···
··· -
- ···
··· R
-
-
a
t′
b
R
-
Y
- ···
··· R
-
-
-
b→next := t’
a→prev := t
//
// Y
- ···
··· t →next := a
t ′ →prev := b
//
// - ···
··· Sanders / van Stee: Algorithmentechnik October 30, 2007
Einfach verkettete Listen
...
Vergleich mit doppelt verketteten Listen
Weniger Speicherplatz
Platz ist oft auch Zeit
Eingeschränkter, z.B. kein delete
Merkwürdige Benutzerschnittstelle, z.B. deleteAfter
13
Sanders / van Stee: Algorithmentechnik October 30, 2007
14
Speicherverwaltung für Listen
kann leicht 90 % der Zeit kosten!
Lieber Elemente zwischen (Free)lists herschieben als echte
mallocs
Alloziere viele Items gleichzeitig
Am Ende alles freigeben?
Speichere „parasitär“. z.B. Graphen:
Knotenarray. Jeder Knoten speichert ein ListItem
Partition der Knoten kann als verkettete Listen gespeichert
werden
MST, shortest Path
Challenge: garbage collection, viele Datentypen
auch ein Software Engineering Problem
hier nicht
Sanders / van Stee: Algorithmentechnik October 30, 2007
Class BoundedFIFO(n : N) of Element
b : Array [0..n] of Element
h=0 : N
t=0 : N
Function isEmpty : {0, 1}; return h = t
15
n0
h
b
Function first : Element; assert ¬isEmpty; return b[h]
Function size : N; return (t − h + n + 1) mod (n + 1)
Procedure pushBack(x : Element)
assert size< n
b[t] := x
t := (t + 1) mod (n + 1)
Procedure popFront assert ¬isEmpty; h := (h + 1) mod (n + 1)
t
Sanders / van Stee: Algorithmentechnik October 30, 2007
Operation
List
SList
UArray
CArray
[·]
|·|
n
1∗
1
1
1
1
1
1
1
1
1
1
n
n
1∗
1
1
1∗
1∗
1
1
n
1
1
1
n
1
1
1
1
n
n
1∗
n
1∗
n
n
n
n∗
1
1
1
1
n
n
1∗
1∗
1∗
1∗
n
n
n∗
first
last
insert
remove
pushBack
pushFront
popBack
popFront
concat
splice
findNext,. . .
16
explanation ‘∗ ’
not with inter-list splice
insertAfter only
removeAfter only
amortized
amortized
amortized
amortized
cache-efficient
Sanders / van Stee: Algorithmentechnik October 30, 2007
17
Externe Stapel
Datei mit Blöcken
2 interne Puffer
push: Falls Platz, in Puffer.
Sonst schreibe Puffer zwei in die Datei
(push auf Blockebene)
pop: Falls vorhanden, pop aus Puffer.
Sonst lese Puffer eins aus der Datei
(pop auf Blockebene)
Analyse: amortisiert O(1/B) I/Os pro Operation
Aufgabe 1: Beweis.
Aufgabe 2: effiziente Implementierung ohne überflüssiges Kopieren
Herunterladen