Devoir maison d’algorithmique L3 Informatique – ENS Cachan Thomas Chatain à rendre au plus tard le 2 novembre 2015 Première partie On considère le tri d’ensembles de mots du type des mots de langue naturelle : les mots n’ont pas tous la même longueur et on considère l’ordre alphabétique, comme dans le dictionnaire. Cependant un mot est ici n’importe quelle suite finie de lettres, les lettres étant choisies dans l’alphabet {a, . . . , z}. Un mot M est représenté sous forme d’un tableau de lettres. On accède en tant constant à la taille |M | du mot et à la ie lettre M [i]. Question 1 Définir formellement l’ordre alphabétique, puis écrire un algorithme itératif et un algorithme récursif qui comparent deux mots et retournent <, > ou =. Prouver leur terminaison et leur correction (preuves de Hoare). Donner leur complexité en temps et en espace. Question 2 Quelle est la complexité en temps d’une procédure de tri fusion d’un tableau de n mots qui utilise l’une des fonctions de comparaison de la question précédente ? On suppose que les accès au tableau se font en temps constant, ainsi que les opérations arithmétiques sur les entiers (pour manipuler les indices des tableaux). Question 3 On suppose dans cette question que tous les mots ont au moins deux lettres. De plus, dans un dictionnaire français ou dans un texte en français, les mots commençant par la lettre a ou c sont beaucoup plus fréquents que les mots commençant par k ou w. Donner un minorant du nombre de comparaisons de lettres effectuées en moyenne par l’un des algorithmes de la question 1 lorsqu’il est appliqué sur deux mots tirés aléatoirement et de manière indépendante, sachant que chaque choix retourne avec probabilité pa un mot commençant par la lettre a, avec probabilité pb un mot commençant par la lettre b. . . 1 Question 4 On tente une nouvelle procédure pour trier un tableau de n mots. Donner un algorithme qui permute ce tableau de telle sorte que tous les mots commençant par la lettre a se retrouvent placés en tête (mais pas forcément dans l’ordre), suivis par tous les mots commençant par b, puis tous les mots commençant par c. . . L’algorithme doit avoir une complexité en temps linéaire en n et doit travailler en place. Question 5 En répétant le principe de l’algorithme de la question précédente, proposer un algorithme pour trier un tableau de mots. Quelle est sa complexité en temps et en espace ? Discuter l’efficacité de cet algorithme en comparasion avec celui de la question 2. Peut-on utiliser cet algorithme pour trier un tableau d’entiers machine codés chacun sur 32 bits ? Qu’en pensez-vous ? Deuxième partie Question 6 On considère une matrice à m lignes et n colonnes à coefficients entiers. Le jeu consiste à se déplacer depuis la case en haut à gauche vers la case en bas à droite. À chaque pas, on ne peut aller que vers la droite ou vers le bas. À l’arrivée, on remporte un nombre de points égal à la somme des coefficients des cases visitées, plus un point par changement de direction. Proposer un algorithme efficace pour calculer le meilleur chemin et le nombre de points qu’il rapporte. Question 7 On s’attend à ce qu’une case change de valeur. On souhaite quand même faire le calcul avec les valeurs initiales, mais pouvoir recalculer rapidement le nombre de points après la modification. Proposer — une adaptation de l’algorithme précédent pour qu’il conserve des informations utiles, et — un algorithme qui prend en entrée la matrice initiale, les coordonnées de la case modifiée, sa nouvelle valeur et les informations conservées après le premier calcul, et recalcule le nombre de points en temps O(d2 ) si la case modifiée est à moins de d pas du départ ou de l’arrivée. Question 8 On souhaite faire un voyage en voiture. Le réservoir plein nous permet de parcourir exactement n kilomètres. Les stations-service sur la route se trouvent aux positions a1 , a2 , . . . , ak , avec 0 ≤ ai+1 − ai ≤ n et a1 = 0. Montrer comment minimiser le nombre d’arrêts. Démontrer la correction de votre algorithme. 2