INFO-0027-1 2009–2010 (2`eme session) — Examen écrit

publicité
INFO-0027-1 2009–2010 (2ème session) — Examen écrit
Université de Liège
Question 1 (30 points). Complexité algorithmique
A. Indiquez s’il est possible de résoudre les problèmes suivants en temps linéaire dans le pire des cas (c-à-d. en
temps O(N ) pour tout problème dont la représentation a une taille N ). Pour chaque tâche, choisir une des deux
réponses suivantes : oui, ou non.
1. Enumérer, de la plus petite à la plus grande, les clefs stockées dans un arbre de recherche binaire.
2. Dans un graphe non-orienté, trouver tous les noeuds accessibles à partir d’un noeud source donné.
3. Dans un graphe orienté, déterminer s’il existe un cycle.
4. Dans un graphe pondéré non-orienté, déterminer l’arbre couvrant minimal (“minimum spanning tree”).
5. Dans un graphe pondéré orienté à pondérations positives (dans R+ ), trouver le chemin le plus court entre
un noeud source et un noeud cible donnés.
6. Dans un graphe pondéré orienté à pondérations réelles (dans R), trouver le chemin le plus court entre un
noeud source et un noeud cible donnés.
7. Rechercher dans une chaı̂ne s la présence d’une sous-chaı̂ne s0 , la taille N du problème étant définie comme
la somme des longueurs de s et s0 .
8. Encoder (compresser) une chaı̂ne s en une chaı̂ne t par l’algorithme de compression LZW, la taille N du
problème étant la longueur de la chaı̂ne d’entrée s.
9. Décoder (décompresser) une chaı̂ne t en une chaı̂ne s par l’algorithme de décompression LZW, la taille N
du problème étant la longueur de la chaı̂ne d’entrée t.
B. Pour chacune des tâches numérotées dans la première liste ci-dessous, indiquer le temps asymptotique
d’exécution qui lui correspond le mieux, parmi ceux de la seconde liste.
Liste de tâches :
1. Rechercher la plus grande clef dans un arbre de recherche binaire (“binary search tree”) à N clefs.
2. Retirer la plus grande clef dans un arbre de recherche binaire (“binary search tree”) à N clefs.
3. Rechercher la plus grande clef dans un arbre rouge-noir (“red-black tree”) à N clefs.
4. Retirer la plus grande clef dans un arbre rouge-noir (“red-black tree”) à N clefs.
5. Déterminer s’il existe un chemin d’un noeud source à un noeud cible donnés, dans un graphe orienté
contenant N noeuds sans restriction supplémentaire sur le nombre d’arcs.
6. Déterminer si deux noeuds appartiennent à la même composante connexe forte (“strong connected component”), dans un graphe orienté contenant N noeuds sans restriction supplémentaire sur le nombre d’arcs.
Pour chaque tâche, choisir la meilleure parmi les dix réponses possibles :
O(1), strict ou amorti ;
O(log N ), strict ou amorti ;
O(N ), strict ou amorti ;
O(N log N ) strict ou amorti.
O(N 2 ) strict ou amorti.
1
Question 2 (20 points). Sélection d’algorithmes
Vous avez été engagé pour concevoir un système de pilotage en temps réel pour un nouvel engin spatial.
Vous avez besoin d’y inclure une Table de Symbole de taille relativement importante (mais que l’on supposera
toujours bornée par la mémoire centrale). Cette table sera utilisée en lecture comme en écriture, pour des accès
arbitraires. Tout ce que l’on vous a demandé, c’est d’en “minimiser le temps d’accès”, sans plus de précision.
A. Si vous pouviez poser une courte question supplémentaire pour compléter ce cahier des charges, quelle
serait-elle ?
B. Pour chaque réponse possible à votre question posée en A., vers quel type de table de symboles vous
orienteriez-vous ?
Question 3 (20 points). Algorithmes de tri
Voici un tableau de caractères à trier par ordre alphabétique :
U N P E T I T T A B L E A U A T R I E R
A. Selon l’algorithme de tri rapide de base (“quicksort” simple), montrez le résultat de la première application
du processus de partition.
Consignes : (1) procéder directement à la partition sans faire de permutation aléatoire initiale ; (2) utiliser le premier élément du tableau comme pivot ; (3) utiliser l’ordre alphabétique croissant pour la fonction de comparaison ;
(4) veillez à bien identifier le(s) sous-tableau(x) éventuel(s) fourni(s) à ou aux appel(s) récursif(s).
B. Montrez comment procéderait l’algorithme de tri par fusion (“mergesort”) récursif pour trier ce tableau.
Pour ce faire, contentez-vous : (1) de construire l’entrée du premier double appel récursif, (2) d’en montrer les
deux sous-tableaux qui en seront retournés, et (3) d’indiquer comment ces deux sous-tableaux seront ensuite
fusionnés.
Question 4 (20 points). Tables de symboles
Pour un nouveau projet, vous avez besoin d’une table de symboles efficace et performante. Quel(s) algorithme(s) pourriez-vous choisir et pourquoi (en quelques mots), dans les situations suivantes :
1. Table préconstruite au contenu statique, accessible en lecture seule ?
2. Table variable, sans effacement, avec peu d’écritures et beaucoup de lectures ?
3. Table variable, sans effacement, avec autant d’écritures que de lectures ?
4. Table variable, avec peu d’écritures et effacements, et beaucoup de lectures ?
5. Table variable, permettant de nombreux effacements, écritures, et lectures ?
Question 5 (20 points). Graphes
A.
Expliquez brièvement le but de l’algorithme de Kruskal et son principe de fonctionnement.
B. Expliquez brièvement le but de l’algorithme de Dijkstra et son principe de fonctionnement.
Question 6 (30 points). Recherche en chaı̂ne
A. Construisez l’automate fini déterministe (DFA) permettant de reconnaı̂tre et localiser la sous-chaı̂ne “abacabac”
dans toute chaine définie sur l’alphabet {a, b, c, d}, selon la méthode Knuth-Morris-Pratt.
Votre réponse sera donnée sous la forme d’une table de transition telle que calculée par la méthode KMP
(l’état 0 en sera l’état de départ, et l’état 8 l’état accepteur). Pour vous aider, vous pouvez aussi représenter
votre automate sous forme graphique, mais ce n’est pas requis.
2
B. Construisez l’automate fini non-déterministe (NFA) reconnaissant le language décrit par l’expression régulière
“(ab*(c|d*)*)*e”. Utilisez la méthode systématique vue au cours pour construire votre automate, que vous
représenterez sous forme d’un diagramme.
C. Construisez un automate fini non-déterministe (NFA), comme au point B., pour reconnaı̂tre la sous-chaı̂ne
“abacabac”, comme au point A. Expliquez comment localiser cette sous-chaı̂ne en utilisant votre NFA.
Question 7 (20 points). Compression sans perte
A. Soit l’alphabet Σ = {a, b, c, d, e, f, g, h}. Une analyse de la fréquence d’apparition des différents symboles
de Σ dans un texte donné a fourni le résultat suivant :
fréquence
1
1
2
3
5
8
13
21
caractère
a
b
c
d
e
f
g
h
Construisez un code de Huffman optimal sur base de ce tableau de fréquences. Votre réponse doit comporter les
éléments suivants :
1. le trie de Huffman que vous aurez construit ;
2. le code binaire que vous aurez déduit de ce trie.
B. Dans cette sous-question il faut appliquer l’algorithme de compression Lempel-Ziv-Welch (LZW) tel que vu
au cours pour compresser des chaı̂nes de caractères définies sur un alphabet d’entrée Σin = {a, b, c}.
1. Compresser la chaı̂ne “ababababa” selon la méthode L-Z-W.
2. Compresser la chaı̂ne “abcbabcba” selon la méthode L-Z-W.
Attention : pour que le résultat de la compression soit bien défini et non ambigü, les symboles de code de sortie
seront obligatoirement pris dans l’alphabet des lettres majuscules Σcode = {A, B, C, D, E, F, G, H, I, J, K, L}.
Ces symboles de codes seront assignés dans l’ordre naturel aussi bien lors de l’initialisation et de la construction
incrémentale de la table de codage L-Z-W. Cette dernière sera donc initialisée au démarrage de l’algorithme de
(dé)compression de la façon suivante :
symbole de code
A
B
C
D
E
F
G
H
I
J
K
L
sous-chaı̂ne correspondante
a
b
c
←− prochaine assignation
Pour chacune des deux chaı̂nes à compresser, montrez l’état de la table de codage LZW à la fin de la compression.
Bon travail !
3
Téléchargement