Telechargé par moustapha soubagleh

TDs Conception et Analyse des Algorithmes - M1 DSIM

publicité
MASTER M1 - DATA SCIENCE ET INGENIEURIE MATHEMATIQUE – DSIM
TDs du Cous – Conception et Analyse des algorithme
NB : Lorsqu’il n’y a pas de précision, il s’agit de la complexité temporelle
Exercice 1
Pour chacun des (bouts) de programmes suivants, dire en fonction de n quel est le
nombre d’opérations op que le programme effectue.
1. Pour i  1 à n Faire op
2. Pour i  0 à n Faire op
3. Pour i  1 à n-1 Faire op
4. Pour i  1 à n Faire
op ;
op
Fpour
5. Pour i  1 à n Faire
Pour j  1 à n Faire
op
6. Pour i  1 à n Faire
Pour j  1 à n Faire
Pour k  1 à n Faire
op
7. Pour i  1 à n Faire
op ;
op
Pour j  1 à n Faire
op
Pour k  1 à n Faire
op
Fpour
Fpour
Fpour
8. Pour i  1 à n Faire
Pour j  1 à i Faire
op
9. Tant Que n >= 0 Faire
op;
n  n /2
Ftq
Exercice 2 : Algorithmes récursifs
Un algorithme est récursif sil s’invoque lui-même directement ou indirectement.
1. Ecrire un algorithme récursif qui calcule le factoriel d’un nombre n (n !).
Le principe est le suivant :
1|P a g e
2. Ecrire un algorithme récursif qui calcule le n-ième nombre de Fibonacci.
Le principe est le suivant :
3. Calculer la complexité spatiale et temporelle de ces deux algorithmes
Exercice 3 : Algorithmes de recherche
1. Ecrire un algorithme de recherche d’un élément dans un tableau d’entiers de
dimension n (taille du tableau).
2. Calculer sa complexité en temps et en espace de cet algorithme ?
3. Y a-t-il un changement si le tableau est trié (ses éléments sont classés par ordre
croissant) ? Justifier.
Algorithmes plus efficaces : Principe du Diviser pour Régner (DPR)
C’est un principe développé par Machiavel qui vient du latin « Divide ut imperes »
On divise un problème de grande taille en plusieurs (généralement en deux) sousproblèmes analogues et on utilise l’une des stratégies suivantes :
1. Récursivité sur les données : on sépare les données en deux parties arbitraires,
puis on résout les sous-problèmes, pour enfin combiner les résultats
2. Récursivité sur le résultat : on effectue un pré-traitement pour bien découper
les données, puis on résout les sous-problèmes pour que les sous-résultats se
combinent d’eux-mêmes à la fin.
Exercice 4 : Recherche dichotomique (Diviser Pour Régner)
On suppose que le tableau est trié (ses éléments sont classés par ordre croissant). La
recherche dichotomique consiste à couper le tableau en deux et considérer l’élément
du milieu du tableau d’indice i.
-
Si l’élément recherché est celui du milieu, alors c’est terminé.
Si l’élément recherché est plus petit que l’élément du milieu, la recherche
s’effectue à gauche de i
- Si l’élément recherché est plus grand que l’élément du milieu, la recherche
s’effectue à droite de i
1. Ecrire l’algorithme de recherche dichotomique d’un élément dans un tableau
trié qui implémente ce principe. Vous pouvez utiliser :
a. La récursivité, ou
b. L’itération
2. Calculer la complexité temporelle de cet algorithme pour chaque variante.
3. Comparer cette complexité avec celle de l’exercice précédent.
Problème de tri : Les algorithmes de tri des éléments d’un tableau
Le problème de tri consiste, étant donnée une séquence de n nombres en entrée, à faire
des permutations pour obtenir en sortie une séquence de ces nombres triés par ordre
croissant. Par exemple :
Entrée : [41, 10, 5, 23, 45, 0, 51, 15]
Sortie : [0, 5, 10, 15, 23, 41, 45, 51]
Plusieurs algorithmes existent et permettent de faire ces permutations.
2|P a g e
Exercice 5. Tri par insertion (insertion sort)
Principe : On parcourt la séquence de gauche à droite
Pour chaque élément e : On l’insère à sa position dans une nouvelle séquence ordonnée
contenant les éléments le précédent dans la séquence. On s’arrête dès que le dernier
élément a été inséré à sa place dans la séquence.
1. Ecrire l’algorithme de tri par insertion qui implémente ce principe
2. Calculer sa complexité temporelle
Exemple :
Exercice 6 : Fusion de deux tableaux triés (récursivité sur les données)
Comment obtenir un tableau trié à partir de deux sous-tableaux triés ? Idée :
- Utiliser un pointeur vers le début de chacun des sous-tableaux ;
- Déterminer le plus petit des deux éléments pointés ;
- Déplacer cet élément vers le tableau fusionné ;
- Avancer le pointeur correspondant
1. Ecrire l’algorithme de tri de fusion (merge) de deux tableaux triés qui implémente
ce principe
2. Calculer sa complexité temporelle
Exercice 7 : Tri par fusion (merge sort) : Diviser pour régner
Principe : basé sur la récursion :
- On sépare le tableau en deux sous-tableaux de la même taille
- On trie (récursivement) chacun des sous-tableaux
- On fusionne les deux sous-tableaux tries en maintenant l’ordre
- Le cas de base correspond à un tableau d’un seul élément.
Exemple : lire du bas vers le haut
1. Ecrire l’algorithme de tri par fusion qui implémente ce principe
2. Calculer sa complexité temporelle
3|P a g e
Exercice 8 : Partition d’un tableau d’éléments (récursivité sur le résultat)
Comment séparer les éléments d’un tableau en deux (partitions) de telle sorte que la
première partition contient les éléments qui vérifient un prédicat p et les éléments de
l’autre partition ne vérifient pas p.
1. Ecrire un algorithme qui partitionne un tableau tab[1..n] de telle sorte que les
éléments de tab qui vérifient le prédicat p sont dans tab[1 .. i-1] et les éléments
de tab qui ne vérifient pas p sont dans tab[i .. n] avec i compris entre 1 et n (1 <= i
<= n)
2. Quelle est la complexité de cet algorithme
Exercice 9 : Tri rapide (quick-sort) : Diviser pour Régner
Introduit par Charles Antony Richard HOARE entre 1960/1961, c’est l’exemple le plus
célèbre du DPR. Le principe est le suivant :
- Choisir un élément p appelé pivot ;
- Placer à gauche les éléments inférieurs à p ;
- Placer à droite les éléments supérieurs à p ;
- Trier récursivement la partie de droite et celle de gauche
1. Ecrire l’algorithme de tri rapide qui implémente ce principe
2. Calculer sa complexité temporelle
Exercice 10 : Itérations
1) Ecrire un algorithme qui fait la somme de N nombres lus au clavier
2) Ecrire un algorithme qui fait la somme des nombres lus au clavier tant que l’utilisateur
n’a pas tapé -1.
3) Ecrire un algorithme qui afficher le carré des valeurs saisies tant qu'on ne saisit pas 0
4) Ecrire un algorithme qui permet de saisir des données et s'arrêter dès que leur somme
dépasse 500
5) Ecrire un algorithme qui permet de lire des données tant que leur somme ne dépasse
pas un seuil donné.
6) Pour chacun des algorithmes ci-dessus, calculer la complexité temporelle et spatiale
4|P a g e
Téléchargement