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"
  1. Creëer alle leaf-nodes
  2. Maak een parent voor twee parent-loze nodes met kleinste frequentie
    • geef als frequentie som van frequenties van kinderen
  3. Herhaal 2. tot er één node zonder parents overblijft: de root
  4. 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"
  1. Creëer alle leaf-nodes
  2. Maak een parent voor twee parent-loze nodes met kleinste frequentie
    • geef als frequentie som van frequenties van kinderen
  3. Herhaal 2. tot er één node zonder parents overblijft: de root
  4. 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"