next up previous contents
Next: k-Level-Buckets Up: Buckets Previous: 1-Level-Backets

2-Level-Buckets

Bei einem großen Wertebereich der zu speichernden Schlüssel, das heißt beim großen C, und einer geringen Anzahl tatsächlich abgelegter Datenelemente sind 1-Level-Buckets in zweifacher Hinsicht ungünstig: 2-Level-Buckets versuchen dem mit folgender Idee abzuhelfen: Verwende statt eines Arrays der Länge C+1 zwei Arrays der Länge:

\begin{displaymath}
B = \vert\sqrt{C+1}\vert+1\end{displaymath}

Dabei enthält eines der beiden Arrays die meisten Elemente in grob vorsortierter Form, nur die Elemente mit den kleinsten Schlüsseln werden in dem zweiten Array dann endgültig sortiert vorgehalten. 2-Level-Buckets können mit folgenden Elementen aufgebaut werden:


\begin{picture}
(160,148)
\small
\put(50,110){
\framebox 
(9.8,10)[tr]{0}}
\put(...
 ...0}}
\put(105,40){\vector(0,-1){10}}
\put(125,40){\vector(0,-1){10}}\end{picture}

Dabei gilt: Dazu ist allerdings folgende Annahme zu machen:
Hat ein ExtractMin ein Element mit Schlüssel k zurückgeliefert, werden bis zum nächsten Aufruf von ExtractMin nur Elemente mit Schlüsseln $\geq k$ und $\leq k+C$ eingefügt. Dies stellt sicher, daß ein Element aus bbot nie nach btop wandert.

Lemma: Zu jedem Zeitpunkt haben alle Schlüssel Platz in der Datenstruktur.

Beweis: Am meisten Platz wird benötigt, wenn der kleinste Schlüssel ganz rechts in bbot gespeichert oder dort entfernt worden ist. Er hat dann den Wert valtop + B -1. Der größte Schlüssel, der nun vorkommen kann und also Platz finden muß, ist valtop + B -1 +C:

\begin{displaymath}
\begin{split}
& \ \ \text{Gr\uml {o}\ss{}tm\uml {o}glicher S...
 ...}\ss{}tm\uml {o}glicher erlaubter Schl\uml {u}ssel} \end{split}\end{displaymath}

$\Diamond$
Annahme: Vor dem ersten ExtractMin werden nur Elemente mit 0 $\leq$ Schlüssel $\leq$ C eingefügt.
i)
Initialize :


valtop = postop = nbot = n = 0; Initialisiere bbot, btop;

ii)
Insert(x) :


überprüfe Invarianten; $i:= \left( \lfloor \frac{\text{Key(x)}-valtop}{B} \rfloor + postop \right) $ mod B; if i== postop then Füge x in bbot[Key(x)-valpop] ein; nbot:= nbot + 1 ; n:=n+1; else Füge x in btop[i] ein; fi

iii)
ExtractMin


co suche kleinste Element in bbot oc j:=0 ; while $bbot[j] ==\emptyset$ do j:=j+1 od entferne ein (beliebiges) Element aus bbot[j] und gib es zurück; nbot := nbot -1 ; n := n -1; if n==0 then return fi if nbot==0 then while $btop[postop]==\emptyset$ do postop:=(postop+1) mod B; valtop:=valtop + B; od while $btop[postop]\neq\emptyset$ do entferne beliebiges Element x aus btop[postop]; Füge x im bbot[Key(x)-valtop] ein; nbot:=nbot+1; od fi

iv)
DecreaseKey(x,k)


enferne x aus seinem momentanen Bucket; falls nötig, aktualisiere nbot Key(x) := k; Insert(x);

Lemma: Worst-case (reelle) Laufzeit bei 2-Level Buckets sind für Insert und

DecreaseKey $\mathcal{O}(1)$, für ExtractMin

$\mathcal{O}(n+\sqrt{C})$ und $\mathcal{O}(\sqrt{C})$ (bzw. $\mathcal{O}(1)$) für Initialize .

Beweis:
- Insert : $\mathcal{O}(1)+1=\mathcal{O}(1)$
- DecreaseKey : $\mathcal{O}(1)+(\leq0)= \mathcal{O}(1)$
- ExtractMin $\mathcal{O}(\sqrt{C}+\sqrt{C}+$ # Elemente $\begin{array}
{c}btop\\ \downarrow\\ bbot\end{array}$). $\Diamond$

Potential: Anzahl von Elementen im Buckets im btop.

\fbox {\parbox[c]{12.45cm}{\textbf{Satz:}
Amortisierte Kosten f\uml {u}r 2-Level...
 ...ey}}
 und
$\mathcal{O}(\sqrt{C})$\space bei 
 \textsl{\textsf{ExtractMin}}
.
}}


Beweis:
- Insert : s.o.
- DecreaseKey : s.o.
- ExtractMin : $\mathcal{O}(\sqrt{C}+$ # Elemente $\begin{array}
{c}btop\\ \downarrow\\ bbot \end{array})-$ # Elemente $\begin{array}
{c}btop\\ \downarrow\\ bbot \end{array} =
\mathcal{O}(\sqrt{C})$ $\Diamond$


next up previous contents
Next: k-Level-Buckets Up: Buckets Previous: 1-Level-Backets
Abbas-Bardia Kabiri-Jarghouyeh
3/3/1999