• Keine Ergebnisse gefunden

k √ l k -Level-Buckets.Diesebestehendannaus k ArraysderL¨ange DieVerallgemeinerungvon2-Level-Bucketsf¨uhrtzu EADS7.1Buckets276/598 ľ 7.1.3 C ErnstW.Mayr .DadurchlassensichdieSpeicher-undZeitkomplexit¨atweiterverbessern,derImplementierungsaufwandsteigtjedo

N/A
N/A
Protected

Academic year: 2021

Aktie "k √ l k -Level-Buckets.Diesebestehendannaus k ArraysderL¨ange DieVerallgemeinerungvon2-Level-Bucketsf¨uhrtzu EADS7.1Buckets276/598 ľ 7.1.3 C ErnstW.Mayr .DadurchlassensichdieSpeicher-undZeitkomplexit¨atweiterverbessern,derImplementierungsaufwandsteigtjedo"

Copied!
30
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

7.1.3 k-Level-Buckets

Die Verallgemeinerung von 2-Level-Buckets f¨uhrt zu

k-Level-Buckets. Diese bestehen dann auskArrays der L¨ange l√k

Cm

. Dadurch lassen sich die Speicher- und Zeitkomplexit¨at weiter verbessern, der Implementierungsaufwand steigt jedoch stark an.

(2)

7.2 van Emde Boas-Priority Queues UniversumU,|U|=N,U ⊂N. Hier:U ={0,1, . . . , N −1}.

Wir untersuchen hier eine bessere Priority Queue f¨ur den Fall m≥logN.

EADS 7.2 van Emde Boas-Priority Queues 277/598

ľErnst W. Mayr

(3)

. . . .

0 N−1

0 1 1 0 . . . 1 0 . . . 1

· · · · Delete

. . . .

0 N−1

0 1 1 0 . . . 0 0 . . . 1

· · · · Insert Baum mit √

N Verzweigungen

(4)

Notation

Sei

k∈N, k≥2 k0 =

k 2

k00= k

2

x∈[0..2k−1] (xhat ≤kBits) x0 =

j x 2k00

k

(x0 vordere H¨alfte vonx) x00=xmod 2k00 (x00 hintere H¨alfte vonx) Sei

S={x1, . . . , xm} ⊆[0..2k−1].

EADS 7.2 van Emde Boas-Priority Queues 279/598

ľErnst W. Mayr

(5)

Definition 66

Einek-Struktur T f¨urS besteht aus:

1 der Zahl T.size=|{x1, . . . , xm}|=|S|=m;

2 einer doppelt verketteten Liste T.list, die die Elemente von S in aufsteigender Reihenfolge enth¨alt;

3 einem Bitvektor T.b[0..2k−1]mit T.b[i] = 01, falls i6∈Si∈S einem Zeiger (Pointer) Vektor T.p[0. . .2k−1]. Falls T.b[i] = 1, dann zeigt T.p[i]auf iin der Liste aus 2.

4 einer k0-Struktur T.top und einem Feld T.bottom[0. . .2k0−1]

von k00-Strukturen. Fallsm= 1, dann T.top, T.bottom und die zugeh¨origenk00-Strukturen leer, T.size= 1. T.list={x}, der Bitvektor wird nicht ben¨otigt. Fallsm >1, dann ist T.top eine k0-Struktur f¨ur die durch{x01, x02, . . . , x0m} gegebene Menge, und f¨ur jedesy∈[0. . .2k0 −1]ist T.bottom[y]eine

(6)

Beispiel 67

k= 4,S={2,3,7,10,13}, T.size= 5:

T.p ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥

0 N−1

T.b 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0

2 0010

3 0011

7 0111

10 1010

13 1101 T.list

T.top ist 2-Struktur f¨ur{0,1,2,3}

T.bottom[0] ist eine 2-Struktur f¨ur {2,3}

T.bottom[1] ist eine 2-Struktur f¨ur {3}

T.bottom[2] ist eine 2-Struktur f¨ur {2}

T.bottom[3] ist eine 2-Struktur f¨ur {1}

EADS 7.2 van Emde Boas-Priority Queues 281/598

ľErnst W. Mayr

(7)

OperationSucc(x) findetmin{y∈S; y > x} in derk-Struktur T.

if k= 1 or T.Size≤2then naive Suche

