100% ont trouvé ce document utile (1 vote)
660 vues8 pages

Récursivité et Complexité des Algorithmes

Ce document présente un algorithme récursif pour déterminer la longueur d'une sous-séquence commune maximale entre deux tableaux. Il décrit également la complexité de cet algorithme et propose des exemples de fonctions récursives ainsi que leurs complexités. Enfin, il présente des algorithmes récursifs et itératifs pour créer une matrice circulante à partir d'un tableau et pour trier une matrice.

Transféré par

MIRA KAWTAR SMPC A6
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (1 vote)
660 vues8 pages

Récursivité et Complexité des Algorithmes

Ce document présente un algorithme récursif pour déterminer la longueur d'une sous-séquence commune maximale entre deux tableaux. Il décrit également la complexité de cet algorithme et propose des exemples de fonctions récursives ainsi que leurs complexités. Enfin, il présente des algorithmes récursifs et itératifs pour créer une matrice circulante à partir d'un tableau et pour trier une matrice.

Transféré par

MIRA KAWTAR SMPC A6
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Université Hassan II

Année universitaire : 2018/2019


Faculté des Sciences Ain Chock
Casablanca

Algorithme II Session Normale


SMI3

Problème I : Récursivité & Complexité 8 pts


1. Donner la fonctionnalité de cet algorithme :
Déterminer la longueur d’une sous-séquence commune maximale entre deux tables A et B

Algorithme PLSSC-Recursif (A, i, B, j) : // A et B deux tableau de dimensions i et j


Si i = 0 ou j = 0
Alors renvoyer 0
Sinon
Si A[i] = B[j]
Alors renvoyer 1+ PLSSC-Recursif (A, i − 1, B, j − 1)
Sinon renvoyer max (PLSSC-Recursif (A, i − 1, B, j), PLSSC-Recursif(A, i, B, j − 1))
FSi
FSI

2. Donnez la complexité de la fonction PLSSC-Recursif (A, i, B, j) :

La table A a n élément et B a m éléments :

Max (T (n, m-1),T(n-1,m))= T(n,m-1)+T(n-1,m))

On peut dire que T(n,m) est borné avec la fonction 2min(n,m)

3. La fonction f est définie comme suite :


3
( )=3∗ ( )+1
2
( ) = ( − 1) + 1
(0) = 0
3.1. Donner la fonction récursive terminale :

Fonction f(n,S :Entier) :Entier


Début
Si n=0 Alors retourner S
Sinon
Si n est pair Alors retourner f(3*n/2,3*S+1)
Sinon Alors retourner f(n-1,S+1)
FSI
FSi
FFonction

1/2
Non terminale :

Fonction f(n:Entier) :Entier


Début
Si n=0 Alors retourner S
Sinon
Si n est pair Alors retourner 3*f(3*n/2)+1
Sinon Alors retourner f(n-1)+1)
FSi
FFonction

3.2. Calculer la complexité de la fonction récursive f


Dans le cas Non Terminale :
3
( )=3∗ ( )+1
2
( ) = ( − 1) + 1
(0) = 0
L’équation de complexité est :

( )= ( )+ ( )
( )= ( − )+ ( )
( )=
(1). Le théorème de Master n’est pas applicable dans le premier cas pair car b =2/3 <1. Ainsi, à
chaque fois la fonction est divergente ( le n est multiplié et pas divisé) dans le calcul si le
nombre est impair, et par conséquent la complexité est infinie ( la fonction n’est pas une
primitive récursive) .
(2). Dans le cas pair, par substitution, on obtient une relation linéaire
( ) = ( − 1) + 1 = ( − 2) + 1 + 1 = ( − 2) + 1 + 1 + 1 = (0) + ⋯ 1 + 1 =
3.3. Calculer la complexité de la fonction récursive f si on remplace la fonction dans le cas impair
avec ( ) = 2 ∗ + +

Dans ce cas L’équation de complexité est : ( )= ∗ ( )+


