Vous êtes sur la page 1sur 3

Université de Sorbonne Paris Nord Algorithmique du texte Année 2022-2024

Institut Galilée Contrôle continu

Toutes les réponses doivent être soigneusement justifiées.


La qualité de la rédaction interviendra de manière importante dans la notation.

Dans tout l’énoncé, pour un motx, |x| désigne la taille de x, ou encore le nombre de ses lettres.

Exercice I
On considère un texte de taille n stocké dans un un tableau texte[0 : n – 1]. Un suffixe du texte est identifié par
l’indice où il commence dans le texte : Pour 0 ≤ i ≤ n – 1, le suffixe qui commence à l’indice i est texte[i : n – 1],
noté encore texte[i :]. En particulier texte[0 :] qui est le texte lui-même et texte[n – 1 :] qui est le mot vide,
sont toujours des suffixes.
La table des suffixes associée à un texte est une table d’entiers TS de même taille que texte, contenant tous les
suffixes du texte dans l’ordre lexicographique : TS[i] est l’indice du départ du suffixe qui est en i-ème rang dans
l’ordre lexicographique.
On a donc par construction : texte[TS[i] :] ≤lex texte[TS[i + 1] :]
Voici comme exemple la table des suffixes, lorsque texte = ‘abracadabra”.
0 1 2 3 4 5 6 7 8 9 10
texte a b r a c a d a b r a
TS 10 7 0 3 5 8 1 4 6 9 2
Q1. Donner un algorithme naïf pour construire la table des suffixes et en donner la complexité en nombre de
comparaisons de caractères.
Q2. Le schéma ci-dessous représente l’arbre lexicographique des suffixes du mot abracadabra. Que représente
les entiers qui se trouvent dans les feuilles ?
l’arbre des suffixes de
ca

abracadabra da
br
da

a$ ra
bra

$ a
br
a
$

4 6
cadab

cadab
cadabra$
da
a

$
br
br

$
a$

ra$

a$ r

10 3 5 8 1 9 2
cadab
$
a$ r

7 0

Q3. Donner la séquence d’entiers obtenue par un parcours en profondeur dans l’ordre postfixe, du trie précédent
et en notant les entiers qui se trouvent sur les feuilles. Même question avec un parcours infixe et un parcours préfixe.
Q4. En déduire une méthode pour obtenir la table des suffixes à partir de l’arbre des suffixes.
Q5. On suppose avoir un algorithme qui construit l’arbre des suffixes en temps linéaire par rapport à la taille
du texte initial. Quel est alors le coût total de la construction de la table des suffixes en fonction de la taille du
texte ?

Dans la suite, nous allons étudier et implémenter un algorithme judicieux et efficace qui calcule la table des
suffixes d’un texte directement sans passer par le calcul de l’arbre des suffixes. On appelle n la taille du texte.
Les indices du texte forment donc l’ensemble T = {0, . . . , n – 1}. Pour k ∈ {0, 1, 2}, on définit Tk l’ensemble des
indices du texte (i.e. les éléments de T) qui sont égaux à k modulo 3 :
— T0 est l’ensemble des indices dans T qui sont multiples de 3.
— T1 est l’ensemble des indices dans T qui sont les successeurs des éléments de T0 .
— T2 est l’ensemble des indices dans T qui sont les successeurs des éléments de T1 .

1
La structure globale de l’algorithme est le suivant :
1. Trier récurisvement les suffixes qui sont dans T1 ∪ T2 (i.e. dont l’indice de début est dans T1 ∪ T2 ).
2. A l’aide de l’information précédente, trier efficacement les sufffixes qui sont dans T0 (i.e. dont l’indices de
début est dans T0 )..
3. Fusionner les deux listes triées précédentes de suffixes (T0 et T1 ∪ T2 ) pour obtenir la table des suffixes.
On appellera C(n) le coût de l’algorithme sur une donnée de taille n.
Q6. Pour la première étape on commence par considérer deux nouvelles chaînes de caractères de taille n, en
supprimant le premier caractère (respectivement les deux premiers caractères) du texte$ et en complétant par un
caractère de contrôle $ (respectivement par $$) :
0 1 2 3 4 5 6 7 8 9 10 11
texte$ a b r a c a d a b r a $
b r a c a d a b r a $ $
r a c a d a b r a $ $ $
Puis, on concatène ces deux nouvelles chaînes de caractères ensemble, pour obtenir une nouvelle chaine de
caractères que l’on appellera nouv :
nouv b r a c a d a b r a $ $ r a c a d a b r a $ $ $
1. Justifier que les suffixes du nouv qui commencent dans la première moitié et qui sont dans T1 et ceux qui
commencent dans la deuxième moitié et qui son dans T2 sont ordonnés lexicographiquement de la même
manière que les suffixes correspondant dans texte.
2. Justifier pourquoi il n’est pas raisonnable de lancer réccursivement le calcul de la table des suffixes de nouv ?
Q7. Nous allons décomposer nouv par bloc de 3 lettres et considérer nouv comme un mot sur l’alphabet des
blocs de 3 :
0 1 2 3 4 5 6 7
nouv bra cad abr a$$ rac ada bra $$$
On commence par trier dans l’ordre lexicographique les blocs de longueur 3, avec l’algorithme du tri radix qui
s’effectue en temps et en espace linéaire. Une fois triés dans l’ordre lexicographique, on obtient :

