12c. Huffmanboom
constructie
2021-03-19
slides.com/jod/pt_12c
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Centraal idee
Input: tekst
Output: Huffmanboom met korte paden voor karakters die veel voorkomen in tekst
Stap 0: bereken de frequentie van elk karakter in de tekst
Niet moeilijk voor ASCII-tekst:
er zijn maar 128 mogelijke karakters
karakter | frequentie |
---|---|
m | 1 |
e | 4 |
t | 3 |
n | 2 |
"meettenten"
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Centraal idee
Input: tekst, frequentie-tabel
Output: Huffmanboom met korte paden voor karakters die veel voorkomen in tekst
karakter | frequentie |
---|---|
m | 1 |
e | 4 |
t | 3 |
n | 2 |
"meettenten"
Sla in elke node een frequentie op
- leafs: frequentie van karakter van leaf
- interne nodes: som van frequenties van kinderen
We bouwen de boom bottom-up, vanuit de nodes met de laagste frequenties, om zo de hogere frequenties dichter bij de root toe te voegen.
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Algoritme
karakter | frequentie |
---|---|
m | 1 |
e | 4 |
t | 3 |
n | 2 |
"meettenten"
- Creëer alle leaf-nodes
- Maak een parent voor twee parent-loze nodes met kleinste frequentie
- geef als frequentie som van frequenties van kinderen
- Herhaal 2. tot er één node zonder parents overblijft: de root
- Geef label "1" aan linkertak en "0" aan rechter
m
4
3
2
1
n
t
e
3
6
10
0
1
1
1
0
0
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Algoritme
karakter | frequentie | bitcode |
---|---|---|
m | 1 | 111 |
e | 4 | 0 |
t | 3 | 10 |
n | 2 | 110 |
"meettenten"
- Creëer alle leaf-nodes
- Maak een parent voor twee parent-loze nodes met kleinste frequentie
- geef als frequentie som van frequenties van kinderen
- Herhaal 2. tot er één node zonder parents overblijft: de root
- Geef label "1" aan linkertak en "0" aan rechter
.
.
.
e
t
n
m
0
1
1
1
0
0
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Randgeval
karakter | frequentie | bitcode |
---|---|---|
s | 1 | |
o | 1 | |
e | 1 | |
p | 1 |
"soep"
Wat met het woord "soep"?
De frequentie van alle letters is hetzelfde...
s
1
1
1
1
o
e
p
2
4
0
1
1
1
0
0
2
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Randgeval
karakter | frequentie | bitcode |
---|---|---|
s | 1 | 111 |
o | 1 | 110 |
e | 1 | 101 |
p | 1 | 100 |
j | 1 | 01 |
a | 1 | 00 |
"soepja"
2
4
1
0
1
1
1
1
0
0
0
0
2
1
1
1
1
s
o
e
p
1
1
j
a
2
4
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Randgeval
karakter | frequentie | bitcode |
---|---|---|
s | 1 | 11 |
o | 1 | 10 |
e | 1 | 01 |
p | 1 | 00 |
"soep"
Wat met het woord "soep"?
De frequentie van alle letters is hetzelfde...
s
1
1
1
1
o
e
p
2
4
0
1
1
1
0
0
2
Resultaat:
twee bits per karakter
Zonder extra frequentie-informatie zitten zitten we terug in het algemene geval :)
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Oefeningen
karakter | frequentie | bitcode |
---|---|---|
f | 1 | ? |
e | 4 | ? |
s | 1 | ? |
t | 3 | ? |
n | 2 | ? |
"feesttenten"
- Stel een Huffmanboom op voor het woord "feesttenten", gebruik als frequentie voor elk karakter het aantal keer dat het voorkomt in "feesttenten"
- Op basis van deze huffmanboom, wat is de huffmancodering voor het woord "feesttenten"? Hoeveel bits is dit korter dan simpelweg 3 bits te gebruiken per karakter?
- Tijdens het bouwen van een huffmanboom, welke datastructuur lijkt meest geschikt om de verzameling parentloze nodes in op te slaan? Waarom?
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Oefeningen
karakter | frequentie | bitcode |
---|---|---|
f | 1 | 1111 |
e | 4 | 0 |
s | 1 | 1110 |
t | 3 | 10 |
n | 2 | 110 |
"feesttenten"
2
4
3
1
4
1
f
e
s
t
2
n
7
11
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Implementatie
- Volledige code: pastebin.com/qri6qC63
- Compressietest: comprimeer de Universele Verklaring van de Rechten van de Mens, zie pastebin.com/8V6MNicf
- Resultaat:
- Origineel: 12 781 B
- Gecomprimeerd met Huffmancode:
6 846 B- + 299 B decodeerinfo - de frequentietabel om de boom te bouwen
- Compressie tekstbestand via .zip: 4 568 B
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
Constructie van Huffmanboom:
- Gebruik frequentietabel
- Hou frequenties bij in nodes
- Leafs komen overeen met frequentietabel
- Interne nodes gebruiken som van kinderen
- Loop: creëer parent voor parentloze nodes met laagste frequenties
- Label takken als "1" en "0"
12c. Huffmanboom constructie
By Jo Devriendt
12c. Huffmanboom constructie
- 676