Théorème de Master a=2, b=3, d=0 donc >d donc T(n) ( ) ∈ ( )

3.4. Si Possible, écrire la version itérative avec une pile (vous pouvez utiliser les fonctions d’une
pile sans définition) :
La fonction est fonction non primitive récursive donc ce n’est pas nécessaire d’écrire la
solution itérative ou récursive.
3
( )=3∗ ( )+1
2
( ) = ( − 1) + 1
(0) = 0

2/2
Rappels :

Problème II : Algorithme de Tri 12pts


On s’intéresse à étudier les matrices circulantes carrée NxN, dont l’utilisateur spécifie seulement la
première ligne sous forme d’un vecteur de taille N.
Exemple :

 Pour une table de N= 3 8 1 5 :

8 1 5 10 2
 Pour une table de N= 6 8 1 5 10 2
2 8 1 5 10
10 2 8 1 5
5 10 2 8 1
1 5 10 2 8

1. Ecrire une Procédure itérative qui permet d’effectuer un décalage circulaire à droite d’un
tableau N d’une seule case
Deux Solutions :

Procédure itérative_Déc( T[],N : Entier) Procédure itérative_Déc( T[],N : Entier)


Variables : i,tmp : Entier Variables : i,tmp : Entier
Début tmp ←T[N-1]
Pour i de N-1 à 1 Faire Début
tmp ←T[i-1] Pour i de N-1 à 1 Faire
T[i-1]← T[i] T[i-1]← T[i]
T[i] ← tmp FPour
FPour T[0] ← tmp
FProcedure FProcedure

2/2
2. Ecrire une Procédure récursif qui permet d’effectuer un décalage circulaire à droite d’un
tableau N d’une seule case
Les deux solutions précédentes utilisables dans la version récursive :

Tmp=T[N-1]
Procédure Récursif _Déc( T[],N,tmp : Entier)
Si N=0 Alors T[0] ← tmp
Sion
T[i-1]← T[i]
Récursif_Déc(T[],N-1,tmp)
FProcedure

3. Comparer la complexité des deux algorithmes dans la question 1 et 2.


Les deux sont linéaire à l’ordre n
4. Ecrire une Procédure itérative qui permet de créer une matrice M à partir d’un tableau de
taille N entrée comme argument.

Procédure itérative_Matrix(M[][],T[],N : Entier)


Variables : i,j: Entier
Début
Pour i de 0 à N-1 Faire
Pour j de 0 à N-1 Faire
M[i][j] ←T[j]
FPour
Décalge(T[],N) // Procédure de décalage avant d’affecter les valeurs au prochaine ligne
FPour
FProcedure

5. Ecrire une Procédure récursive qui permet de créer une matrice M à partir d’un tableau de
taille N entrée comme argument.

Procédure récursive _Matrix(M[][],T[],N,i,j : Entier)


Si( i=0 && j<N) Alors
M[i][j] ←T[j]
récursive _Matrix(M[][],T[],N,i,++j : Entier)
FSi
Si(0<i<N)
Si (j=N-1) Décalge(T[],N) récursive _Matrix(M[][],T[],N,++i,0 : Entier)
Si(j<N-1) M[i][j] ←T[j] récursive _Matrix(M[][],T[],N,i,++j : Entier)

FSI
FProcedure

2/2
6. Ecrire la Procédure récursif qui permet d’affiche la matrice, i et j sont initialisés à 0

Procédure Récursive _Print(M[][],T[],N,i,j : Entier)


Si(i<N) Alors
Si (j<N)
Ecrire(M[i][j])
Récursive _Print(M[][],T[],N,i,++j : Entier)
Sinon
Ecrire (EOL)
Récursive _Matrix(M[][],T[],N,++i,0 : Entier)
FSI
FProcedure

7. On a la matrice M [3][3] qui est créé à partir de la table T [3] = {1,2,3} :

M=

