Version interactive avec LaTeX compilé
SESSION 2003
Filière MP (groupes MPI/MI)
Épreuve commune aux ENS de Paris et Cachan
Filière MP (groupe I)
Épreuve commune aux ENS de Paris, Lyon et Cachan
Épreuve commune aux ENS de Paris, Lyon et Cachan
Filière PC (groupe I)
Épreuve commune aux ENS de Paris et Lyon
INFORMATIQUE
Durée : 4 heures
L'usage de calculatrices électroniques de poche à alimentation autonome, non imprimantes et sans document d'accompagnement, est autorisé. Cependant, une seule calculatrice à la fois est admise sur la table ou le poste de travail, et aucun échange n'est autorisé entre les candidats.
m
m
Préambule
Le sujet comporte 4 parties.
La partie 1 introduit différents problèmes d'algorithmique sur les mots et étudie la complexité des algorithmes naïfs.
La partie 1 introduit différents problèmes d'algorithmique sur les mots et étudie la complexité des algorithmes naïfs.
La partie 2 propose un algorithme optimal pour le problème de la recherche de motifs.
La partie 3 introduit une structure de données importante dans de nombreux problèmes d'algorithmique des mots, l'arbre des suffixes, et montre comment le calculer en temps linéaire en la taille de l'entrée.
La partie 3 introduit une structure de données importante dans de nombreux problèmes d'algorithmique des mots, l'arbre des suffixes, et montre comment le calculer en temps linéaire en la taille de l'entrée.
La partie 4 est destinée à l'étude de quelques applications de l'arbre des suffixes.
Les parties 1, 2, 3 sont indépendantes. La partie 4 dépend de la partie 3, mais peut être traitée indépendamment en admettant les résultats qui y sont établis.
Les parties 1, 2, 3 sont indépendantes. La partie 4 dépend de la partie 3, mais peut être traitée indépendamment en admettant les résultats qui y sont établis.
Le soin apporté à la rédaction et à la présentation sera apprécié par les correcteurs.
A. Notations et primitives de manipulation des mots. Dans tout le problème, est un alphabet fini, de cardinal
fixé. On supposera que la comparaison de deux éléments de
(caractères) s'effectue en temps constant. La i-ème lettre d'un mot
sera notée
. Le sous-mot constitué des caractères d'indice
sera noté
. On conviendra que
est le mot vide si
. La longueur d'un mot
sera notée
. La concaténation de deux mots u et
sera notée u.v; il s'agit du mot
de longueur
tel que
si
sinon.
A. Notations et primitives de manipulation des mots. Dans tout le problème,
On supposera que toutes ces primitives de manipulation des mots peuvent être effectuées en temps constant.
Si les entrées d'un problème ont pour taille
, on supposera que toutes les opérations arithmétiques (addition, soustraction, multiplication, comparaison) sur des entiers inférieurs à
se font en temps 1 .
B. Avertissement. Cette épreuve est une épreuve d'informatique. À ce titre, la résolution des questions d'algorithmique du sujet sera prise en compte de façon importante dans l'évaluation de la copie. On attire tout particulièrement l'attention des candidats sur le fait que dans l'écriture d'algorithmes sur les mots, il convient d'être attentifs aux dépassements d'indice; c'est-à-dire que si est un mot de taille
, il n'est pas licite d'appeler
pour
ou
au cours d'un algorithme.
B. Avertissement. Cette épreuve est une épreuve d'informatique. À ce titre, la résolution des questions d'algorithmique du sujet sera prise en compte de façon importante dans l'évaluation de la copie. On attire tout particulièrement l'attention des candidats sur le fait que dans l'écriture d'algorithmes sur les mots, il convient d'être attentifs aux dépassements d'indice; c'est-à-dire que si
Sauf mention expresse du contraire, on ne demande pas de justifier formellement les algorithmes écrits.
Outre les structures de contrôle habituelles, les structures de données du programme et les primitives les manipulant, les candidats pourront utiliser dans l'écriture de leurs algorithmes les primitives définies au paragraphe
.
1. Quelques problèmes D'Algorithmique des mots
- Écrire un algorithme COMPARE_SOUS_CHAÎNE
qui prend en argument deux mots de et trois entiers positifs ou nuls, et qui renvoie faux si ou , vrai sinon. Quelle en est la complexité?
Recherche de motifs. Soit
un mot fixé de longueur
(le motif), et
de longueur
(le texte). Le problème de la recherche du motif
dans le texte
consiste à trouver l'ensemble
des indices
tels que
. Dans les algorithmes, cet ensemble pourra être représenté comme une liste sans répétitions.
2. Montrer que l'ensemble des mots tels que card
est un langage rationnel. L'ensemble des mots
tels que
est-il un langage rationnel?
3. Écrire un algorithme prenant en entrée les deux mots et
et résolvant le problème de la recherche de motifs en temps
.
Plus longue sous-chaîne commune. Soient et
deux mots de
de longueurs respectives
et
.
2. Montrer que l'ensemble des mots
3. Écrire un algorithme prenant en entrée les deux mots
Plus longue sous-chaîne commune. Soient
Une sous-chaîne commune est un mot
de
de longueur
tel qu'il existe
et
avec
.
Une plus longue sous-chaîne commune est une sous-chaîne commune de longueur maximale.
4. Proposer un algorithme de complexité trouvant une plus longue sous-chaîne commune de deux mots
et
.
Répétitions maximales. Soit un mot de
de longueur
. Un triplet de répétition de s est un triplet (
) tel que
et
.
4. Proposer un algorithme de complexité
Répétitions maximales. Soit
Un triplet de répétition
est dit maximal si ni
, ni
ne sont des triplets de répétition. On dit alors que
est une répétition maximale.
5. Proposer un algorithme calculant toutes les répétitions maximales d'un mot . Quelle est sa complexité? On pourra, cette fois, représenter l'ensemble des répétitions comme une liste pouvant contenir plusieurs fois le même élément. Comment détecter les répétitions intervenant plusieurs fois dans la liste?
5. Proposer un algorithme calculant toutes les répétitions maximales d'un mot
2. Algorithme avancé pour la recherche de motifs
Pour tout élément
de
, on appelera préfixe de
un mot
de longueur au plus
tel que
. Soit
un mot de longueur
. Pour
, on note
la longueur du plus long préfixe de s[i..n] qui est aussi un préfixe de s. On pose
on note
le plus petit indice atteignant le maximum. Si
pour tout
, on pose
.
Le mot
est donc le préfixe de
commençant à gauche de
et se terminant le plus à droite possible.
- Calculer les
pour . - On suppose
. Soit le plus petit entier tel que . Exprimer en fonction de . On pourra distinguer le cas et le cas . - Soit
un entier. On suppose que .
a. Montrer que.
b. En déduire que si, alors , .
c. Dans le cas contraire, soit. Exprimer et en fonction de et de . - Déduire de 2. et 3. un algorithme calculant les
et effectuant comparaisons de caractères. - Soit
. En considérant , montrer que l'on peut trouver un algorithme trouvant le motif dans le texte en temps .
3. Arbre des suffixes
On définit un type de données arbre étiqueté comme étant un triplet formé de deux entiers et d'une liste d'arbres étiquetés. Une feuille est un arbre étiqueté pour lequel la liste est vide; la liste vide sera notée []. L'ajout d'un élément
en tête d'une liste
sera noté
.
On supposera données les fonctions :
Intuitivement, les deux entiers
associés à un noeud de l'arbre correspondent au mot
. Ce mot sera appelé l'étiquette du nœud.
L'étiquette depuis la racine d'un nœud est l'étiquette du chemin qui mène de la racine à ce nœud, ce dernier non compris dans le chemin. En particulier, l'étiquette depuis la racine de la racine elle-même est
.
On dira qu'il existe un chemin d'étiquette
dans l'arbre s'il existe un noeud
,
) tel que l'étiquette
de
depuis la racine soit un préfixe de
, et que
soit un préfixe de
. On dira que le chemin d'étiquette
se termine en position
du nœud
si
. Dans le cas particulier
, on dira le chemin d'étiquette
se termine en position 0 de la racine.
On suppose donnée une fonction trouve qui prend en argument un arbre étiqueté, un mot
de
et deux entiers
et
, et renvoie un triplet (
) constitué d'un nœud interne
, d'un booléen
et d'un entier
tels que
-
faux s'il existe un chemin issu de la racine d'étiquette ; dans ce cas, ce chemin se termine en position du nœud . -
vrai sinon; dans ce cas, s'il existe un chemin issu de la racine d'étiquette , le chemin se termine en position du nœud . Sinon, et .
Dans le cas où plusieurs chemins conviennent, on supposera que trouve détecte l'un quelconque d'entre eux. On établira à la question 3 que ce n'est jamais le cas dans ce problème.
La complexité de la fonction trouve sera supposée proportionnelle au nombre de nœuds se trouvant sur le chemin.
On suppose enfin que le fait de modifier un nœud interne
d'un arbre
en
modifie également l'arbre
en remplaçant dans ce dernier
par
.
On donne alors les deux fonctions suivantes:
. Si flag alors si
alors fils
fils
sinon fils
, fin
, fils
$\operatorname{fin}(B) \leftarrow z$.
finsi
finsi.
Arbre_suffixe(s) =
Pour de 2 à
faire
Pour de 1 à
faire
ajoute
finpour.
finpour.
Renvoyer .
Pour
Pour
ajoute
finpour.
finpour.
Renvoyer
- Que vaut Arbre_suffixe(mississipi)? On pourra donner les arbres sous forme de représentation arborescente usuelle.
- Montrer que pour
, avant l'appel à ajoute( ) il existe dans un chemin d'étiquette . - Montrer que les arbres successifs construits par les appels à ajoute vérifient :
siest un nœud interne de , alors pour tout . En déduire que pour tout mot , il existe au plus un nœud interne d'étiquette depuis la racine tel que est un préfixe de et est un préfixe de e.s[debut ..fin ]. - Montrer que la fonction Arbre_suffixe effectue
opérations.
Dans la fonction Arbre_suffixe, on dira qu'on est au stade
de l'étape
si
et
. Dans la fonction ajoute, on dira qu'on est dans le cas 2 si flag vaut vrai; qu'on est dans le cas 1 s'il est faux, que fils
et
; qu'on est dans le cas 3 sinon.
5. Montrer que si l'on est dans le cas 1 au stade de l'étape
, alors on sera dans le cas 1 au stade
de toutes les étapes ultérieures.
6. Montrer que si on est dans le cas 3 au stade de l'étape
, alors on sera dans le cas 3 dans les stades ultérieurs de l'étape
.
7. Comment modifier Arbre_suffixe pour qu'il effectue seulement itérations?
5. Montrer que si l'on est dans le cas 1 au stade
6. Montrer que si on est dans le cas 3 au stade
7. Comment modifier Arbre_suffixe pour qu'il effectue seulement
L'objectif est maintenant de modifier la structure de données pour permettre à la fonction trouve de s'exécuter en temps constant.
8. On suppose qu'on est dans le cas 2 au stade de l'étape
, résultant en la création d'un nœud interne d'étiquette depuis la racine
. Montrer qu'au plus tard à la fin du stade
il existe un nœud interne d'étiquette depuis la racine
.
8. On suppose qu'on est dans le cas 2 au stade
On modifie la définition d'un arbre, en ajoutant un champ supplémentaire contenant un arbre; ce champ est utilisé pour stocker un lien suffixe : le nœud
, dont l'étiquette depuis la racine est
a un lien suffixe vers l'éventuel nœud
d'étiquette depuis la racine
.
Étant donné un nœud
, on note
le nombre de nœuds sur le chemin menant de la racine à
.
9. Montrer que s'il existe un lien suffixe allant d'un nœud à un nœud
, alors
.
10. Expliquer comment on peut modifier Arbre_suffixe pour qu'il opère en opérations. On pourra construire et utiliser les liens suffixes pour passer d'un chemin d'étiquette
à un chemin d'étiquette
. On pourra en outre rajouter dans la structure d'arbre étiqueté un arbre permettant de remonter d'un nœud interne à son père.
11. Soit . Montrer que l'arbre associé au mot
a exactement
feuilles correspondant aux
suffixes de
et à #.
9. Montrer que s'il existe un lien suffixe allant d'un nœud
10. Expliquer comment on peut modifier Arbre_suffixe pour qu'il opère en
11. Soit
Cet arbre est l'arbre des suffixes du mot
.
4. Applications de l'arbre des suffixes
- Comment utiliser l'arbre des suffixes pour obtenir la liste des suffixes d'un mot
triés par ordre lexicographique en temps linéaire? - Soit
un mot de longueur . Montrer que le calcul d'un arbre de suffixes de permet ensuite de trouver les occurrences d'un mot dans en temps . Comparer avec la méthode de la partie 2. - Montrer que si (
) est un triplet de répétition maximal alors est l'étiquette depuis la racine de deux nœuds distincts de l'arbre des suffixes.
En déduire qu'il y a au plus
répétitions maximales dans
.
4. Montrer que l'arbre des suffixes permet de déterminer l'ensemble des répétitions maximales en temps linéaire.
5. Expliquer comment une structure de données généralisant l'arbre des suffixes permet de résoudre le problème de la plus longue sous-chaîne commune en temps linéaire.
4. Montrer que l'arbre des suffixes permet de déterminer l'ensemble des répétitions maximales en temps linéaire.
5. Expliquer comment une structure de données généralisant l'arbre des suffixes permet de résoudre le problème de la plus longue sous-chaîne commune en temps linéaire.
