2014-2015 Série 2 (Correction)
2014-2015 Série 2 (Correction)
2014-2015 Série 2 (Correction)
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
Algorithme A Algorithme B
i 1;j 1 i 1;j 1
tant que (i m) et (j n) faire tant que (i m) ou (j n) faire
i i+1 i i+1
j j+1 j j+1
fin tant que fin tant que
O(min(m,n)) O(max(m,n))
Algorithme C Algorithme D
i 1;j 1 i 1;j 1
tant que (j n) faire tant que (j n) faire
si i m si i m
alors alors
i i+1 i i+1
sinon sinon
j j+1 j j+1 ; i 1
fin si fin si
fin tant que fin tant que
O(m+n) O(mxn)
Exercice2 :
Déterminer un algorithme qui teste si un tableau de taille n est un ”tableau de
permutation” (i.e. tous les éléments sont distincts et compris entre 1 et n).
1. Donner un premier algorithme naïf qui soit quadratique.
2. Donner un second algorithme linéaire utilisant un tableau auxiliaire.
3. Donner un troisième algorithme linéaire sans utiliser un tableau
auxiliaire.
1
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
i, j :entier ; b :booleen ;
debut
i:=1 ; b :=vrai ;
tantque (i<=n) et (b=vrai) faire
si (t[i]<1) ou (t[i]>n) alors b :=faux ; finsi ;
i :=i+1 ;
fintq ;
i :=1 ;
tantque (i<=n-1) et (b=vrai) faire
j :=i+1 ;
tantque (j<=n) et (b=vrai) faire
si (t[i]=t[j]) alors b :=faux
sinon j :=j+1 ;
finsi ;
fintq ;
i :=i+1;
fintq ;
retourner b ;
fin ;
Complexité : O(n2) solution quadratrique
debut
i:=1 ; b :=vrai ;
tantque (i<=n) et (b=vrai) faire
si (T[i]<1) ou (T[i]>n) alors b :=faux ; finsi ;
i :=i+1 ;
fintq ;
i :=1
tantque (i<=n) et (b=vrai) faire
si (T[T[i]]=T[i]) alors b :=faux finsi ;
sinon si (T[i] i) alors
x=T[i] ;
T[i]=T[T[i]] ;
T[T[i]]=x
sinon i=i+1 ;
finsi ;
finsi ;
fait ;
Retourner b ;
fin;
Complexité : O(n) solution linéaire sans utiliser un deuxième tableau
Page 3 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
i:=1 ; b :=vrai
tq (i<=n) et (b=vrai) faire
si (T[i]<1) ou (T[i]>n) alors b :=faux finsi
i :=i+1
fait
i :=1
tq (i<=n) et (b=vrai) faire
si (T[i]]=i) alors i :=i+1
sinon
si (T[i]=T[T[i]]) alors b=FAUX
sinon si (i<T[i] et T[i]>T[T[i]]) ou (i>T[i] et T[i]<T[T[i]]) alors
x=T[i]
T[i]=T[T[i]]
T[T[i]]=x
finsi
finsi
fait
retourner b
fin
Complexité : O(n) solution linéaire sans utiliser un deuxième tableau
Corrigé :
1/ i, j, k :entier ;
pour i :=1 à n faire
pour j :=1 à n faire
Page 4 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
c[i,j]=0 ;
pour k :=1 à n faire
c[i,j]=c[i,j]+A[i,k]*B[k,j] ;
finpour
finpour
finpour ;
Complexité est de Θ(n3). Il n’y a donc ici ni meilleur cas ni pire cas.
2/ i, j, k :entier ;
pour i :=1 à m faire
pour j :=1 à p faire
c[i,j]=0 ;
pour k :=1 à n faire
c[i,j]=c[i,j]+A[i,k]*B[k,j] ;
finpour
finpour
finpour ;
Complexité de l’algorithme est de Θ(npm) et croît linéairement par rapport à la
dimension de chacune des deux matrices d’entrée prises individuellement. Il à
noter cependant que cet algorithme ne sera pas globalement qualifié de
« linéaire »
i, j :entier ;
Debut
i:=1 ; j:=n ;
tantque (i<j) faire
si (T[i]=0) alors i :=i+1
sinon T[i] :=T[j] ; T[j] :=1 ; j :=j-1 ;
finsi ;
fintq ;
Fin ;
Corrigé :
Action Fusion_A(E/ t1, t2 :tableau[1..n] d’entiers ;E/n :entier ;
S/ t3 :tableau[1..2n]d’entiers)
i, j, k,m :entier ;
Debut
Pour i :=1 à n faire t3[i]=t1[i] ; finpour ;
Page 6 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
m:=n ;
Pour j :=1 à n faire
i :=1 ;
tantque (i<=m et t3[i]<t2[j]) i :=i+1 ; finTq// recherche de la position
k :=m ;
tantque (k>=i) faire t3[k+1] :=t3[k] ; k :=k-1 ; finTq ; // décalage à droite
t3[i] :=t2[j] ;
Finpour ;
Fin ;
Complexité de Fusion_A est de l’ordre de O(n2)
Page 7 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
Page 8 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
finsi ;
fin ;
Il est cependant peu satisfaisant de voir une fonction récursive se rappeler avec un
paramètre plus grand. On peut donc transformer cette fonction de la façon
suivante :
Début
finsi ;
fin ;
Page 9 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
retourne 7
retourne 7
retourne 7
Preuve : On montre par récurrence sur k ∈ {1, …, n} que si clé A[n-k+1 . . n],
alors rech_recur renvoie le plus petit indice i {n-k+1, …, n} tel que A[i]=clé.
Page 11 sur 12
Faculté d’Electronique et d’Informatique - Département d’informatique - USTHB 2014-2015
Module : Algorithmique avancé et complexité - 1ère année Master (IL & RSD)
Corrigé :
a. Fonction Rech_min(E/t :tableau[d..f] d’entiers ; E/ d, f :entier) :entier
pos :entier ;
Debut
Pos :=d ;
Pour i :=d+1 à f faire
si (t[i] < t[pos]) alors pos :=i ; finsi ;
Fait ;
retourner pos ;
Fin ;
Terminaison : elle est triviale puisque si d<=f la boucle est exécutée f-d
fois sinon 0 fois aussi l’instruction conditionnelle (si) ainsi que l’affectation
sont des instructions finies donc la boucle pour se termine.
Invariant : « A la fin de l’itération i, pos contient l’indice du plus petit
élément de t[d..i] »
Preuve par récurrence :
« A l’itération 1 c'est-à-dire i=d+1, si t[i]<t[pos] pos1=d+1, donc pos1
contient l’indice du plus petit élément de t[d..d+1] » donc vrai
On suppose que l’invariant est vrai à l’itération i et on montre qu’il est vrai
à l’itération i+1.
« A l’itération i+1, si t[i+1]<t[pos] posi+1=i+1 et conservera sa valeur sinon,
pos contient donc bien l’indice du plus petit élément de t[d..i+1] »
Il en résulte que l’invariant est vrai. La fonction Rech_min(t,d,f) retourne
bien l’indice du plus petit élément de t[d..f].
b. Complexité : Rech_min est linéaire et égale à O(f-(d+1)+1)=O(f-d) au pire
cas et même chose au meilleur cas donc précisément la complexité de
Rech_min est de Θ(f-d)
c. La complexité de la procédure Tri_sélection est au pire cas de l’ordre de
O(n2) car :
- quand i=1 Rech_min s’exécute en n-1 itérations
" i=2 " n-2 "
. " .
. .
" i=n-1 " n-(n-1 )=1 "
𝑛(𝑛−1)
Ce qui correspond à ∑𝑛−1
𝑖=1 (𝑛 − 𝑖) = ∑𝑖=1 𝑖 =
𝑛−1
= O(n2)
2
- La fonction échanger est de l’ordre de O(1)
Donc la complexité de la fonction tri_sélection est au pire cas de l’ordre de O(n2).
Page 12 sur 12