2/2
7.1. Ecrire un sous-algorithme de Tri qui permet de ranger une matrice M’quelconque (quel que
soit les positions de 1,2,3) pour aller à M :
 Chaque ligne contient les mêmes composantes :1,2,3
 Les permutations faites seulement sous formes de décalage à droite
 La vérification est faite pour chaque ligne indépendamment
3 2 1 1 2 3
M’= 3 1 2 M= 3 1 2
1 2 3 2 3 1
La solution est d’écrire 3 fonctions :
 Vérification : qui vérifie seulement que le premier élément de la matrice (i,0) est celui
de la table de base T dans l’état initiale et après décalage de chaque ligne.
 Recherche : qui cherche le positon de cet élément et renvoie le nombre de décalage à
faire
 Permutation : qui permet de décaler la table m fois pour que l’élément retourne a sa
place

Procédure Verfication(M[][],T[],N : Entier)


Variables : i,j,k: Entier
Début
Pour i de 0 à N-1 Faire
Si(M[i][0]<>T[0])
k←Recherche_nbre_dec(T[],N,T[0])
Dec_fois(M[][],i,N,k)
Décalge(T[],N) // Procédure de décalage avant d’effectuer la prochaine comparaison
FSi
FPour
FProcedure

Fonction Recherche_nbre_dec(M[][],i,j,N,T[0]) :Entier


Variables : i,j :Entier
k ←0
Pour j de 0 à N-1 Faire
Si (M[i][j]<>T[0]) k++
Sinon return k
FP
FFonction

Procédure Dec_fois(M[][],i,N,k)
Variables : m : Entier
Pour m de 0 à k-1 Faire
Declage(M[i][], N) // le décalage faite seulement pour une ligne i
FP
FProcedure

2/2
7.2. Ecrire un sous-algorithme de Tri qui permet de ranger une matrice M’quelconque (quel que
soit les positions de 1,2,3) pour aller à M dont le diagonal est 1 :
 Le diagonal doit avoir la valeur 1, les autres composantes :2,3 hors diagonales
 Les permutations faites sous formes de décalage pour les lignes et les colonnes
 La vérification est faite seulement pour le diagonal
1 2 1 1 3 3
M’= 3 1 2 M= 2 1 2
3 2 3 2 3 1

La solution est d’écrire 4 fonctions :


 Verfication_de_nbre : Qui vérifie que pour chaque ligne on a seulement une seule
valeur de T [0] dans l’exemple c’est 1. Chaque ligne doit avoir un seul 1.
 Verfication_de_positon : Qui vérifie que pour chaque élément dans le diagonale
égale au T [0] (avant décalage)
 Decalage_sur_ligne : qui permet de décaler une ligne fois pour que l’élément
retourne à sa place (Question 1)
 Declage_sur_colonne : qui permet de décaler une colonne fois pour que l’élément
retourne à sa place (Question 1 on décale les colonnes cad i a la place de i)

Procédure Verfication_de_nbre(M[][],T[],N : Entier)


Variables : i,j,k: Entier
Début
Pour i de 0 à N-1 Faire
Pour j de 0 à N-1 Faire
Tant Que(M[i][j]=T[i]) & i<>j)
Declage_sur_colonne(M[][],j)
FTQ
FPour
Décalge(T[],N) // Procédure de décalage avant d’effectuer la comparaison
FPour
FProcedure

Procédure Verfication_ de postion(M[][],T[],N : Entier)


Variables : i,j,k: Entier
Verfication_de_nbre(M[][],T[],N)
Début
Pour i de 0 à N-1 Faire
Tantque(M[i][i]<> T[i])
Declage_sur_ligne(M[][],j)
FTQ
Décalge(T[],N) // Procédure de décalage avant d’effectuer la comparaison
FPour
FProcedure

2/2
8. Proposer un sous-algorithme de Tri qui permet de ranger une matrice M’quelconque (quel que
soit les positions de 1,2,3) pour aller à M (Question 7.1) ; en utilisant seulement des
permutations sous forme de décalage dans les deux sens à droite et à gauche pour les lignes et
les colonnes.

2/2

Vous aimerez peut-être aussi