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