7.2 van Emde Boas-Priority Queues Universum U , |U | = N, U ⊂
N. Hier: U = {0, 1, . . . , N − 1}.
Wir untersuchen hier eine bessere Priority Queue f¨ ur den Fall
n ≥ log N .
. . . . . .
0 N −1
0 1 1 0 . . . 1 0 . . . 1
- - - - q
q A
A U
q
?
q
?
· · · ·
O
Delete
. . . . . .
0 N −1
0 1 1 0 . . . 0 0 . . . 1
- - -
q
q A
A U
q
· · · ·
? HH
@@ @@
Insert Baum mit √
N Verzweigungen
Notation
Sei
k ∈
N, k ≥ 2 k
0=
k 2
k
00= k
2
x ∈ [0..2
k− 1] (x hat ≤ k Bits) x
0=
j
x 2
k00k
(x
0vordere H¨ alfte von x) x
00= x mod 2
k00(x
00hintere H¨ alfte von x) Sei
S = {x
1, . . . , x
m} ⊆ [0..2
k− 1] .
Definition 65
Eine k-Struktur T f¨ ur S besteht aus:
1
der Zahl T.size = |{x
1, . . . , x
m}| = |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..2
k− 1] mit T.b[i] =
01, falls
i6∈Si∈Seinem Zeiger (Pointer) Vektor T.p[0 . . . 2
k− 1]. Falls T.b[i] = 1, dann zeigt T.p[i] auf i in der Liste aus 2.
4
einer k
0-Struktur T.top und einem Feld T.bottom[0 . . . 2
k0− 1]
von k
00-Strukturen. Falls m = 1, dann T.top, T.bottom und
die zugeh¨ origen k
00-Strukturen leer, T.size = 1. T.list = {x},
der Bitvektor wird nicht ben¨ otigt. Falls m > 1, dann ist T.top
eine k
0-Struktur f¨ ur die durch {x
01, x
02, . . . , x
0m} gegebene
Menge, und f¨ ur jedes y ∈ [0 . . . 2
k0− 1] ist T.bottom[y] eine
k
00-Struktur f¨ ur die Menge {x
00i; 1 ≤ i ≤ m; y = x
0i}
Beispiel 66
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
- - - -q
q A
A U
q
? q
? q
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}
Operation Succ(x) findet min{y ∈ S; y > x} in der k-Struktur T.
if k = 1 or T.Size ≤ 2 then naive Suche
elif x ≥ max in T.list then return Succ(x) gibt’s nicht else
x
0:=
jx 2k00
k
; x
00:= x mod 2
k00;
if T.top.b[x
0] = 1 and x
00< max{T.bottom[x
0]} then return x
0· 2
k00+ Succ(x
00, T.bottom[x
0])
else
z
0:=Succ(x
0, T.top); return z
0· 2
k00+ min{T.bottom[z
0]}
fi
fi
JJ
HH HH H H
J J J J J J
JJ
T.top
T.Bottom[0]
T.Bottom[1]
T.Bottom
h2
k0
− 1
i2
k0
x
succ(x)