elif x≥maxin T.list then return Succ(x) gibt’s nicht else

x0:=j

x 2k00

k

; x00:=xmod 2k00;

if T.top.b[x0] = 1and x00<max{T.bottom[x0]}then return x0·2k00+Succ(x00,T.bottom[x0])

else

z0:=Succ(x0,T.top);return z0·2k00+ min{T.bottom[z0]}

fi

(8)

T.top

T.Bottom[0]

T.Bottom[1]

T.Bottomh 2k

0

−1i 2k

0

x

succ(x)

−−−−→

EADS 7.2 van Emde Boas-Priority Queues 283/598

ľErnst W. Mayr

(9)

Kosten:

T(k)≤c+T(

k 2

) =O(logk).

Lemma 68

Die Succ-Operation hat ZeitbedarfO(logk).

Beweis:

(10)

Insert Operation:

falls xbereits in Priority Queue, dann fertig bestimmeSucc(x,T), f¨ugex davor ein bestimmex0 und x00

behandle die entsprechenden Unterstrukturen rekursiv:

Insert(x0,T.top),Insert(x00,T.bottom[x0]) (nur ein nicht trivialer rekursiver Aufruf)

Zeitbedarf:naivO(log2k), Optimierung: das oberste Succ tut alles⇒ O(logk).

EADS 7.2 van Emde Boas-Priority Queues 285/598

ľErnst W. Mayr

(11)

Delete Operation:

Komplexit¨at von Delete in k-Struktur:O(logk) Kosten der Initialisierung:∼Gr¨oße der Datenstruktur

(12)

Platzbedarf f¨urk-Struktur: Sei S(k) der Platzbedarf f¨ur eine k-Struktur. Dann gilt:

S(1) =c

S(k) =c2k+S(k0) + 2k0S(k00)f¨ur k≥2 Wir ersetzen zur Vereinfachung:

S(k) =c2k+S(k

2) + 2k2S(k 2)

EADS 7.2 van Emde Boas-Priority Queues 287/598

ľErnst W. Mayr

(13)

Lemma 69

S(k) =O(2k·logk)

Beweis:

Zeige: S(k) :=c02klogk funktioniert.

F¨urk= 1 ist das klar.

(14)

Beweis (Forts.):

Rekursionsschritt:

Platz f¨ur k-Struktur≤c2k+c02k2(logk−1) + 2k2c02k2(logk−1)

=c2k+c02k2(1 + 2k2)(logk−1)

=c2k+c02k2(2k2 logk+ logk−2k2 −1)

≤c2k+c02k2(2k2 logk+ logk−2k2)

≤c02klogk , falls

c2k+c02klogk+c02k2 logk−c02k≤c02klogk

⇔c02k2 logk≤(c0−c)2k

⇔ c0−c

c0 ≥ logk

k 2

(gilt f¨urc0 groß genug!)

EADS 7.2 van Emde Boas-Priority Queues 289/598

ľErnst W. Mayr

(15)

Satz 70

SeiN = 2k, UniversumU ={0, . . . , N −1}. Wird eine Teilmenge S⊆U durch einek-Struktur dargestellt, dann ben¨otigen die Operationen Insert, Delete und FindMin jeweils ZeitO(log logN), die Initialisierung ZeitO(Nlog logN). Der Platzbedarf ist

ebenfallsO(Nlog logN).

Beweis:

s.o.

(16)

Literatur zu van Emde Boas-Priority Queue:

Kurt Mehlhorn:

Data structures and algorithms 1: Sorting and searching, pp. 290–296,

EATCS Monographs on Theoretical Computer Science, Springer Verlag: Berlin-Heidelberg-New York-Tokyo, 1984 P. van Emde Boas, R. Kaas, E. Zijlstra:

Design and implementation of an efficient priority queue Math. Systems Theory 10 (1976), pp. 99–127

EADS 7.2 van Emde Boas-Priority Queues 291/598

ľErnst W. Mayr

(17)

7.3 Radix-Heaps

Radix-Heaps stellen eine M¨oglichkeit zur effizienten Realisierung von Priority Queues dar, wobei ¨ahnliche Randbedingungen wie bei den 2-Level-Buckets vorausgesetzt werden. Dabei wird die

