9. red-black trees
2-4 boom
horiz-vert
rood-zwart
orde m=4
B
F
A
C
D
E
G
H
3
4
5
6
8
9
2
1
7
F
B
D
C
3
4
E
5
6
A
1
2
G
H
8
9
7
F
B
D
C
3
4
E
5
6
A
1
2
G
H
8
9
7
10. rood-zwart definitie
B-boom van orde 4
sleutel ‘tussen’ kinderen
uniforme hoogte
min 2 kinderen (uitgez. wortel)
max 4 kinderen
rood-zwart boom
binaire zoekboom
knopen zwart of rood
gelijk aantal zwarte knopen op elk
pad van wortel naar ‘extern’ blad
rode knoop heeft geen rood kind
wortel is zwart
D
C
E
A
F
B
B
F
B
F
C
D
E
A
17. • knoop (node), tak (edge) en hun relatie..
• gericht, ongericht (symmetrisch)
• gewicht op takken ontbrekend langs pad kosten optellen capaciteit 0 minimum
• samenhang, één component elke knoop bereikbaar
• geen lussen
grafen
19. graaf-wandeling
void Graph::dfs( Vertex v)
{ visit( v );
v.visited = true;
for each w adjacent to v
if ( not w.visited )
dfs( w );
}
depth-first-search (dfs)
~ pré-orde ~ stapel
breadth-first-search (bfs)
~ nivo-orde ~ rij
Weiss p.362 ‘template’ recursief
23. Prim - Dijkstra
Prim: minimaal opspannende boom ongerichte graaf met gewichten negatieve waarden toegestaan Dijkstra: kortste paden vanuit één knoop gerichte graaf met gewichten géén negatieve waarden laten boom groeien vanuit beginknoop
• voeg ‘lichtste’ tak toe
• voeg dichtstbijzijnde knoop toe Kruskal:
• lichtste tak, niet noodzakelijk met boom verbonden gretige algoritmen
24. Prim - Dijkstra algoritme
kies beginknoop x
// initialiseer
start met boom bestaand uit {x}
for elke yx do maak (x,y) kandidaattak od
while nog knopen buiten boom
do kies y met kleinste kand-waarde
voeg y en kand-tak aan boom toe
pas kandidaattakken aan
od
kandidaattak:
voor elke knoop buiten boom
een tak vanuit boom
- met kleinste gewicht
- waarlangs kortste pad
kandidaatwaarde:
- gewicht van kandidaattak
- afstand via kandidaattak
25. pas kandidaattakken aan
kandtak(z)
nieuwe verbinding beter dan oude?
Prim: gewicht(y,z) < kandwaarde(z)
Dijkstra:
afstand(y) + gewicht(y,z) < kandwaarde(z)
z
y
4
3
z
3 < 4
adj.lists: bekijk uitgaande takken van y
z
toegevoegd
26. pas kandidaattakken aan
kandtak(z)
nieuwe verbinding beter dan oude?
Prim: gewicht(y,z) < kandwaarde(z)
Dijkstra:
afstand(y) + gewicht(y,z) < kandwaarde(z)
z
y
4
3
15
17
19
z
3 < 4
17+3<19
/
adj.lists: bekijk uitgaande takken van y
z
toegevoegd
32. vb Binary Decision Diagram
F
b4
F
T
b4
T
b3
F
b4
F
T
b4
F
b3
b2
b1
T
b4
T
T
b4
T
b3
T
b4
F
T
b4
F
b3
b2
F
T
F
b3
T
b4
b3
b2
b1
b2
F
T
(b1 b3) (b2 b4)
40. hashen
sleutels
adressen
S
K
h
› synoniemen botsingen
› keuze adresfunctie
• snel te berekenen
• goede spreiding
› clustering
• primair, secundair
› zoeken in O(1) tijd
mits weinig botsingen en clustering
• tabelgrootte
• adresfunctie
• aanbod sleutels
41. perfecte hashtabel
statisch gebruik:
S bekend
h te bepalen zonder botsingen
x ε S ?
bepaal h(x)
kijk op adres h(x):
x aanwezig x ε S
andere sleutel x ε S
adressen
S
K
h
sleutels
42. perfecte hashtabel vb.
2 do
3 end
4 else
5 case
6 downto
7 goto
8 to
9 otherwise
10 type
11 while
12 const
13 div
14 and
15 set
16 or
17 of
18 mod
19 file
20 record
21 packed
22 not
23 then
24 procedure
25 with
26 repeat
27 var
28 in
29 array
30 if
31 nil
32 for
33 begin
34 until
35 label
36 function
37 program
a 11 l 15 u 14
b 15 m 15 v 10
c 1 n 13 w 6
f 15 p 15 y 13
g 3 r 14
h 15 s 6 rest 0
i 13 t 6
h(key) = L + g(key[1]) + g(key[L])
lengte
h(begin) = 5 + 15 + 13 = 33
h(hulp) = 4 + 15 + 15 = 34
h(forward) = 7 + 15 + 0 = 22
Cichelli
43. hash-functies
truncation eerste/laatste bits
extraction keuze uit bits (let op!)
folding tel segmenten op
mid-squaring kwadrateer, neem midden
slecht bij nullen
radix-conversion c…c1c0
ci256i cii
h = 0 h = h+ci (i=…0)
bv. =65599 (216)
division mod M M arbc
• M=2r dan laatste bits
veel keuze oneven p(K)
• M priem heel mooi!
p(K) = K mod(M-1) +1 òf mod(M-2)
multiplication
adres fract(K)M irrationeel
44. voorbeeld C++ compiler
/* Return a hash-code for the string. */
hash_table_key k;
{
s = (const unsigned char *) k;
hash = 0; len =0;
while ( (c=*s++) != ’0’ )
{
hash += c + (C << 17);
hash ^= hash >> 2;
++len;
}
hash += len + (len << 17);
hash ^= hash >> 2;
return hash;
}
45. voorbeeld compiler boek
PJ Weinberger C compiler
h = (h<<4)+(*c);
if (g = h&0xf0000000)
{ h = h^(g>>24);
h = h^g;
}
32 bits
cccc
xor
0000
g>>24
47. hashen: open adressering
adressen 0,1, …, M-1 (tabelgrootte M)
pogingen op
h(K,0)=h(K), h(K,1), …, h(K,M-1)
vormen permutatie van adressen
lineair: h(K,i) = h(K) - ic (mod M)
toegestaan: ggd(c,M)=1
pseudo-random: h(K,i) = h(K) - ri (mod M)
r0=0,r1, …, rM-1 permutatie adressen
kwadratisch: h(K,i) = h(K) - i2 (mod M)
mits M priem, M 3 (mod 4)
dubbel: h(K,i) = h(K) - ip(K) (mod M)
p stapfunctie ‘probe function’
h adresfunctie ‘hash function’
onafhankelijk: p niet uit h te berekenen
48. hashen: open adressering
lineair
primair clusteren
buren liggen in elkaars pad
secundair clusteren
synoniemen volgen zelfde pad
(pseudorandom, kwadratisch)
dubbel:
‘onafhankelijk’
stapgrootte
52. dictionaries
algorithm design manual says:
Input description: A set of n records, each identified by one or more key fields.
Problem description: Build and maintain a data structure to efficiently locate, insert, or delete the record associated with any query key q.
Discussion: [..] In practice, it is more important to avoid using a bad data structure than to identify the single best option available.
• How many items ...
• ... the relative number of insertions, deletions, and search queries?
• ... relative frequency with which different keys will be accessed?
• ... individual operations be fast, or ... the total amount of work done ... be minimized?
54. Huffman code
A B C D E F
3 17 6 9 15 5
A
E
B
F
D
C
E
D
C
B
F
A
D
C
A
F
E
B
! letters + frequenties
138
133
132
verwachte codelengte
= gewogen padlengte :
freq()·diepte()
letter
? ‘boomcode’
A 100 D 110
B 00 E 01
C 101 F 111
56. Ziv-Lempel-Welch
‘adaptive data compression’
woord 8 bit 14 bit ‘letter’
3
7
0
4
6
5
8
1
2
a
b
c
d
b
a
b
b
c
ababcbababaaaa
a b ab c ba ?..
01 42 5 8
0 1 4 2 5 8
3
7
0
4
9
6
5
8
1
2
a
b
c
d
b
a
b
b
c
a
coderen
decoderen
niet in boom :
net toegevoegd!
8
vb. {a,b,c,d}* 4 bits
58. KMP voorbeeld
a
b
a
a
b
a
b
a
7
a b a a b a b a
a b a a b a b a
4
1 2 3 4 5 6 7 8
a b a a b a b a
0 1 1 2 2 3 4 3
8
a b a a b a b a
a b a a b ...
3
6
a b a a b a b a
a b a a b a b a
3
59. Knuth-Morris-Pratt
Flink[1] = 0;
for k from 2 to PatLengte
do fail = Flink[k-1]
while ( fail>0 and P[fail]P[k-1] )
do fail = Flink[fail];
od
Flink[k] = fail+1;
od
a
b
b
a
k
k-1
òf in 0
60. correctheid failure links
P
r
k
Flink[k]=r
r
P1…Pr-1 = Pk-r+1…Pk-1 met r<k maximaal
r1
r2
r3
r4
P
k
ál dit soort waarden r:
P1…Pr2-1 = Pk-r2+1…Pk-1 = Pr1-r2+1…Pr1-1
Flink[r1]=r2
61. correctheid failure links
P
r
k
Flink[k]=r
r
P1…Pr-1 = Pk-r+1…Pk-1 met r<k maximaal
Flink[k+1]=r+1: óók Pr = Pk
r1
r2
r3
r4
Pk
Pr1
P
k
k+1
ál dit soort waarden r:
P1…Pr2-1 = Pk-r2+1…Pk-1 = Pr1-r2+1…Pr1-1
Pr2
Flink[r1]=r2