I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM 7/8 v1.2
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Seuls les transparents marqués * sont à connaître (8 au total)
i21 IEM-UB GFDL Quelle méthode de tri choisir ? ● Petits tableaux – Qui s'en soucie ? 1ms contre 0,9 ms... ● Pour de grands tableaux ! – Tableau de tous les étudiants de l'université ( étudiants) – Classement de toutes les pages Wikipedia par titre ( pages en français, en anglais)
i21 IEM-UB GFDL Quelle méthode de tri choisir ? ● Minimiser le temps de calcul ● Minimiser l'espace mémoire ● Approche expérimentale : – Chronométrer : ex. 2,5s pour trier entiers – Surveiller la mémoire : ex. 2 Go pour trier d'entiers – Peu instructif, utile quand on ne peut faire mieux – Que se passera-t-il quand on doublera la taille du problème à traiter ? Doublement, Triplement ?
i21 IEM-UB GFDL Quelle méthode de tri choisir ? ● Approche analytique : – Mesurer la complexité des algorithmes – Comprendre ce qui se passe – Analyse indépendante du matériel
i21 IEM-UB GFDL *Complexité en temps ● Nombre d'opérations pertinentes effectuées pour réaliser l'opération, en fonction de la taille du problème à traiter ● Ex : combien de lecture des t[i] en fonction de la taille du tableau t à trier ● Relation avec le chronomètre : lecture d'un t[i], temps constant, dépend seulement du processeur
i21 IEM-UB GFDL *Complexité en espace ● Quantité de mémoire utilisée pour réaliser l'opération, en fonction de la taille du problème à traiter ● Ex. taille des tableaux manipulés en fonction de la taille du tableau t à trier ● Relation avec la mémoire : taille d'un entier constante, 1 mot mémoire en Java (32 bits)
i21 IEM-UB GFDL Exemple : tri a bulle, espace ● Trier t : (facile) ● Rappel : tant qu'il y a un désordre, reparcourir tout le tableau en inversant les éléments consécutifs mal classés
i21 IEM-UB GFDL Exemple : tri à bulle, espace ● Algorithme TriBulle (tableau t) booléen désordre faire désordre=faux pour entier i de 0 à taille(t)-2 si (t[i] > t[i+1]) inverser(t,i,i+1); désordre=vrai; tant que désordre ● Remarque : variables t,désordre,i
i21 IEM-UB GFDL Exemple : tri à bulle, espace ● Complexité en espace pour trier – taille de l'entrée : 9 entiers – type de tri : en place (pas de tableau intermédiaire) ● Complexité en espace pour trier t : – 9 entiers + 2 variables ● Même complexité quel que soit contenu de t ● Conclusion : pour un tableau de taille n en entrée, la complexité en espace du tri à bulle est n+2
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● Opération ? nombre de comparaisons entre t[i] et t[i+1] ● Algorithme TriBulle (tableau t) booléen désordre faire désordre=faux pour entier i de 0 à taille(t)-2 si (t[i] > t[i+1]) inverser(t,i,i+1); désordre=vrai; tant que désordre
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● Pour trier t0= – Premier parcours complet (boucle pour i) – Jamais de désordre rencontré (reste à faux) – Sortie de la boucle tant que – Terminé ● Pour ce tableau t0 : 8 comparaisons ● Mais pas toujours 8, dépend du tableau
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● Pour trier t1= – Premier tour de i : 9 descend en dernière position ● – Deuxieme tour : 8 descend jusqu'à l'avant dernière position ● – etc. ● Au total : 8 passages complets
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● 1er passage : 8 comparaisons ● 2ème : 8 comparaisons ● 3ème : 8 comparaisons ● etc. ● 8ème : 8 comparaisons ● Au total : 8 x 8 =64 comparaisons
i21 IEM-UB GFDL Plus malin ● Chaque passage : le maximum va à la fin ● Pas la peine de revérifier ● faire désordre=faux ; nbBienPlacé=0; pour entier i de 0 à taille(t)-2-nbBienPlacé si (t[i] > t[i+1]) inverser(t,i,i+1); désordre=vrai; nbBienPlacé++; tant que désordre
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● 1er passage : 8 comparaisons ● 2ème : 7 comparaisons (9 déjà bien placé) ● 3ème : 6 comparaisons ● etc. ● 8ème : 1 comparaison ● Au total : =36 comparaisons
i21 IEM-UB GFDL Exemple : tri à bulle, temps ● En général : trier n (n-1) (n-2) ● Au total : (n-1)+(n-2) comparaisons, soit n(n-1)/2
i21 IEM-UB GFDL Complexité : plusieurs notions ● Trier : 8 comparaisons ● Trier : 32 comparaisons ● Donc : ne dépend pas que de la taille, mais aussi du contenu de l'entrée ● Trois aspects de la complexité : – Pire des cas – Meilleur des cas – En moyenne
i21 IEM-UB GFDL *Complexité : plusieurs notions ● Complexité dans le meilleur des cas : prendre le tableau le plus facile – pas très instructive ● Complexité dans le pire des cas : permet de connaître la place maximale/le temps maximal – parfois pessimiste / vraies données ● Complexité en moyenne : moyenne du temps/de l'espace utilisé, pour tous les tableaux possibles – très difficile à calculer
i21 IEM-UB GFDL Complexité des tris ● Domaine très étudié (~1960) ● Complexités au pire et en moyenne connues pour tous les tris classiques ● Comment les comparer ?
i21 IEM-UB GFDL Complexité : simplification ● Exemple : complexité en temps 10n+34 op. ● Négliger les constantes additives (34) – 34 opérations négligeables devant 10n, quand n devient grand ● Négliger les constantes multiplicatives (10) – 10n : groupe de 10 opérations répété à chaque fois – acheter une machine faisant les 10 d'un coup
i21 IEM-UB GFDL Complexité : notation ● « l'algorithme A a une complexité en temps plus faible que l'algorithme B » ● Exemple : 400n+32 < n² ● 400n+32 est bornée asymptotiquement par n² ● Notation O (grand O, notation de Landau) ● Definition : s'il existe n0 et M tq, pour tout n>n0, f(n) < M.g(n), alors f est en O(g) ● 400n+32 est en O(n²)
i21 IEM-UB GFDL Notion « f est O(g) complexité en temps ou espace n, taille de l'entrée f(n) M.g(n) n0
i21 IEM-UB GFDL Complexité : notation ● « l'algorithme A a la même complexité en temps que l'algorithme B » ● Ex. : 400n+32 et 600n+12 sont (asymptotiquement) les mêmes complexités ● Notation (grand théta) ● Propriété : f est (g) si f est O(g) et g est O(f)
i21 IEM-UB GFDL *Vocabulaire ● Taille d'entrée n ● O(1) : complexité constante ● O(n) : complexité linéaire ● O(n²) : complexité quadratique ● O(ln n) : complexité logarithmique ● O(2 n ) : complexité exponentielle ● Rq : O(1) est O(ln(n)) qui est O(n) qui est O(n²) qui est O(2 n )
i21 IEM-UB GFDL Les tris : complexité nb comparaisons (* pire) Trimeilleur moyennepire Sélection directe O(n²)O(n²)O(n²) Insertion séq.O(n-1)O(n²) O(n²) A bulleO(n) O(n²)O(n²) RapideO(n ln n)O(n ln n) O(n²) FusionO(n ln n)O(n ln n)O(n ln n) Rq. Les O peuvent être remplacé par
i21 IEM-UB GFDL Remarque ● Théorème : la complexité au pire des cas d'un tri en place par comparaison ne peut être inférieure à n ln n [Knuth, 1973] ● Conclusion : tri fusion optimal
i21 IEM-UB GFDL Donald Knuth (1938-) ● Stanford ● « The art of computer programming » ● TeX ● Notations (O,...) ● Prix Turing 1974 ● etc.
i21 IEM-UB GFDL Les tris : complexité en espace (*pire) Tripire cause Sélection directe n+O(1)en place Insertion séq.n+O(1)en place A bullen+O(1)en place Rapiden+O(ln n) récursivité Fusionn+O(n) pas en place(fusion) Rq. Les O peuvent être remplacé par
i21 IEM-UB GFDL *Stabilité ● Trier les étudiants par âge – 19:Jean22:Marc19:Sarah ● Tri stable : conserve l'ordre initial pour les valeurs identiques – 19:Jean19:Sarah22:Marc ● Tri instable : mélange les données de même valeur – 19:Sarah19:Jean22:Marc
i21 IEM-UB GFDL *Stabilité ● Tri rapide : instable ● Tri fusion : stable (si bien programmé)
i21 IEM-UB GFDL En résumé ● <100 éléments : qu'importe ● Données presque triées : insertion séquentielle (ou sa variante, insertion dichotomique) ● Données quelconques, stabilité non requise – tri rapide ● Données quelconques, stabilité requise – tri fusion ● Bilbiothèque standard de Java (Sun) : tri fusion
i21 IEM-UB GFDL Tri rapide : Sir Charles Antony Richard Hoare (1934-) ● Oxford ● Prix Turing 1980 ● Tri rapide ● Vérification logique des programmes
i21 IEM-UB GFDL Ce qui suit n'est pas au programme, mais juste pour le plaisir
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Complexité générale ● Tri : faible complexité (O(n²) et moins) ● Complexité d'autre problèmes ? ● Ex. : voyageur de commerce
i21 IEM-UB GFDL Voyageur de commerce ● Donnée : – n villes, certaines étant reliées par des routes – un voyageur de commerce, devant visiter chaque ville ● Problème : – trouver un ordre de visite pour ● visiter chaque ville ● ne jamais passer 2 fois par la même ville ● pas toujours possible
i21 IEM-UB GFDL Voyageur de commerce départarrivée
i21 IEM-UB GFDL Voyageur de commerce départarrivée solution
i21 IEM-UB GFDL Voyageur de commerce Et là ?
i21 IEM-UB GFDL Voyageur de commerce ● Algorithme : – Pour tous les parcours possibles ● vérifier si on passe deux fois par la même ville ● si oui, passer au parcours suivant ● sinon, répondre « gagné ! » – Si jamais gagné, alors répondre « pas possible »
i21 IEM-UB GFDL Complexité en temps ● Algorithme correct ● Mais, pour n villes, 2 n chemins possibles ! ● Complexité en temps : O(2 n ) : exponentielle
i21 IEM-UB GFDL Pour ce week-end ● Personne ne sait faire mieux ● Trouver un algorithme en temps polynomial pour le voyageur de commerce : $ ● Millennium Problems du Clay Mathematics institute ( ● Problème P =? NP
i21 IEM-UB GFDL Pour ce week-end ● Classe P : ensemble des problèmes ayant une complexité en temps O(n k ) ● classe NP : ensemble des problèmes dont la vérification d'une solution est P – Vérifier qu'un parcours est ok pour le voyageur de commerce est facile – Trouver le parcours est difficile ! ● P est inclus dans NP, mais est-ce que P=NP ?
i21 IEM-UB GFDL Hiérarchie de complexité P NP EXP n² tris voyageur de commerce algèbre élémentaire géométrie élémentaire itinéraire