amortisierte Laufzeit der langsamsten Zugriffsfunktion im Vergleich zu diesen verbessert, n¨amlich vonO(√

C) aufO(logC).C bezeichne wie bei den 2-Level-Buckets die maximale Differenz zwischen zwei Schl¨usseln im Heap.

Die Grundidee besteht darin, anstelle einer Hierarchie von Buckets konstanter Gr¨oße solche mit exponentiell zunehmender Gr¨oße zu verwenden. Somit sind nur nochO(logC) Buckets zur Verwaltung der Elemente im Heap n¨otig. Wie bei 2-Level-Buckets h¨angt die Laufzeit der “teueren“ Operationen direkt von der Anzahl der Buckets ab.

(18)

0 1 2 4 8 16

1

z }| {

1

z }| {

2

z }| {

4

z }| {

8

z }| {

B =dlog(C+ 1)e+ 1Buckets Randbedingungen:

Schl¨ussel ∈N0

max. Schl¨ussel −min. Schl¨ussel stets ≤C Monotonie vonExtractMin

EADS 7.3 Radix-Heaps 293/598

ľErnst W. Mayr

(19)

Implementierung:

B :=dlog(C+ 1)e+ 1 Bucketsb[0..B−1]

(untere) Schranken f¨ur Bucketsu[0..B]

Index b no[x]des aktuellen Buckets f¨urx Invarianten:

i) u[i]≤Schl¨ussel inb[i]< u[i+ 1]

ii) u[0] = 0,u[1] =u[0] + 1,u[B] =∞;

0≤u[i+ 1]−u[i]≤2i−1; f¨uri= 1, . . . , B−1

(20)

Operationen:

1 Initialize: Leere Buckets erzeugen und die Bucketgrenzenu[i]

entsprechend der Invariante ii) setzen:

for i:= 0to B do b[i] :=∅ od u[0] := 0;u[1] = 1

for i:= 2to B−1 do u[i] :=u[i−1] + 2i−2 od

u[B] :=∞

EADS 7.3 Radix-Heaps 295/598

ľErnst W. Mayr

(21)

Operationen:

2 Insert(x): Um ein neues Element einzuf¨ugen, wird linear nach dem richtigen Bucket gesucht, beginnend beim letzten Bucket:

i:=B−1

while u[i]> k(x) do i:=i−1 od f¨uge x inb[i]ein

(22)

Operationen:

3 DecreaseKey(x, δ): Hierbei wird analog zur ProzedurInsert linear nach dem Bucket gesucht, in den das Element mit dem ver¨anderten Schl¨ussel eingef¨ugt werden muss. Der einzige Unterschied besteht darin, dass die Suche in diesem Fall beim aktuellen Bucket des Elements beginnen kann, da der

Schl¨ussel erniedrigt wird und das Element deshalb nie in einen gr¨oßeren Bucket wandern kann. Aus diesem Grund ist es jedoch notwendig, zu jedem Element x die dazugeh¨orige aktuelle Bucketnummer in b no[x]zu speichern:

i:=b no[x]

entferne x ausb[i]

k(x) :=k:=k(x)−δ;co ¨uberpr¨ufe Invarianten! oc while (u[i]> k) do i:=i−1 od

f¨uge x inb[i]ein

EADS 7.3 Radix-Heaps 297/598

ľErnst W. Mayr

(23)

Operationen:

4 ExtractMin:

Es wird ein Element aus b[0]entfernt (und zur¨uckgegeben).

Falls b[0]nun leer ist, wird nach dem ersten nicht leeren Bucket b[i],i >0, gesucht und der kleinste dort enthaltene Schl¨ussel kfestgestellt. Es wirdu[0]auf k gesetzt, und die Bucketgrenzen werden gem¨aß der Invarianten neu gesetzt.

Danach werden die Elemente in b[i]auf die davorliegenden Buckets verteilt:

(24)

Operationen:

4 ExtractMin:

entferne (und gib zur¨uck) ein beliebiges Element in b[0]

if #Elemente in Radix-Heap = 0 then return if b[0] nicht leerthen return

i:= 1

while b[i] =∅ do i:=i+ 1od k:= kleinster Schl¨ussel inb[i]

u[0] :=k u[1] :=k+ 1 for j:= 2 to ido

u[j] = min{u[j−1] + 2j−2, u[i+ 1]}

