2. Types abstraits de données 3. Listes chaînées 4. Piles et files 5. Arbres Introduction à la complexité des algorithmes Notion de complexité algorithmique L’efficacité ou la performance d’un algorithme dépend de sa capacité à minimiser certains critères très importants: Le temps d’exécution. L’espace mémoire utilisé. La bande passante du réseau.
La complexité d’un algorithme est la mesure du nombre
d’opérations fondamentales qu’il effectue sur un jeu de données. Elle est exprimée comme une fonction de la taille de données. Notion de complexité algorithmique La complexité algorithmique permet de s’informer sur l’efficacité d’un algorithme indépendamment de l’environnement d’implémentation machine physique, système d’exploitation, compilateurs de programmes, etc.
La complexité d'un algorithme mesure la quantité de
ressources qu'il exige (mémoire ou temps-processeur). Notion de complexité algorithmique Opérations fondamentales: C’est la nature du problème qui fait que certaines opérations deviennent plus fondamentales que d’autres dans un algorithme Exemple
Problème Opération fondamentale
Recherche d’un élément dans une Comparaison liste Tri d’une liste, d’un fichier, … Comparaisons, déplacements Multiplication des matrices réelles Multiplications et additions Notion de complexité algorithmique Coût des opérations : Coût de base : Pour la complexité en temps, il existe plusieurs possibilités : Calculer le nombre d’opérations élémentaires (addition, comparaison, affectation, …) puis le multiplier par le temps moyen de chacune d’elle ;
pour un algorithme avec essentiellement des calculs numériques,
compter les opérations coûteuses (multiplications, racine, exponentielle, …) ;
ou compter le nombre d’appels à l’opération la plus fréquente
Toute opération élémentaire prend le temps 1
Notion de complexité algorithmique Coût en séquentiel: Séquence : Cséquence(n)= Céléments de la séquence(n) Alternative: Si Cond alors T1sinon T2 C(n)=Ccond(n)+max(CT1(n),CT2(n)) Itération bornée : Pour i de j à k faire B C(n)=(k-j+1)*[Centête(n)+CB(n)]+ Centête(n) Entête : incrémentation de l’itérateur (i) et test de continuation Itération non bornée : Tant que Cond faire B C(n)=Nbboucle[Ccond(n)+CB(n)]+ Ccond(n) Nbboucle : le nombre de boucles Répéter B jusqu’à Cond C(n)=Nbboucle[Ccond(n)+CB(n)] Notion de complexité algorithmique Coût en récursif: Rappel : La résolution d’un algorithme récursif nécessite de trouver : la base de la récurrence ; la relation de récurrence associée ; et les cas d’arrêt. C(n) est calculé grâce à des relations de récurrence Notion de complexité algorithmique Exemple 1 : les algorithmes de tri Tri par sélection Tri par insertion Tri à bulles Tri fusion Notion de complexité algorithmique Tri par sélection Le principe est de parcourir un tableau afin de chercher le plus petit élément qui est ensuite permuté avec le premier élément. Le même traitement s’effectue avec le tableau ayant le premier élément en moins. Cette opération est répétée jusqu’à ce que tous les éléments soient en places. Notion de complexité algorithmique Tri par sélection Algorithme Tri_Selection Début Pour i de 1 jusqu’à n-1 faire m i Pour j de i+1 jusqu’à n faire si (Tab[j] < Tab[m]) alors m j Finsi Opération élémentaire: Finpour la comparaison de deux cellules du temp Tab[m] tableau. Tab[m] Tab[i] Complexité : Tab[i] temp C = (n-1)+(n-2)+...+1 = n.(n-1)/2 Finpour La complexité est de de l'ordre de Fin n² et notée O(n²). Notion de complexité algorithmique Tri par insertion Considérer que le premier élément est à sa place. Prendre le second élément et l'insérer dans la partie triée en déplaçant les éléments triés au besoin pour faire de la place. Prendre le troisième élément et l'insérer dans la partie triée en déplaçant les éléments triés au besoin pour faire de la place. On continue jusqu'à l'élément N. Notion de complexité algorithmique Tri par insertion Pour i de 2 à n faire elem T[i] j i Tantque ((j>1) et (T[j-1]>elem)) faire T[j] T[j-1] j j-1 FinTantque Opération élémentaire: la comparaison de deux cellules du T[j] elem tableau. Finpour Complexité : C = 2 + 3 + 4 +...+ n = n(n+1)/2 -1 La complexité est de l'ordre de n² et notée O(n²). Notion de complexité algorithmique Tri à bulles comparer le premier élément avec le deuxième et les échanger si le premier est plus grand que le second. On compare ensuite le second avec le troisième (le second peut ainsi contenir l'ancien premier) et on les échange si le second est plus grand que le troisième. On continue jusqu'à la fin de la première passe. À la fin de cette passe, le plus grand est nécessairement au bout du tableau. On recommence le même processus mais cette fois, on se rendra jusqu'à l'indice N-1 Notion de complexité algorithmique Tri à bulles Pour i de n à 1 pas -1 faire pour j de 2 à i faire si (T[j-1] > T[j]) Alors tampon T[j-1] T[j-1] T[j] T[j] tampon Complexité : opération élémentaire: Finsi la comparaison de deux cellules du Finpour tableau. Finpour C = (n-1)+(n-2)+...+1 = n(n-1)/2 La complexité est de l'ordre de n² et notée O(n²). Notion de complexité algorithmique Tri fusion 1. Si le tableau n'a qu'un élément, il est déjà trié. 2. Sinon, séparer le tableau en deux parties à peu près égales. 3. Trier récursivement les deux parties avec l'algorithme du tri fusion. 4. Fusionner les deux tableaux triés en un seul tableau trié. Notion de complexité algorithmique Tri fusion Procédure tri-fusion (T: Tab , i:entier, j:entier) m: entier Début Si(i > j) alors Ecrire(" erreur ") Sinon Si (i < j) alors m ← (i+j)div2 tri-fusion (T,i,m) tri-fusion (T,m+1,j) fusionner (T,i,m,j) FinSi FinSi La complexité est de O(n log2(n)). Fin