Algorithmique - ROB3 TD3 - Diviser pour régner

publicité
Algorithmique - ROB3
TD3 - Diviser pour régner
Exercice 1 (Triominos)
Un triomino est une tuile en forme de L formée de trois carrés 1 × 1. Le problème est de
n
n
couvrir par des triominos un échiquier troué 2 × 2 . Les triominos peuvent être orientés
de façon arbitraire, mais ils doivent couvrir toutes les cases de l'échiquier (exceptée la case
manquante) sans chevauchement.
Question 1.1 Proposer une méthode de type diviser pour régner pour résoudre ce problème.
Question 1.2 Prouver la validité de la méthode proposée.
Question 1.3 On considère maintenant un échiquier
2n × 2n
avec deux cases manquantes,
qu'on cherche à couvrir de triominos sans chevauchement. Peut-on trouver un algorithme ?
Question 1.4 On considère maintenant un échiquier carré comportant un nombre pair de
cases, privé de deux angles diagonalement opposés, qu'on cherche à couvrir de dominos sans
chevauchement. Peut-on trouver un algorithme ?
Exercice 2 (Élément majoritaire)
A[1..n]. Un élément majoritaire est un élément
(donc si n = 6 ou n = 7, un élément est majoritaire
On considère dans cet exercice un tableau
apparaissant dans plus de
n/2
positions
si il apparaît dans au moins 4 positions). Les éléments ne peuvent être ordonnés (ce ne sont
pas nécessairement des entiers), mais on peut tester si
A[i] = A[j]
(on peut voir le tableau
comme un chier GIF, par exemple). On cherche à déterminer si le tableau
A
comporte un
élément majoritaire.
Question 2.1 Montrer comment résoudre ce problème en
Question 2.2 Montrer comment résoudre ce problème en
ments du tableau
A
sont à valeurs dans
{1, . . . , k}
avec
k
O(n log n)
O(n)
tests.
si on suppose que les élé-
une constante.
Exercice 3 (Algorithme de Stooge)
On considère l'algorithme récursif ci-dessous, qui trie le sous-tableau
A[i . . . j].
L'appel
initial est Stooge(A,1,n), où
dans tout l'exercice que
A est un tableau indicé de 1 à n. Pour simplier, on suppose
n est une puissance de 3 (autrement dit, n = 3p pour un entier p ≥ 0),
ce qui garantit que le reste de la division entière est nul dans tous les appels récursifs.
fonction Stooge(tableau A, entier i, entier j) : tableau
si (A[i]>A[j])
échanger le contenu de A[i] et A[j];
fin si;
si (j-i>1)
k := (j-i+1)/3; # quotient de la division entière
Stooge(A,i,j-k); # premier 2/3 du tableau
Stooge(A,i+k,j); # dernier 2/3 du tableau
Stooge(A,i,j-k); # premier 2/3 à nouveau
fin si;
retourner A;
Question 3.1 Montrer par récurrence forte que Stooge(A,1,n) trie le tableau
A
en ordre
croissant.
Question 3.2 Soit
taille
n.
T (n)
le nombre d'échanges au pire réalisé par Stooge sur un tableau de
Ecrire la relation de récurrence permettant de calculer
T (n)
la complexité de l'algorithme à l'aide du théorème maître.
Question 3.3 Est-ce que Stooge est un bon algorithme de tri ?
pour
n > 2.
En déduire
Téléchargement