F13: Trie och sökträd
Niclas Börlin
5DV149 Datastrukturer och algoritmer
Trie
I
Ytterligare en variant av träd. Vi har tidigare sett:
I
I
Oordnat träd där barnen till en nod bildar en mängd.
Ordnat träd där barnen till en nod bildar en lista.
I
I Trie är barnen till en nod organiserade som tabellvärden i en tabell
som hör till noden.
I
Trie kallas också för diskrimineringsträd, code-link tree eller
radix-search tree.
Organisation av Trie
I
Man når barnen (delträden) direkt genom “namn”, dvs
argument/nycklar i barnnodens tabell.
I
När man ritar träd brukar nycklarna skrivas direkt intill motsvarande
båge.
I
I en trie har tabellerna en och samma nyckeltyp, till exempel tecken.
I
I många tillämpningar av Trie saknar de inre noderna etiketter,
träden är lövträd.
I
Trie är normalt nedåtriktad.
I
Binära träd kan ses som ett specialfall av Trie där nyckelvärdena är
left och right.
Informell specifikation
I
Två sätt:
I
Utgå från Urträdets specifikation och låt typparametern sibling ha
värdet Tabell.
I
I
I
Då hanteras insättning, borttagning och värdeskoll av Tabellen själv.
I övrigt används de vanliga operationerna för att sätta in och ta bort
barn etc.
Sätt in lämpliga tabelloperationer direkt i specifikationen av Trie.
I
Insert-child blir tabellens Insert, Delete-child tabellens Remove och
Child tabellens Lookup.
Implementation av Trie
I
De flesta Träd-implementationer går bra att utgå från.
I
Man måste byte ut de delar som hanterar barnen till att hantera
dessa som tabellvärden i en Tabell.
I
I
En länkad lista med 2-celler byts till 3-celler.
Implementerar man tabellen som en vektor eller som en hashtabell får
man effektiva Trieimplementationer.
Tillämpningar av Trie
I
I
Används för att konstruera Lexikon av sekvenser eller Tabeller där
nycklarna är sekvenser.
För sekvenser med element av typ A väljer vi en Trie med
tabellnycklar av typ A.
I
I
En sekvens motsvaras då av en väg i trädet från roten till ett löv.
Man lägger till en slutmarkör i slutet av varje sekvens om en sekvens
kan vara början på en annan sekvens.
I
I
En annan variant är att ha etiketter i de inre noderna också.
Ett viktigt/vanligt specialfall är Lexikon/Tabell av textsträng = en
lista eller vektor av tecken.
Tillämpningar av Trie
Forts.
I
Fördelar med att använda Trie för Lexikon/Tabeller som lagrar
sekvenser som startar med samma följd av elementvärden:
I
I
I
Kompakt sätt att lagra lexikonet/tabellen på.
Sökningens tidskomplexitet proportionell mot sekvenslängden (en
jämförelse per elementtecken).
Den relativa komplexiteten är oberoende av lexikonet/tabellens
storlek.
I
Det blir inte “dyrare” att söka i ett stort lexikon jämfört med ett litet.
Tillämpningar
I
Stavningskontroll
I
I
Översättningstabell
I
I
I
Skapa ett trie med alla ord som finns i språket.
Löven innehåller motsvarande ord i ett annat språk.
Filsystem på Unix/PC.
Datakomprimering
I
I
LZ78-algoritmen.
Huffman-kodning.
Rymdsonden Galileo till Jupiter
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
I
Kapacitet 120 kbit/s.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
I
Kapacitet 120 kbit/s.
I
Utfällningen misslyckades.
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
I
Kapacitet 120 kbit/s.
I
Utfällningen misslyckades.
Backupantenn:
I
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
I
Kapacitet 120 kbit/s.
I
Utfällningen misslyckades.
Backupantenn:
I
I
Kapacitet 40
Rymdsonden Galileo till Jupiter
I
18 oktober 1989.
I
Uppskjutning av rymdfärjan Atlantis.
I
Ombord finns rymdsonden Galileo som ska till
Jupiter.
I
Ett år efter starten; dags att fälla ut
huvudantennen.
I
Kapacitet 120 kbit/s.
I
Utfällningen misslyckades.
Backupantenn:
I
I
Kapacitet 40 bit/s.
LZ78 eller Lempel-Ziv-kodning
I
Kodning:
I
I
Låt frasen 0 vara den tomma strängen.
Skanna igenom texten:
I
I
I
I
Om du stöter på en “ny” bokstav lägg till den på toppnivån på trien.
Om du stöter på en “gammal” bokstav
- Gå nedåt i trien tills du inte kan matcha fler tecken.
- Lägg till en nod i trien som representerar den nya strängen.
Stoppa in paret (nodeIndex, sistaBokstaven) i den komprimerade
strängen.
Exempel: “how now brown cow in town”.
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
.
15
I
Output:
␣
4
w
o
2
w
6
3
b
7
␣
11
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
3
b
7
␣
11
.
15
I
␣
4
w
o
2
w
6
Output: 0h
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
3
b
7
␣
11
.
15
I
␣
4
w
o
2
w
6
Output: 0h0o
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
3
b
7
␣
11
.
15
I
␣
4
w
o
2
w
6
Output: 0h0o0w
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
3
b
7
␣
11
.
15
I
␣
4
w
o
2
w
6
Output: 0h0o0w0␣
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r
n
5
␣
c
10 13
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣0t
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣0t
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣0t
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
|
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣0t
r
t
i
8
12
14
LZ78 kodningsexempel
I
Input: how now brown cow in town.
0
h
1
n
9
␣
4
w
o
2
w
6
3
b
7
n
5
␣
c
10 13
r
␣
11
.
15
I
Output: 0h0o0w0␣0n2w4b0r6n4c6␣0i5␣0t9.
t
i
8
12
14
LZ78 eller Lempel-Ziv-kodning
I
Avkodning:
I
I
I
Table t=empty(), n = 0.
Läs in index i och tecken q från indata.
Om i = 0,
I
I
I
print q
t=insert(n + 1,q, t)
n =n+1
annars
I
I
I
I
print lookup(i, t)
print q
t=insert(n + 1, concat(lookup(i, t), q), t)
n =n+1
LZ78 avkodningsexempel
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
Output:
LZ78 avkodningsexempel
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
I
t(1)=h
Output: h
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
Output: ho
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
Output: how
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
Output: how␣
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
Output: how␣n
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
Output: how␣now
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
Output: how␣now␣b
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
Output: how␣now␣br
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(2)=o
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣c
I
t(10)=␣c
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(10)=␣c
I
t(2)=o
I
t(11)=ow␣
I
t(3)=w
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣cow␣
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(10)=␣c
I
t(2)=o
I
t(11)=ow␣
I
t(3)=w
I
t(12)=i
I
t(4)=␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣cow␣i
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(10)=␣c
I
t(2)=o
I
t(11)=ow␣
I
t(3)=w
I
t(12)=i
I
t(4)=␣
I
t(13)=n␣
I
t(5)=n
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣cow␣in␣
LZ78 avkodningsexempel
I
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
t(1)=h
I
t(10)=␣c
I
t(2)=o
I
t(11)=ow␣
I
t(3)=w
I
t(12)=i
I
t(4)=␣
I
t(13)=n␣
I
t(5)=n
I
t(14)=t
I
t(6)=ow
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣cow␣in␣t
LZ78 avkodningsexempel
I
Input: 0h0o0w0 0n2w4b0r6n4c6 0i5 0t9.
|
I
I
t(1)=h
I
t(10)=␣c
I
t(2)=o
I
t(11)=ow␣
I
t(3)=w
I
t(12)=i
I
t(4)=␣
I
t(13)=n␣
I
t(5)=n
I
t(14)=t
I
t(6)=ow
I
t(15)=own.
I
t(7)=␣b
I
t(8)=r
I
t(9)=own
Output: how␣now␣brown␣cow␣in␣town.
Filkomprimering
I
ASCII-filer är textfiler där varje bokstav representeras av en 8-bitars
ascii-kod.
I
Det är alltså en fixlängdskodning.
I
Om man tittar på en textfil ser man att vissa bokstäver förekommer
oftare än andra.
I
Om man lagrar vanligt förekommande bokstäver med färre bitar än
ovanliga så skulle man kunna spara utrymme.
Filkomprimering
Kodning
I
Kodningen måste ske så att man enkelt kan avkoda strängen
entydigt med kännedom om hur de olika tecknen översätts.
I
I
I
Exempel: Antag att de tre tecknen a, b och c kodas som 0, 1
respektive 01.
Om en mottagare får strängen 001 betyder det aab eller ac?
Prefix-regeln: Ingen symbol kodas med en sträng som utgör prefix till
en annan symbols kodsträng.
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A B
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
I
0
D
1
0
A
I
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
1
0
A
I
I
0
D
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A D
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
1
0
A
I
I
0
D
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A D
A
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
1
0
A
I
I
0
D
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A D
A B
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
1
0
A
I
I
0
D
1
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A D
A B
R
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Prefixkodning
I
Vi använder ett trie!
I
I
I
Bokstäverna lagras i löven.
Den vänstra kanten betyder 0.
Den högra kanten betyder 1.
0
0
C
1
0
A
I
I
0
D
1
1
B
1
R
Vad betyder
01011011010000101001011011010?
A B
R
A C
A D
A B
R
A
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
Optimal kompression
I
Vilken tabell/träd vi har bestämmer
kompressionens effektivitet.
I
Med tabellen/trädet nedan får vi
01011011010000101001011011010 = 29 bitar.
I
Med tabellen/trädet till höger får vi
001011000100001100101100 = 24 bitar.
I
Varför?
I
A = 00
I
B = 10
I
C = 010
I
D = 011
I
R = 11
0
0
1
1
0
C
0
A
0
D
1
R
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
0
A
1
0
B
1
0
C
1
D
1
R
Optimal kompression
I
Vilken tabell/träd vi har bestämmer
kompressionens effektivitet.
I
Med tabellen/trädet nedan får vi
01011011010000101001011011010 = 29 bitar.
I
Med tabellen/trädet till höger får vi
001011000100001100101100 = 24 bitar.
I
Varför?
I
ABRACADABRA = AAAAA BB RR C D
I
A = 00
I
B = 10
I
C = 010
I
D = 011
I
R = 11
0
0
1
1
0
C
0
A
0
D
1
R
1
B
I
A = 010
I
B = 11
I
C = 00
I
D = 10
I
R = 011
0
A
1
0
B
1
0
C
1
D
1
R
Huffman-kodning
I
I
Bygger upp optimalt träd från en frekvenstabell.
Algoritm:
I
I
I
Börja med en mängd träd bestående av ett enda löv.
Till varje löv associeras en symbol och en vikt = symbolens frekvens i
texten som ska kodas.
Upprepa tills vi har ett enda stort träd:
I
I
I
I
Välj de två träd som har minst vikt i roten.
Bygg ihop dem till ett träd där de blir barn till en ny nod.
Den nya noden innehåller en vikt = summan av barnens vikter.
Den genererade kodtabellen måste skickas först i meddelandet.
Huffman-kodning
5
A
2
B
R
2 1
C
D
1
Huffman-kodning
2
5
A
2
B
R
2 1
C
D
1
Huffman-kodning
4
5
A
2
B
2
R
2 1
C
D
1
Huffman-kodning
6
4
5
A
2
B
2
R
2 1
C
D
1
Huffman-kodning
11
6
4
5
A
2
B
2
R
2 1
C
D
1
Huffman-kodning
0
A
1
0
0
B
1
1
R
0
C
1
D
I
A=0
I
B = 100
I
C = 110
I
D = 111
I
R = 101
Huffman-kodning
I
Optimal tabell:
I
I
01001010110011101001010 = 23 bitar
AB R AC AD AB R A
0
A
1
0
0
B
1
1
R
0
C
1
D
I
A=0
I
B = 100
I
C = 110
I
D = 111
I
R = 101
Popularitet
I
Lempel-Ziv-Welch (LZW) i GIF-formatet, unix-kommandot compress.
I
DEFLATE-kompression (LZ77+Huffman) i gzip och PNG-formatet.
Tries för strängar
Implementation
I
Insättning
I
I
I
Startar i roten och går nedåt i trädet så länge det finns en matchande
väg.
När man hittar en skiljelinje, stanna och stoppa in resten av strängen
som ett delträd.
Borttagning
I
I
I princip samma algoritm som insättning fast “tvärtom”.
Sök upp strängen som ska tas bort och radera nerifrån i trädet upp
till första förgreningen.
Komprimerade Tries
I
Alla enbarnsnoder konverteras till att innehålla hela
strängen/sekvensen som är under.
0
h
1
w
o
2
w
6
␣
4
3
b
7
n
5
␣
c
10 13
r
8
i
12
t
14
␣
11
n
9
.
15
0
h
1
2
w
6
n.
9
␣
4
w
o
3
b
7
␣
11
n␣
5
c
10
r
8
i
12
t
14
Binärt sökträd
I
I
Används för sökning i linjära samlingar av dataobjekt, specifikt för
att konstruera tabeller och lexikon.
Organisation:
I
Ett binärt träd som är sorterat med avseende på en sorteringsordning
R av etikett-typen så att
I
I
I varje nod N gäller att alla etiketter i vänster delträd går före N som i
sin tur går före alla etiketter i höger delträd.
Alla noder är definierade.
Binärt sökträd
Informell specifikation
I
Skiljer sig från ett vanligt binärt träd:
I
Alla noder måste ha etiketter.
I
I
I
Ta bort Create, Has-Label och Set-Label och inför Make som skapar
rotnod med värde.
Insert-operationerna utökas med ett etikettvärde.
Man ska kunna ta bort inre noder också, inte bara löv.
I
I
I
Positionsparametern i Delete-node behöver inte peka på ett löv.
När man rycker bort en inre nod slits trädet sönder.
Hur lagar man det?
I
Är nedåtriktat
I
Eftersom trädet är sorterat kan man inte få stoppa in ett nytt
element vart som helst.
I
I
Parent kan utelämnas.
Måste uppfylla sorteringsordningen.
Varför sorterat träd?
I
I
Det går snabbare att söka i strukturen.
För binärt sökträd:
I
I
I
Kolla om det sökta värdet finns i den aktuella noden.
Om inte sök rekursivt nedåt i vänster eller höger delträd beroende på
om det sökta elementet kommer före eller efter nodens värde i
sorteringsordningen.
Om det binära trädet är komplett:
I
I
Värstafallskomplexitet för sökning O(log n) för ett träd med n noder.
Hur ser man till att trädet blir komplett vid insättning?
8
3
1
10
6
4
14
7
13
Insättning i komplett träd
I
I
Hur ser man till att trädet blir komplett vid insättning?
Om vi vid en jämförelse upptäcker att vänstra delträdet redan är fullt
I
I
sätt in nya värdet i aktuell nod,
gör insättning av gamla nodvärdet i höger delträd.
7
7
7
8
8
3
3
1
1
10
3
10
10
6
6
1
6
8
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
I
Om den borttagna noden bara har ett delträd:
7
3
1
10
6
8
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
I
Om den borttagna noden bara har ett delträd:
I
Lyft upp det ett snäpp.
7
7
3
1
3
10
6
8
1
10
6
8
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
I
Om den borttagna noden bara har ett delträd:
I
I
Lyft upp det ett snäpp.
Om den borttagna noden har två delträd:
7
3
1
10
6
8
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
I
Om den borttagna noden bara har ett delträd:
I
I
Lyft upp det ett snäpp.
Om den borttagna noden har två delträd:
I
Välj noden med det lägsta värdet i höger delträd.
7
7
3
1
3
10
6
8
1
10
6
8
Borttagning av nod i binärt sökträd
I
Hur lagar man ett träd när man tar bort en nod mitt i?
I
Om den borttagna noden bara har ett delträd:
I
I
I
I
Lyft upp det ett snäpp.
Om den borttagna noden har två delträd:
Välj noden med det lägsta värdet i höger delträd.
Detta är standardkonstruktionen, är upp till den som implementerar
trädet.
I
I
De vanligaste tillämpningarna är inte beroende av denna detalj.
Viktigt att visar sitt beslut i specifikation och dokumentation.
7
7
3
1
3
10
6
8
1
10
6
8
Tillämpningar av Binärt sökträd
I
I
Framför allt till konstruktioner av Lexikon och Tabell.
Notera att inorder-traversering av binärt sökträd ger en sorterad
sekvens av de ingående elementen.
I
Kan alltså sortera element genom att stoppa in dem ett och ett i ett
tomt Binärt sökträd och sedan traversera det.
Generaliseringar
I
Ett binärt sökträd underlättar sökning i en en-dimensionell
datamängd.
I
C
I
Lätt att generalisera detta till sökning i en 2-dimensionell datamängd
(quadtree), 3-dimensionell (octtree) eller högre.
N
R
S
T
U
Y
Quadtree (Fyrträd)
I
I
Organiserat som ett binärt träd med förgreningsfaktor 4 istället för 2.
Tolkning (vanligast):
I
I
I
Rotnoden delar in den givna ytan (oftast kvadrat) i fyra lika stora
kvadrater.
Vart och ett av de fyra barnen delar i sin tur sin kvadrat i fyra osv.
Inga koordinater behöver lagras i inre noder.
I
Kan användas för att lagra lägesinformation för punktformiga
grafiska objekt.
I
Man kan också använda det för att representera kurvor och ytor.
Svarta kvadranter fylls helt av objektet.
Grå kvadranter fylls delvis av objektet.
Vita kvadranter innehåller inte objektet.
Exempel på tillämpning:
I
I
I
2D: Geografiska informationssystem (GIS).
3D: Kollisionsdetektion vid 3D-simuleringar.