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