Cours d’Algorithmique I
Treizi`eme fiche de TD – Preuves par r´ecurrence – Divide & conquer
D´epartement Informatique, R´eseaux et Multim´edia — Polytech Marseille — usage interne
Ann´ee 2016-17
Semaine du 12/12/16
1 Preuve par r´ecurrence — Calcul de nombre de feuilles
On consid`ere des arbres pour ´etablir des relations entre le nombre de feuilles et le nombre de nœuds internes
dans ces arbres. Soient N F (A) le nombre de feuilles d’un arbre Aet NI(A) son nombre de nœuds internes.
Etablir que, pour tout arbre binaire A, on a la relation NF (A) = NI(A) + 1.
2 Preuve par r´ecurrence — Une famille d’arbres ternaires
Par analogie avec ce qui a ´et´e vu en cours, on consid`ere la famille d’arbres ternaires suivante. La famille est
caract´eris´ee par le fait que tout nœud interne v´erifie l’une des trois propri´et´es suivantes: 1) les trois fils du
nœud sont des feuilles ; 2) les deux premiers fils du nœud sont des feuilles et le troisi`eme fils est de profondeur
1 ; 3) les trois fils du nœud sont, dans l’ordre de profondeur k,k+ 1 et k+ 2.
Donner les arbres en question, pour des profondeurs allant de 0 `a 3. Montrer par r´ecurrence que, pour toute
profondeur pdonn´ee, l’arbre est unique.
3 Une fonction bizarre ...
La fonction ci-contre a ´et´e vue en TD il y a quelques
semaines. C’est un pr´edicat qui dit si le nombre fourni
est premier ou non. En donner un preuve pr´ecise.
int bizarre ( int a )
{assert( a > 0 ) ;
return( bizarre_rec( a , 2 ) ) ;
}
int bizarre_rec ( int a , int b )
{if(a==1||a==2||a==b)
return( 1 ) ;
else
if ( bizarre( b ) && a % b == 0 )
return( 0 ) ;
else
return( bizarre_rec( a , b + 1 ) ) ;
}
En d´eduire ensuite un algorithme qui multiplie deux entiers binaires avec cette mˆeme complexit´e.
4 Divide and conquer — Multiplication de matrices de Strassen
On souhaite calculer le produit de matrices C=A·Bo`u A,Bet Csont des matrices carr´ees de taille
n. L’algorithme classique utilise n2produits scalaires de vecteurs de taille n, donnant lieu `a une complexit´e
globale de n3multiplications (les additions sont n´egligeables).
On peut consid´erer les matrices d´ecoup´ees en quatre sous-matrices
carr´ees de taille n/2, comme indiqu´e ci-contre. On obtient alors le
r´esultat grˆace `a : C11 =A11 ·B11 +A12 ·B21 ;C12 =A11 ·B12 +
A12 ·B22 ;C21 =A21 ·B11 +A22 ·B21 et C22 =A21 ·B12 +A22 ·B22.
Il faut 8 multiplications de matrices de taille n/2 et la complexit´e
de l’algorithme restera `a n3.
A= A11 A12
A21 A22 !B= B11 B12
B21 B22 !
C= C11 C12
C21 C22 !
M1= (A11 +A21)·(B11 +B22)
M2= (A21 +A22)·B11
M3=A11 ·(B12 −B22)
M4=A22 ·(B21 −B11)
M5= (A11 +A12)·B22
M6= (A21 −A11)·(B11 +B12)
M7= (A12 −A22)·(B21 +B22)
V. Strassen a propos´e (1969) un algorithme qui calcule les 7 produits Mi
ci-contre, pour obtenir le r´esultat grˆace `a des additions matricielles.
Montrer que cette approche donne lieu `a une complexit´e de nlog27'n2.807.
L’algorithme de Coppersmith-Winograd a une complexit´e de n2.376. On ne
sait pas s’il est optimal.
C11 =M1+M4−M5+M7C12 =M3+M5
C21 =M2+M4−M5C22 =M1−M2+M3+M6