ENS Informatique MP PC 2005Sujet
Pas encore noté
Téléchargements
- Corrigé : pas encore disponible
- Rapport du jury : non disponible
Ces sujets peuvent vous intéresser
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.
Filière MP (groupes MPI et I)
Épreuve commune aux ENS de Paris, Lyon et Cachan
INFORMATIQUE
Durée : 4 heures
L'usage de calculatrice est interdit
On étudie dans ce problème l'ordre lexicographique pour les mots sur un alphabet fini et plusieurs constructions des cycles de De Bruijn. Les trois parties sont largement indépendantes.
Définitions
- Dans tout le problème,
A est un alphabet fini, de cardinalk , muni d'une relation d'ordre total notée≺ . Pour simplifier les notations, on identifieraA au sous-ensemble{0, 1, …, k − 1} des entiers naturels, et≺ à l'ordre naturel sur les entiers. On appelle lettres les éléments deA . -
A^+ est l'ensemble des mots non vides sur l'alphabetA . La longueur d'un mots ∈ A^+ est notée|s| . On notes[i], 1 ≤ i ≤ |s| , lai -ème lettre du mots , appelée aussi la lettre en positioni . Le sous-mots[i..j] des, 1 ≤ i ≤ j ≤ |s| , est le mot composé des lettres des en position allant dei àj . Les préfixes du mots sont les sous-motss[1..j] pour1 ≤ j < |s| et ses suffixes sont les sous-motss[i..|s|] pour1 < i ≤ |s| (noter qu'on ne considère pas le mot lui-même comme son propre préfixe, ni comme son propre suffixe). - La concaténation de deux mots
s ett deA^+ est notées ⋅ t . C'est le motu de longueur|s| + |t| tel queu[i] = s[i] si1 ≤ i ≤ |s| etu[i] = t[i − |s|] si|s| + 1 ≤ i ≤ |s| + |t| . On notes^i le mot obtenu en concaténanti fois le mots avec lui-même (formellement,s^1 = s ets^i = s ⋅ s^(i − 1) pouri ≥ 2 ).
- On note
≤ _(lex) l'ordre lexicographique surA^+ , appelé aussi ordre du dictionnaire, et défini comme suit. Soients ett deux mots deA^+ . On notes < _(lex)t si :
− s[1]≺t[1] - ou
∃k, 2 ≤ k ≤ min(|s|, |t|) , tel ques[i] = t[i] pour1 ≤ i < k ets[k]≺t[k] - ou
|s| < |t| ets[i] = t[i] pour1 ≤ i ≤ |s|
Alors
s ≤ _(lex)t si
s = t ou
s < _(lex)t .
Structures de données
- Pour représenter un mot
s ∈ A^+ , on utilisera un tableau d'entiers de taille|s| + 1 , indexé de 0 à|s| : l'élément d'indice 0 sera égal à|s| et l'élément d'indicei sera égal às[i] pour1 ≤ i ≤ |s| . - Par ailleurs, on utilisera des listes d'entiers qu'on manipulera à l'aide des primitives suivantes. On note NIL la liste vide. Si
Q est non vide (Q ≠ NIL), la primitive tête(Q) renvoie le premier élément de la liste et la primitive queue(Q) renvoie la liste constituée des éléments suivants. La primitive ajoute-fin(Q, i) ajoute l'entieri à la fin de la listeQ . SiQ etQ^′ sont deux listes, la primitive concat(Q, Q^′) construit une liste composée des éléments deQ , suivis des éléments deQ^′ . - Enfin, une liste est triée si ses éléments sont rangés par ordre croissant (au sens large).
Algorithmes et pseudo-programmes
- Pour les questions qui demandent la conception d'un algorithme : il s'agit de décrire en français, de façon concise mais précise, les idées essentielles de votre réponse.
- Pour les questions qui demandent l'écriture d'un pseudo-programme : il s'agit d'exprimer votre algorithme dans un langage de votre choix, avec les structures de données (tableaux ou listes) décrites ci-avant, et les structures de contrôle (boucles, conditionnelles, ...) classiques.
- Le coût d'un algorithme ou d'un pseudo-programme est le nombre d'opérations élémentaires qu'il effectue. Une opération élémentaire est une comparaison ou un test d'égalité entre deux lettres, un appel à l'une des primitives précédentes sur les listes d'entiers, un accès en lecture ou en écriture à une case de tableau, un incrément de compteur de boucle.
- Le coût d'un algorithme ou d'un pseudo-programme ne sera pas calculé exactement mais seulement estimé en ordre de grandeur, avec des expressions du type
O(m + n), O(m^2 logn) , etc, oùm, n, … sont des paramètres en entrée de l'algorithme. Bien sûr, on s'attachera à concevoir des algorithmes et des pseudo-programmes de coût le plus faible possible.
Partie 1. Tri par paquets et ordre lexicographique
Dans cette partie, on considère
n mots
s_1, s_2, …, s_n de
A^+ . On pose
ℓ_(max) = max_(1 ≤ i ≤ n)|s_i| et
M = ∑_(i = 1)^n|s_i| (
M est la taille des données). On veut trier ces
n mots selon l'ordre lexicographique : on cherche une permutation
σ de
{1, 2, …, n} telle que
s_(σ(i)) ≤ _(lex)s_(σ(i + 1)) pour
1 ≤ i < n . On utilise un tableau tab de tableaux d'entiers : tab
[i] représente le mot
s_i . La permutation
σ est représentée par un tableau d'entiers SIG de taille
n , indexé de 1 à
n .
Question 1.1.
- Écrire un pseudo-programme compare qui compare deux mots
s ett deA^+ pour l'ordre lexicographique≤ _(lex) . Quel est son coût en fonction de|s| et|t| ? - Proposer un algorithme de tri des
n mots (calcul du tableau SIG) basé sur le pseudo-programme compare, et donner son coût dans le pire cas en fonction den etℓ_(max) .
$Q \leftarrow$ NIL
pour $i$ croissant de 1 à $n$ faire
ajoute-fin $(Q, i)$
fin pour
pour $j$ décroissant de $\ell$ à 1 faire
pour $p$ croissant de 0 à $k-1$ faire
$P[p] \leftarrow$ NIL
fin pour
tant que ( $Q \neq$ NIL) faire
$i \leftarrow$ tête $(Q)$
$Q \leftarrow$ queue $(Q)$
ajoute-fin $(P[\operatorname{tab}[i][j]], i)$
fin tant que
pour $p$ croissant de 0 à $k-1$ faire
$Q \leftarrow \operatorname{concat}(Q, P[p])$
fin pour
fin pour
pour $i$ croissant de 1 à $n$ faire
$\operatorname{SIG}[i] \leftarrow$ tête $(Q)$
$Q \leftarrow$ queue $(Q)$
fin pour
Algorithme TriPaquets1
$Q \leftarrow$ NIL
pour $p$ croissant de 0 à $k-1$ faire
$P[p] \leftarrow$ NIL
fin pour
pour $j$ décroissant de $\ell_{\max }$ à 1 faire
$Q \leftarrow \operatorname{concat}$ (Longueur $[j], Q$ )
tant que ( $Q \neq$ NIL) faire
$i \leftarrow$ tête $(Q)$
$Q \leftarrow$ queue $(Q)$
ajoute-fin $(P[\operatorname{tab}[i][j]], i)$
fin tant que
tant que (Présent $[j] \neq$ NIL) faire
$p \leftarrow$ tête $($ Présent $[j])$
Présent $[j] \leftarrow$ queue(Présent $[j]$ )
$Q \leftarrow \operatorname{concat}(Q, P[p])$
$P[p] \leftarrow$ NIL
fin tant que
fin pour
pour $i$ croissant de 1 à $n$ faire
$\operatorname{SIG}[i] \leftarrow$ tête $(Q)$
$Q \leftarrow$ queue $(Q)$
fin pour
Algorithme TriPaquets2
Question 1.2.
Dans cette question, on suppose que les
n mots ont la même longueur
ℓ : |s_i| = ℓ pour
1 ≤ i ≤ n (et donc
M = nℓ ). Le principe de l'algorithme TriPaquets1 décrit à la Figure 1 est le suivant. Il y a
ℓ étapes, une pour chaque position des lettres dans les mots. On prépare
k paquets
P[0], P[1], …, P[k − 1] (un paquet par lettre), réinitialisés à chaque étape. À chaque étape
j , les indices
i des mots
s_i ayant la lettre
p en position
j sont rangés dans le paquet
P[p] . Les paquets
P[p] et
Q sont des listes d'entiers.
- Exécuter l'algorithme TriPaquets1 sur l'exemple suivant :
n = 5, ℓ = 3, s_1 = 210, s_2 = 100 ,s_3 = 112, s_4 = 102 , ets_5 = 110 . - Montrer que le coût de l'algorithme TriPaquets1 est en
O((k + n)ℓ) . - Quelle propriété vérifie
Q à la fin de la première itération de la boucle surj (c'est-à-dire lorsquej = ℓ )? - Même question à la fin de la
j -ème itération de cette boucle? Conclusion? - Pourquoi l'algorithme TriPaquets1 procède-t-il à partir de la dernière lettre des mots et non pas de la première?
Question 1.3.
On suppose maintenant que les
n mots ont des longueurs arbitraires.
- Expliquer comment se ramener au cas de
n mots de longueurℓ_(max) pour utiliser l'algorithme TriPaquets1. Quel est le coût? - On va améliorer l'algorithme TriPaquets1; on procède en trois étapes:
Étape 1 : On prépare
ℓ_(max) listes triées Présent
[j] : pour
1 ≤ j ≤ ℓ_(max) , Présent
[j] est la liste triée des lettres qui apparaissent en position
j dans l'un au moins des
n mots.
Étape 2 : On prépareℓ_(max) listes Longueur
[j] : pour
1 ≤ j ≤ ℓ_(max) , Longueur
[j] est la liste des indices des mots de longueur
j .
Étape 3 : On utilise l'algorithme TriPaquets2 de la Figure 1.
(a) Exécuter les trois étapes pour l'exemple suivant :k = 3, n = 4, s_1 = 21, s_2 = 0, s_3 = 012 et
s_4 = 101( donc
ℓ_(max) = 3) .
(b) Proposer un algorithme pour préparer les listes de l'étape 1 avec un coûtO(k + M) . (Indication : utiliser les idées de l'algorithme TriPaquets1.)
(c) Quel est le coût de la préparation des listes de l'étape 2 ?
(d) Montrer que cet algorithme en trois étapes calcule SIG correctement.
(e) Montrer que le coût total est enO(k + M) .
Étape 2 : On prépare
Étape 3 : On utilise l'algorithme TriPaquets2 de la Figure 1.
(a) Exécuter les trois étapes pour l'exemple suivant :
(b) Proposer un algorithme pour préparer les listes de l'étape 1 avec un coût
(c) Quel est le coût de la préparation des listes de l'étape 2 ?
(d) Montrer que cet algorithme en trois étapes calcule SIG correctement.
(e) Montrer que le coût total est en
Partie 2. Cycles de De Bruijn
Un cycle de De Bruijn d'ordre
n sur l'alphabet
A est un mot
s ∈ A^+ de longueur
|s| = k^n tel que tout mot de
A^+ de longueur
n est un sous-mot de
s ⋅ s[1..(n − 1)] (ce qui revient à considérer
s de façon cyclique). On note
DB(n) l'ensemble de ces cycles. Par exemple :
- si
k = 2, u_2 = 0011 ∈ DB(2) etu_3 = 00011101 ∈ DB(3) - si
k = 3, v_2 = 002212011 ∈ DB(2) etv_3 = 000222122021121020120011101 ∈ DB(3) .
On va montrer l'existence de cycles de De Bruijn pour tout
n et tout
k .
Question 2.1.
- Dans un mot de
DB(n) , combien de fois apparaît chaque lettre de l'alphabetA ? - Proposer un algorithme qui vérifie si un mot est un élément de
DB(n) . Quel est son coût (en fonction dek et den) ? Peut-on diminuer le coût en augmentant l'espace mémoire utilisé? - Que peut-on dire du mot infini
m = 00110212203132330414243440515253545506… construit par récurrence? (Indication : s'intéresser au casn = 2 .)
Question 2.2.
Soient
n et
k fixés. On construit le mot
s de taille maximale comme suit :
− s[1] = s[2] = … = s[n] = 0
- pour
i ≥ n, s[i + 1] est la plus grande lettre deA , si elle existe, telle ques[i − n + 2..i + 1] (de longueurn ) n'est pas un sous-mot des[1..i] .
- Écrire un pseudo-programme suivant qui calcule (si c'est possible)
s[i + 1] à partir des[1..i] pouri ≥ n . Quel serait le coût d'un pseudo-programme pour tout le calcul du mots (en fonction dek, n et|s|) ? - On va montrer que
|s| = k^n + n − 1 et ques[1..k^n] ∈ DB(n) (les motsu_2, u_3, v_2 etv_3 ont été construits de cette façon).
(a) Soitz le suffixe des de taillen − 1 . Montrer que pour toute lettrea deA, a ⋅ z est un sous-mot des . En déduire quez = 0^(n − 1) (c'est-à-dire ques se termine parn − 1 zéros).
(b) Montrer que tous les mots deA^+ de longueurn qui finissent parn − r zéros apparaissent danss , pour toutr ≥ 1 . Conclure.
Partie 3. Colliers, primaires et cycles
On définit sur
A^+ la relation d'équivalence suivante (décalage circulaire) :
Un collier est un mot inférieur ou égal (pour
≤ _(lex) ) à chacun des mots de sa classe d'équivalence. On note
C^+ l'ensemble des colliers :
s ∈ C^+ ⇔ s ∈ A^+ et
s ≤ _(lex)t pour tout
t ∈ A^+, s ∼ t . On dit qu'un mot
s ∈ A^+ est périodique si
s peut s'écrire
s = t^p , avec
t ∈ A^+ et
p ≥ 2 . Un primaire est un collier qui n'est pas périodique. On note
L^+ l'ensemble des primaires (l'usage du
L est en référence à Lyndon qui a étudié les propriétés de ces mots). Enfin, pour
n ≥ 1 , on note
C_n (resp.
L_n ) le nombre de colliers (resp. de primaires) de longueur
n .
Question 3.1.
- Vérifier que si
s ∈ A^+ est périodique ett ∼ s , alorst est périodique. - Pour
n = 4 etk = 2 , donner tous les mots deL^+ de longueur inférieure ou égale àn . Même question pourn = 3 etk = 3 . - Pour les deux exemples précédents, que peut-on dire du mot obtenu en énumérant dans l'ordre lexicographique, et en les concaténant, tous les mots de
L^+ dont la longueur divisen ?
Question 3.2.
Soit
s ∈ A^+ s'écrivant
s = x ⋅ y = y ⋅ x , où
x, y ∈ A^+ . On va montrer que
s est périodique.
- Soit
n = |s| etm = |x| . Montrer ques[i] = s[i + m] pour1 ≤ i ≤ n − m ets[i] = s[i + m − n] pourn − m + 1 ≤ i ≤ n (s est donc inchangé par décalage circulaire dem positions). - Soit
d = PGCD(m, n) etz = s[1..d] . Montrer ques = z^(n/d) . (Indication : considérer les décalages circulaires de jm positions.)
Question 3.3.
- Montrer que tout mot
s ∈ A^+ peut s'écrire de manière uniques = t^p avect ∈ A^+ non périodique etp ≥ 1 . - Écrire un pseudo-programme racine qui, étant donné
s ∈ A^+ , calcule le mott non périodique tel ques = t^p . Quel est son coût en fonction de|s| ? - Montrer que tout collier
s ∈ C^+ peut s'écrires = t^p avect ∈ L^+ etp ≥ 1 . Montrer queC_n = ∑_(d|n)L_d (la somme porte sur les diviseurs positifs den ). - Que vaut la somme
∑_(d|n)dL_d ?
Question 3.4.
- Soit
s ∈ A^+ . Montrer l'équivalence des trois propriétés suivantes:
(i)s ∈ L^+ .
(ii)s est inférieur à tous ses décalages cycliques :s = u ⋅ v avecu, v ∈ A^+ ⇒ u ⋅ v < _(lex)v ⋅ u .
(iii)s est inférieur à tous ses suffixes :s = u ⋅ v avecu, v ∈ A^+ ⇒ s < _(lex)v . - Factorisation en mots primaires:
(a) Soitu, v ∈ L^+ avecu < _(lex)v . Montrer queu ⋅ v ∈ L^+ .
(b) Montrer que tout mots ∈ A^+ peut s'écrire sous la formes = p_1 ⋅ p_2⋯p_m , oùp_i ∈ L^+(1 ≤ i ≤ m) etp_m ≤ _(lex)… ≤ _(lex)p_2 ≤ _(lex)p_1 .
(c) Montrer que dans la factorisation précédente,p_m est plus petit (pour l'ordre≤ _(lex) ) que tout suffixe des . En déduire l'unicité de cette factorisation.
(d) Montrer enfin que sis ∉ L^+ , alorsp_1 est le plus long préfixe des appartenant àL^+ .
Question 3.5.
Un préprimaire est un mot de
A^+ qui est soit préfixe d'un primaire, soit un mot dont toutes les lettres sont égales à (
k − 1 ). On note
P^+ l'ensemble des préprimaires. La
n -extension d'un mot
s ∈ A^+ est le mot de taille
n obtenu en répétant
s suffisamment de fois et en gardant les
n premières lettres (formellement, c'est le préfixe de taille
n de
s^i où
i|s| ≥ n ).
- Soit
p ∈ L^+ . Montrer quep^m ∈ P^+ pour toutm ≥ 1 . - (Difficile.) Soit
s ∈ L^+ ett un préfixe des . Soita une lettre deA etu = t ⋅ a . Montrer que sis < _(lex)u alorsu ∈ L^+ . - Soit
s ∈ P^+ etp_1 le premier primaire dans la factorisation des en mots primaires. Montrer ques est la|s| -extension dep_1 . - Montrer que
s ∈ P^+ si et seulement sis est la|s| -extension d'un motp ∈ L^+ de longueur|p| ≤ |s| . Montrer l'unicité dep . - Soit
s ∈ P^+ etp le primaire donts est la|s| -extension. Montrer ques ∈ L^+ si et seulement sip = s , et ques ∈ C^+ si et seulement si|p| divise|s| .
Question 3.6.
On note
P(n) l'ensemble des préprimaires de longueur
n .
- Soit
s ∈ P(n), s ≠ (k − 1)^n . Déterminer le successeur des dansP(n) , c'est-à-dire le mott ∈ P(n) tel ques < _(lex)t ets < _(lex)u ⇒ t ≤ _(lex)u pour toutu ∈ P(n) . (Indication : incrémenter une lettre des pour obtenirt .) - Écrire un pseudo-programme successeur qui calcule le successeur d'un mot
s ∈ P(n), s ≠ (k − 1)^n . - Donner un algorithme qui énumère dans l'ordre lexicographique, tous les préprimaires de longueur égale à
n . Donner un algorithme qui énumère dans l'ordre lexicographique, tous les primaires dont la longueur divisen . - (Très difficile.) Montrer que si on énumère dans l'ordre lexicographique, en les concaténant, tous les primaires dont la longueur divise
n , on obtient un motz ∈ DB(n) . Montrer quez ≤ _(lex)z^′ pour toutz^′ ∈ DB(n) (ainsiz est le plus petit cycle de De Bruijn pour l'ordre lexicographique).
Pas de description pour le moment