0 : $$$, 1 : a$$, 2 : abr, 3 : ada, 4 : bra, 4 : bra, 5 : cad, 6 : rac.

On remplace ensuite dans nouv, chaque bloc de longueur 3 par son rang dans l’ordre précédent et obtient ainsi
un tableau temp :
0 1 2 3 4 5 6 7
temp 4 5 2 1 6 3 4 0

On calcule ensuite réccursivement la table des suffixes de temp :


0 1 2 3 4 5 6 7
TStemp 7 3 2 5 6 0 1 4

1. Quelle est la taille de tem en fonction de la taille du texte ?


2. Est–il raisonnable de lancer réccursivement le calcul de la table des suffixes sur temp ?
La table TStemp nous fournit l’ordre des suffixes du texte qui sont dans T1 ou dans T2 :
On se souvient du codage : $$$ → 0, a$$ → 1, abr → 2, ada → 3, bra → 4, cad → 5, rac → 6.

0 45216340 1 bracadabra$$abracadabra$$$
1 5216340 4 cadabra$$abracadabra$$$
2 216340 7 abra$$abracadabra$$$
3 16340 10 a$$abracadabra$$$
4 6340 2 racadabra$$$
5 340 5 adabra$$$
6 40 8 bra$$$
7 0 11 $$$

2
0 7 $$$ 11
16340 3 a$$abracadabra$$$ 10
216340 2 abra$$abracadabra$$$ 7
340 5 adabra$$$ 5
40 6 bra$$$ 8
45216340 0 bracadabra$$abracadabra$$$ 1
5216340 1 cadabra$$abracadabra$$$ 4
6340 4 racadabra$$$ 2

D’où la table TS12 : 11 10 7 5 8 1 4 2


TS12 11 10 7 5 8 1 4 2
a b r a c a d a b r a $
3. Quelle est la complexité totale de cette étape en fonction de la taille n du texte ?
Q8. On souhaite maintenant construire la table des suffixes du texte débutants aux positions multiples de 3.
i% 3 = 0 texte[i :] = texte[i]texte[i + 1 :]
0 abracadabra$ = a texte[1 :]
3 acadabra$ = a texte[4 :]
6 dabra = d texte[7 :]
9 ra = r texte[10 :]

En remarquant que grâce à l’étape précédente, on connaît l’ordre des {texte[i + 1 :] : i%3 = 0} :
TS12 11 10 7 8 1 4 2
montrer qu’on peut construire la table TS0 , avec un tri radix à deux passes. Ecrire le pseudo-code de l’algorithme
qui réalise l’étape. Donner la complexité de cette étape en fonction de la taille n du texte.
Q9. On souhaite ici fusionner les tables TS0 et TS12 pour obtenir la table de suffixes TS du texte.
On observe que pour faire cette fusion, on compare toujours un suffixe débutant à un indice multiple de 3 avec
un suffixe débutant à un indice qui n’est pas multiple de 3, i.e. un indice dont le reste dans la division par 3 est 1
ou 2.
1. En remarquent que texte[3i :] = texte[3i]texte[3i + 1 :] et texte[3j + 1 :] = texte[3j + 1]texte[3j +
2 :], montrer qu’on arrive à comparer texte[3i :] et texte[3j + 1 :], grâce à la table inverse de TS12
(appelée ITS12 ).
2. Comment doit-on procéder pour comparer texte[3i :] et texte[3j + 2 :] ?
3. En déduire une manière efficace de faire la fusion de TS0 et TS12 , en utilisant la table inverse ITS12 .
4. Donner la complexité de cette fusion en fonction de la taille n du texte.
Q10. On rappelle que n est la taille du texte. On souhaite évaluer le coût total C(n) de l’algorithme :

1. Pour chacune des opérations effectuées (et listées ci-dessous) , donner la complexité asymptotique en fonction
de n.
— Tri des suffixes pour les positions non multiples de 3
— Extraire les facteurs texte[i : i + 3] avec i%3 6= 0
— Tri des facteurs (un tri radix à 3 passes)
— Renommage des facteurs
— Construction de nouv
— Appel récursif sur nouv
— Tri des suffixes pour les positions multiples de 3 tri radix en deux passes
— Fusion des deux tables
2. En déduire une équation de récurrence vérifiée par C(n).
3. Déduire de l’équation précédente une évaluation asymptotique de C(n).

Exercice II

(a) Écrire un algorithme naïf qui à partir d’un texte construit l’arbre des suffixe du texte.
(b) Donner la complexité de votre algorithme.

Vous aimerez peut-être aussi