Tries et code de Hoffman

Transcription

Tries et code de Hoffman
Tries
11/27/2013 12:41 PM
Structures en arbre pour le
traitement de textes
Preprocessing Strings
Tries
• Un trie est une structure de données pour
représenter un ensemble de chaines de caractères
(par exemple, les mots dans un texte)
• Utile pour la recherche rapide
• Aussi pour comprimer un texte.
e
i
mize
mi
nimize
ze
nimize
nimize
ze
ze
Trie: du mot anglais “retrieval”
Tries
1
Standard Trie (1)
•
Trie de base (2)
n nombre de mots dans S
m longueur d’un mot
d taille de l’ alphabet
Exemple:
S = { bear, bell, bid, bull, buy, sell, stock, stop }
b
e
a
l
r
l
d
b
s
i
u
l
y
l
e
t
l
o
l
Tries
2
• Un trie utilise O(n) espace et requiert une
complexité de O(dm) pour l’insertion, la recherche
et le retrait.
Le trie de base est un ensemble de mots dans un arbre tel que:
– Chaque noeud sauf la racine est un caractère
– Les enfants sont en ordre alphabétique
– Les différents chemins de la racine aux feuilles mènent à un mot de S
•
Tries
c
k
e
p
s
i
a
l
r
l
d
u
l
l
y
e
t
l
o
l
c
p
k
3
Tries
4
1
Tries
11/27/2013 12:41 PM
Trie de base (3)
•
Recherche de mots avec un
Chaque
Trie
feuille
s e e
enregistre
les positions
d’occurences
de chaque
mot d’un
texte
Pourquoi O(dm) pour la recherche?
par exemple “ZZZZZZZ”
A chaque niveau, il faut parcourir tout
l’alphabet, donc 7*26 comparaisons!
a
b e a r ?
s e e
a
b i d
b u l
l ?
s t o c k !
Trie compressé
h e a r
t h e
b e l
ll
e
l
r
l
d
l
r
l
6
78
d
47, 58
u
s
e
y
l
e
e
a
36
l
r
30
69
t
l
o
0, 24
p
c
l
12
84
k
17, 40,
51, 62
Tries
6
u
ell
to
y
ck
0 1 2 3
0 1 2 3 4
p
S[4] =
S[1] =
s e e
b e a r
S[2] =
s e l l
S[3] =
s t o c k
0 1 2 3
S[7] =
S[5] =
b u l l
b u y
S[8] =
h e a r
b e l l
S[6] =
b i d
S[9] =
s t o p
s
i
a
s t o p !
• Chaque noeud stocke le triplet (i,l,k) avec i le mot, l et k
Sont les indices, e.g. (6,1,2) correspond à S[6] de 1 à 2 ou “id”.
s
ll
b
l ?
h
i
a
S[0] =
ar
s t o c k !
s t o c k !
Représentation compacte
b
id
b u y
b i d
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
5
e
s t o c k !
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
b
• Dans un trie compressé,
chaque noeud doit avoir
un degré d’au moins 2
• On élimine les branches
redondantes
l
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
e
Tries
s e l
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
u
l
y
e
t
l
o
1, 0, 0
1, 1, 1
l
l
Tries
c
k
1, 2, 3
7
4, 1, 1
6, 1, 2
p
8, 2, 3
0, 0, 0
7, 0, 3
4, 2, 3
0, 1, 1
5, 2, 2
Tries
0, 2, 2
3, 1, 2
2, 2, 3
3, 3, 4
9, 3, 3
8
2
Tries
11/27/2013 12:41 PM
Trie Suffixe (1)
Trie Suffixe (2)
• La représentation compacte du trie suffixe d’un mot X de
longueur n à partir d’un alphabet de taille d
• Un trie suffixe d’un mot X est le trie compressé de tout ses
suffixes
– Utilise un espace O(n)
– Supporte une recherche de motifs avec une complexité O(dm)
ou e m est la longueur du motif
m i n i m i z e
0 1 2 3 4 5 6 7
m i n i m i z e
0 1 2 3 4 5 6 7
e
i
mi
nimize
ze
7, 7
mize
nimize
ze
nimize
1, 1
4, 7
Tries
– Chaque feuille est un caractère (un symbole)
– On doit donc produire un arbre binaire ayant n feuilles
– Le mot de code associé à un caractère est obtenu en suivant le
chemin de la racine jusqu’à ce caractère (0 pour l’enfant de
gauche et 1 pour l’enfant de droite)
0
010
011
10
11
b
c
d
e
0
a
Tries
2, 7
6, 7
6, 7
2, 7
6, 7
Tries
10
Codage avec Trie (2)
• Un code fait correspondre chaque caractère d’un alphabet
avec un mot binaire
• Un code préfixe est un code binaire tel que aucun mot de code
est le préfixe d’un autre (par exemple le code Morse)
• Un codage avec Trie produit un code préfixe
a
2, 7
9
Codage avec Trie (1)
00
0, 1
ze
•
Soit une chaine X, nous voulons trouver un code préfixe pour les
caractère de X donnant lieu à un codage compact
– Les caractères les plus fréquents devraient avoir des mots de codes
très courts
– Les caractères rares peuvent avoir des codes plus long
•
Example
– X = abracadabra
– T1 code X en 29 bits
– T2 code X en 24 bits
T1
T2
1
0
1
0
1
b
c
d
1
e
11
c
d
a
r
b
a
b
c
Tries
r
d
12
3
Tries
11/27/2013 12:41 PM
Algorithme de Huffman
Algorithme de Huffman
• Insérer chacun des caractères distincts de la chaine X dans
une file à priorité en utilisant la fréquence d’apparition de
chaque caractères comme clé; le calcul des fréquences est
O(n).
• Soit une chaine de caractères (ou de symboles)
X, l’algorithme de Huffman construit un code
préfixe qui minimise la taille du code pour X
• Il s’exécute en temps O(n + d log d) , avec n la
longueur de X et d le nombre de caractères
distinct de X
• Une file à priorité est utilisée comme structure
auxiliaire
•Retirer 2 noeuds de la file à priorité; O(logd ).
•Combiner ces 2 noeuds et créer un arbre binaire dont la racine
est la somme des deux clés; O(1).
•Insérer ce nouvel arbre dans la file à priorité (insérer un arbre
correspond à insérer sa racine); O(logd ).
Tries
13
•Répéter jusqu’à ce qu’il y ait un
seul arbre dans la file; O(d).14
Tries
Exemple
Huffman’s Algorithm
11
Algorithm HuffmanEncoding(X)
Input string X of size n
Output optimal encoding trie for X
C ← distinctCharacters(X)
computeFrequencies(C, X)
Q ← new empty heap
for all c ∈ C
T ← new single-node tree storing c
Q.insert(getFrequency(c), T)
while Q.size() > 1
f1 ← Q.minKey()
T1 ← Q.removeMin()
f2 ← Q.minKey()
T2 ← Q.removeMin()
T ← join(T1, T2)
Q.insert(f1 + f2, T)
return Q.removeMin()
Tries
a
5
2
a
b
c
d
r
5
2
1
1
2
c
1
d
1
b
2
6
a
X = abracadabra
Frequencies
c
15
b
2
c
d
b
2
r
2
a
5
c
2
d
r
2
r
6
2
a
5
4
a
5
Tries
c
4
d
b
r
4
d
b
r
16
4
Tries
11/27/2013 12:41 PM
6
a
5
2
a
b
c
d
r
a
5
2
1
1
2
5
c
1
d
1
b
2
4
b
X = abracadabra
Frequencies
r
c
d
11
a
r
2
6
4
b
4
2
2
2
c
a
5
b
2
c
d
r
2
a
5
Tries
b
2
c
r
r
d
d
17
Tries
18
Huffman Coding
Un autre exemple
E: 29
T: 10
N: 9
I: 5
S: 4
(4, 5, 9, 10, 29)
(4, 5, 9, 10, 29)
4+5
9
0
1
4
5
=
0
4
1
E: 29
T: 10
N: 9
I: 5
S: 4
4+5
0
9
1
=
5
4
0
1
4
5
S
I
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(9, 9, 10, 29)
4, 5 9
5
9+9
0
9
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(9, 9, 10, 29)
4, 5 9
0
4
9+9
0
9
I
1
18
1
0
9
1
=
N
0
5
1
9
4
9
1
5
S
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9, 9 18
(18, 10, 29) (10, 18, 29)
9
Tries
19
Tries
20
5
Tries
11/27/2013 12:41 PM
= 28
= 28
10 + 18
0
18
1
0
9
9
9
1
4
5
N
S
I
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10, 18 28
(28, 29)
28+29
=57
0
28
10
1
4
5
4
5
1
29
0
E
T
1
10
18
0
1
9
9
N
0
Tries
1
28
9
0
9
0
28+29
=57
0
1
9
I
1
18
0
1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10, 18 28
(28, 29)
29
1
T
1
18
0
0
0
0
10
1
10
T
10 + 18
21
4
N
E
E (29): 1
T (10) : 00
N (9) : 011
I (5): 0101
S (4) : 0100
1
I
5
S
Tries
22
S
6

Documents pareils