od

verteile alle Elemente aus b[i]aufb[0], b[1], . . . , b[i−1]

EADS 7.3 Radix-Heaps 298/598

ľErnst W. Mayr

(25)

Beispiel 71

0 1 2 4 8 16

0 0

7 6 6

0 1 2 4 8 16

1. ExtractMin 0 0

7 6 6

(26)

Beispiel 71

0 1 2 4 8 16

2. ExtractMin 0 7

6 6

6 7 8 8 8 16

6 6

7

neu gesetzte Intervallgrenzen

EADS 7.3 Radix-Heaps 299/598

ľErnst W. Mayr

(27)

Korrektheit von ExtractMin:

Es gilt:b[i]6=∅ ⇒ Intervallgr¨oße ≤2i−1.

Unterhalbb[i]steheni Buckets zur Verf¨ugung mit Intervallen [k, k+ 1[, [k+ 1, k+ 2[, [k+ 2, k+ 4[, . . . ,[k+ 2i−2, k+ 2i−1[

(wobei alle Intervallgrenzen jedoch h¨ochstensu[i+ 1] sein k¨onnen).

Da alle Schl¨ussel inb[i]aus dem Intervall

[k,min{k+ 2i−1−1, u[i+ 1]−1}]sind, passen sie alle in b[0], b[1], . . . , b[i−1].

(28)

Analyse der amortisierten Kosten:

Potenzial: c· X

x∈Radix-Heap

b no[x],

f¨ur ein geeignetesc >0.

Amortisierte Komplexit¨at:

i) Initialize:O(B) ii) Insert:O(B)

iii) DecreaseKey:1 +O(∆b no[x]−c·∆b no[x]) =O(1) iv) ExtractMin:

O(i+|b[i]|+P

x∈b[i]∆b no[x]−c·P

x∈b[i]∆b no[x]) =O(1)

EADS 7.3 Radix-Heaps 301/598

ľErnst W. Mayr

(29)

Satz 72

Ausgehend von einem leeren Heap betr¨agt die worst-case (reelle) Laufzeit f¨ur kInsert-, l DecreaseKey und

lExtractMin-Operationen bei Radix-Heaps

O(klogC+l).

Beweis:

s.o.

(30)

7.3.1 Literatur:

R.K. Ahuja, K. Mehlhorn, J.B. Orlin, R.E. Tarjan:

Faster Algorithms for the Shortest Path Problem J.ACM37, pp. 213–223 (1990)

B.V. Cherkassky, A.V. Goldberg, T. Radzig:

Shortest Path Algorithms: Theory and Experimental Evaluation

Math. Prog.73, pp. 129–174 (1996)

B.V. Cherkassky, A.V. Goldberg, C. Silverstein:

Buckets, Heaps, Lists and Monotone Priority Queues Proc. 8th SODA, ACM, pp. 83–92 (1997)

EADS 7.3 Radix-Heaps 303/598

ľErnst W. Mayr

Referenzen

ÄHNLICHE DOKUMENTE

Radix-Heaps stellen eine M¨ oglichkeit zur effizienten Realisierung von Priority Queues dar, wobei ¨ ahnliche Randbedingungen wie bei den 2-Level-Buckets vorausgesetzt werden.

3 DecreaseKey(x, δ): Hierbei wird analog zur Prozedur Insert linear nach dem Bucket gesucht, in den das Element mit dem ver¨ anderten Schl¨ ussel eingef¨ ugt werden muss.. Der

Andernfalls kann der Gegenspieler einen oder beide Schl¨ ussel so festlegen, dass immer noch mindestens r/2 Sortierungen m¨ oglich sind (wir verwenden hier, dass die Schl¨ ussel

[r]

Eine Zeile der Erfolgsmatrix zum Extraktor AL von Satz 2 heiÿe k -schwer, wenn sie mindestens 2 t ε/k viele

(Was passiert, wenn Sie versuchen, dies bereits für n ≥ 1 zu

Lehrstuhl Theoretische Informatik Markus Lohrey und Eric N¨ oth. Komplexit¨ atstheorie

1 Gegeben ist die Schar der definierten Funktionen und. a) Formulieren Sie für die Funktionenschar eine Aussage zur Symmetrie. b) Bestimmen Sie die Nullstellen