Corrigeexamalgo 2011
Corrigeexamalgo 2011
Corrigeexamalgo 2011
Exercice 1 – Routage
Le serveur S est connecté à la machine T par un réseau avec les noeuds A, B, C, D, les capacités
de connexions entre les noeuds sont (en Mbit/s) :
A B C D T
S 2 6 1
A 3 7
B 3 5
C 2 6
D 3 4
L’utilisateur de la machine T télécharge un très grand fichier du serveur S. On veut trouver le
routage qui maximise le débit.
1. Quel problème algorithmique de cours correspond à ce problème de routage ? Comment s’ap-
pelle l’algorithme du cours ?
Correction. Problème de flot maximum dans un réseau. Algorithme de Ford-Fulkerson.
3
A B
2 5
6
S 3 T
7
2
1 4
3
6
C D
1
3
A B
2
1 5
5
S 3 T
7
2
1 4
3
6
C D
3
A B
2
1 5
5
S 3 T
5
2
1 2
5 2
6
C D
3
A B
2
5
6
S 21 T
5
2
1 1
5 3
6
C D
2
3
A B
2
5
6
S 21 T
5
2
1
5 4
5
C D
1
3
A B
2/2 5/5
6/6
S 2/7 1/3 T
2
1/1 4/4
3
1/6
C D
Un algorithme facile
3
À gauche : A[m] < a. Dans ce cas-là tous les éléments de la moitié gauche du tableau sont aussi < a, et
ne peuvent pas appartenir à l’intervalle demandé [a, b]. On va chercher la valeur encadrée dans la
moitié droite seulement.
Dedans :a 6 A[m] 6 b. On a déjà trouvé une valeur encadrée A[m]. On retourne son indice.
À droite :b < A[m]. Ce cas est symétrique au premier, la recherche peut être limitée à la moitié gauche
du tableau.
Cette analyse mène à la fonction récursive suivante chercher(s,f) qui renvoie l’indice de la valeur encadrée
dans le tableau A[s..f] (ou ⊥ s’il n’y en a pas. On suppose que le tableau A, et les bornes a,b sont des
variables globales.
fonction chercher(s,f)
// cas de base
si (s=f)
si (A[s] ∈ [a; b])
retourner s
sinon retourner ⊥
retourner ind
2. Analysez sa complexité.
Correction. On a réduit un problème de taille n à un seul problème de la taille n/2 et des petits calculs
en O(1), donc la complexité satisfait la récurrence :
4
Un jeu - deux puzzles - deux algorithmes
Un Domino est un rectangle qui contient 2 lettres, par exemple A H (il ne peut pas être
retourné).
Règle : Une séquence de dominos est une chaîne, si les lettres voisines coïncident sur chaque
paire des dominos consécutifs, par exemple A H H K K A A Z Z V .
Donnée initiale pour les deux puzzles : n pièces de dominos : D1 = x1 y1 ,. . ., Dn = xn yn
Puzzle 1 (permutation) : Il faut trouver une permutation de tous ces dominos qui forme une
chaîne (selon la règle ci-dessus), si celle-là existe.
Puzzle 2 (sous-séquence) : Il faut trouver la plus longue sous-séquence de tous ces dominos
qui forme une chaîne (selon la règle ci-dessus).
Exemple : Pour les pièces A H , A Z , K A , H K , Z V :
5
Correction. Au pire cas on teste toutes les permutations, il y en a n! ce qui donne une complexité
exponentielle.
Indication : Essayez de répondre aux questions suivantes pour parvenir à un tel algorithme.
– Comment tester que deux dominos peuvent être adjacents ?
– Comment définir une solution partielle ?
– Quelle est une solution partielle de taille 0 ?
– Comment passer d’une solution partielle à une solution plus grande ?
– Quand s’arrêter ?
– Comment représenter une solution partielle par une structure de données ? Comment représenter les
dominos déjà utilisés en chaîne et les dominos encore disponibles ?
6
4. Analysez la complexité de votre algorithme.
Correction. O(n2 ) à cause de deux boucles imbriquées.
6. Comment modifier votre algorithme pour qu’il trouve la sous-chaîne la plus longue (et non
seulement sa longueur).
Correction. Pour chaque i il faut mémoriser le meilleur dé j à mettre à gauche de Di . Ça donne
C[1]=1 ; J[1]=0
pour i de 2 à n faire
meilleur=1
pour j de 1 à i-1 faire
si compatible(j,i) et C[j+1]> meilleur
meilleur=C[j]+1 ; J[i]=j
C[i]=meilleur ;
On prend le i qui maximise C[i] et on compose la sous-chaîne optimale de droite à gauche : i, puis J[i],
puis J[J[i]] etc.