560 likes | 839 Vues
Introduction à l’Algorithmique. Introduction à l'Algorithmique. Algorithme Validité d'un algorithme Preuve de sa correction Analyse d'un algorithme Complexité d'un algorithme Structures de données Conception d'un algorithme. Algorithme. Permet de résoudre un problème donné
E N D
IPA – Catherine Faron Zucker Introduction à l’Algorithmique
IPA – Catherine Faron Zucker Introduction à l'Algorithmique • Algorithme • Validité d'un algorithme • Preuve de sa correction • Analyse d'un algorithme • Complexité d'un algorithme • Structures de données • Conception d'un algorithme
IPA – Catherine Faron Zucker Algorithme • Permet de résoudre un problème donné ex: Trier une liste de noms par ordre alphabétique • Procédure de calcul bien définie Séquence d'instructions élémentaires • termine en un temps fini • prend une ou des valeur(s) en entrée • donne une ou des valeur(s) en sortie
IPA – Catherine Faron Zucker Exemple • Exemple de problème à résoudre Comment trier une liste d'élèves par ordre alpha? • Input: liste non triée • Output: liste triée • Algo: ???
IPA – Catherine Faron Zucker Types de problèmes • Tris d'éléments d'une liste • Recherche d'un élément • Calcul sur des chaînes (caractères, nombres, bits, ...) • Problèmes de graphes • Problèmes combinatoires • Problèmes géométriques • Problèmes numériques • Algorithmes exacts / d'approximation
IPA – Catherine Faron Zucker Algorithme et Programme • Un algorithme est implémenté dans un langage de programmation • Un même algorithme peut être implémenté dans différents langages (Java, C, Python, Caml, ...) • Pseudo-code
IPA – Catherine Faron Zucker Validité d'un algorithme • Précondition • doit être vérifiée avant un traitement donné, • garantit que la possibilité de déroulement du traitement. • Postcondition • doit être vérifiée après le déroulement du traitement, • garantit que le traitement a bien permis de réaliser ce pourquoi il a été réalisé. • Invariant • condition qui est toujours vraie, • caractérise l'état interne de tout ou partie d'un algo.
IPA – Catherine Faron Zucker Analyse d'un algorithme • Complexité: mesure de son efficacité • Taille mémoire nécessaire à son exécution • Temps d'exécution nécessaire • dans le meilleur des cas • dans le pire des cas • en moyenne Exemple: recherche d'un élément dans une liste? Exemple: recherche du plus grand élément d'une liste?
IPA – Catherine Faron Zucker Efficacité d'un algorithme • Temps d'exécution • fonction de la taille des données en entrée choix du bon paramètre • taille d'une liste, degré d'un polynôme • taille d'une matrice? • nombre de noeuds, profondeur, largeur d'un graphe? • nombre de mots d'un fichier ou nombre de caractères? • fonction du nombre de fois où une opération de base est répétée dans l'algorithme
IPA – Catherine Faron Zucker Efficacité d'un algorithme • Temps d'exécution: T(n) C(n) t • C(n) nombre de fois où l'opération de base de l'algorithme est exécutée • t temps d'exécution de cette opération de base C(n) = ½ n (n-1) = ½ n2 - ½ n • Ordre de grandeur: C(n) n2
IPA – Catherine Faron Zucker Efficacité d'un algorithme • Classes de complexité 1 log n n n log n n2 n3 2n n! • Notations asymptotiques: • O(g(n)) • Ω(g(n)) • θ(g(n))
IPA – Catherine Faron Zucker Structure de Données • Moyen de stocker et organiser les données d'un algorithme • accès aux données • modification, mise à jour des données • Tableaux, listes chaînées • Piles, files • Sets et Maps • Graphes, arbres, arbres binaires de recherche
IPA – Catherine Faron Zucker Conception d'un algorithme • Stratégie de résolution d'un problème • Approche itérative • répéter jusqu'à obtention du résultat souhaité • Approche récursive • diviser pour régner
IPA – Catherine Faron Zucker Structures de contrôle • Structures de contrôle conditionnelle • Si cond Alors instr FinSi • Si cond Alors instr sinon instr FinSi (imbrications possibles) • Structures de contrôle itératives • TantQue cond Faire instr FinTantQue • variantes (imbrications possibles)
IPA – Catherine Faron Zucker Itérations int i = 0; while(i<10){ System.out.println(“Coucou”); i +=1; }
IPA – Catherine Faron Zucker Itérations int i = 0; do{ System.out.println(“Coucou”); i +=1; }while(i<10); for (i=0; i<10; i++) System.out.println(“Coucou”);
IPA – Catherine Faron Zucker Calcul du pgcd PGCD(a,b) n <- a; m <- b; TantQue m != 0 Faire r <- n mod m n <- m m <- r FinTantQue retourner n
IPA – Catherine Faron Zucker Validité d'une boucle • Invariant de boucle • Initialisation • Montrer que I est vrai avant d'entrer dans la boucle • Conservation • Montrer que si C et I sont vrais, alors après la liste d'instructions, I est encore vrai. • Terminaison • On en déduit que (I et non C) est vrai à la sortie de la boucle (si la boucle termine).
IPA – Catherine Faron Zucker PGCD(a, b) n <- a; m <- b; { Invariant : pgcd(a,b)=pgcd(n,m) et n>=0 et m>=0 } TantQue m != 0 Faire r <- n mod m n <- m m <- r { pgcd(a,b)=pgcd(m,n) et m>=0 et n>0 } FinTantQue // pgcd(a,b)=pgcd(n,m) et n>=0 et m=0 // Donc n=pgcd(a,b)
IPA – Catherine Faron Zucker Fact(n) i ← 1; fact ← 1 { Invariant: fact = i ! et i ≤ n } TantQue i < n Faire i ← i + 1 fact ← fact * i { Invariant: fact = i ! et i ≤ n } FinTantQue (fact = i ! et i ≤ n ) et non(i<n) retourner fact
IPA – Catherine Faron Zucker Structures de Données • Moyen de stocker et organiser les données d'un algorithme • accès aux données • modification, mise à jour des données • Tableaux, listes chaînées • Piles, files • Sets et Maps • Graphes, arbres, arbres binaires de recherche
IPA – Catherine Faron Zucker Tableaux • suite ordonnée d'éléments de taille fixe int [] tableau = new int[10]; • premier élément : tableau[0] • dernier élément : tableau[tableau.length -1] • i ième élément : tableau[i-1] • init./modif. d'un élément: tableau[i] = 3;
IPA – Catherine Faron Zucker Tableaux • valeur tableau[i] / indice i • recherche du (des) élément(s) vérifiant une certaine propriété • vérification de la présence ou l'absence d'une certaine valeur dans le tableau • recherche de l'indice dans le tableau d'une valeur donné • tri du tableau selon un certain critère
IPA – Catherine Faron Zucker Matrices • Tableau de tableaux : int [][] matrice = new int[10][15]; • élément en ligne i et colonne j : matrice[i][j] • Matrice carrée : int [][] matriceCarree = new int[7][7];
IPA – Catherine Faron Zucker Listes • suite ordonnée d'éléments de taille variable ArrayList<Integer> liste; liste = new ArrayList<Integer>(); • Ne peuvent contenir que des objets • premier élément : liste.get(0) • dernier élément : liste.get(liste.size()-1) • i ième élément : liste.get(i-1)
IPA – Catherine Faron Zucker Listes • ajout d'un élt: liste.add(new Integer(3)); • modif d'un élt: liste.set(i,new Integer(4)); • suppression d'un élt: liste.remove(i); • mêmes algos que sur les tableaux
IPA – Catherine Faron Zucker Piles et Files • Ordonnancements particuliers des éléments d'un tableau ou d'une liste • Pile : empiler/dépiler des éléments • statique ou dynamique selon qu'on utilise un tableau ou une liste • File : enfiler /défiler des éléments • implémentation par liste plus simple
IPA – Catherine Faron Zucker Piles public class Pile{ private Object[] table; private int hauteur; public void empiler(Object o){table[hauteur]=o; hauteur++;} public Object depiler(){hauteur--; return table[hauteur];} public Object sommet(){} public boolean vide(){} public boolean pleine(){} }
IPA – Catherine Faron Zucker Files public class Pile{ private ArrayList<Object> liste; private int longueur; public void enfiler(Object o){liste.add(o); longueur++;} public Object defiler(){longueur--; return liste.remove(0);} public Object tete(){} public Object queue(){} public boolean vide(){} }
IPA – Catherine Faron Zucker Maps • collection de paires d'objets, de taille variable HashMap<String,String> surnoms; surnoms = new HashMap<String,String>(); • paires clé/valeur, clés uniques • ajout d'un couple clé/valeur : surnoms.put(“tartampion”, “dupont”); • suppression d'un couple clé/valeur : surnoms.remove(“tartampion”);
IPA – Catherine Faron Zucker Maps • plus de premier, dernier, i ième élément, récupération d'une valeur associée à une clé : String nom = surnoms.get(“tartampion”); • récupération directe de • la valeur associée à une clé : get • de l'information de présence/absence • d'une valeur: surnom.containsKey(“dupont”); • d'une clé : surnom.containsValue(“tartampion”);
IPA – Catherine Faron Zucker Sets • ensemble non ordonné d'objets, de taille variable HashSet<String> surnoms; surnoms = new HashSet<String>(); • ajout d'un élément : surnoms.put(“tartampion”); • suppression : surnoms.remove(“tartampion”); • test direct de la présence d'un élément : surnoms.contains(“tartampion”);
IPA – Catherine Faron Zucker Maps et Sets • Les structures de Maps et de Sets ne supportent que les opérations de dictionnaire:insérer, rechercher, supprimer • HashMap et HashSet sont des implémentations à base de tables de hachage qui permettent de réduire le coût de ces opérations.à suivre...
IPA – Catherine Faron Zucker Structures de données • listes chaînées : cf. td • simplement, doublement • arbres • arbres binaires • arbres binaires de recherche • graphes à suivre...
IPA – Catherine Faron Zucker Conception d'un algorithme • Stratégie de résolution d'un problème • Approche incrémentale • itérer jusqu'à obtention du résultat souhaité • Approche récursive • diviser pour régner: • diviser en sous-problèmes • régner sur les sous-problèmes • combiner les solutions des sous-problèmes
IPA – Catherine Faron Zucker PGCD(a, b) itératif n <- a; m <- b; TantQue m != 0 Faire r <- n mod m n <- m m <- r FinTantQue retourner n
IPA – Catherine Faron Zucker PGCD(a, b) récursif • diviser: pgcd(a,b) = pgcd(b, a mod b) semblable au problème initial de taille moindre • régner: pgcd(a,0) = a • combiner: pgcd(a,b)= pgcd(b,a mod b)=...
IPA – Catherine Faron Zucker PGCD(a, b) récursif Si b=0 Alors retourner a //terminaison Sinon retourner pgcd(a, a mod b) finSi
IPA – Catherine Faron Zucker Fac(n) • Relation de récurence fac(n) = n * fac(n-1), n>0 fac(0) = 1 • Algorithme Si n = 0 Alors retourner 1 Sinon retourner n * fac(n-1) FinSi
IPA – Catherine Faron Zucker Fac(n) Complexité • opération élémentaire : * • nbre de fois où elle est effectuée • fonction de n: M(n) • relation de récurence: M(n) = 1 + M(n-1) pour n>0 et M(0) = 0 en développant, on a M(n) = M(n-i) – i pour tout i pour i=n, on obtient M(n) = M(O) + n = n cf. module Maths discrètes
IPA – Catherine Faron Zucker Tours de Hanoï • n disques de tailles décroissantes sur une tige • Problème: comment faire passer les n disques sur une autre tige, en utilisant une tige intermédiaire afin qu'un disque ne soit jamais empilé sur un plus petit? • Algorithme (récursif): • faire passer n-1 disques sur la tige 2 • faire passer le plus grand disque sur la tige 3 • reste à faire passer les n-1 disques de t2 à t3
IPA – Catherine Faron Zucker Tours de Hanoï • Algorithme: • faire passer n-1 disques sur la tige 2 • faire passer le plus grand disque sur la tige 3 • reste à faire passer les n-1 disques de t2 à t3 • Complexité • on compte le nbre de déplacements • il est fonction du nombre de disques • M(n) = M(n-1) + 1 + M(n-1) pour n>1 et M(1)=1 • M(n) = 2*M(n-1)+1 = ... = 2n -1 (algo exponentiel)
IPA – Catherine Faron Zucker Recherche dichotomique • Version itérative vue en TD • Version récursive ?
IPA – Catherine Faron Zucker Algorithmes de tri • Structures de données ordonnées • Nombreux algorithmes • tri par sélection • tri par insertion • tri à bulles • tri fusion • tri rapide (quicksort)
IPA – Catherine Faron Zucker Tri par sélection • Principe • recherche du plus petit élt du tableau et échange avec le premier élt • recherche du plus petit élt du tableau entre les positions 2 et n-1 et échange avec le second élt • ... • recherche du plus petit élt entre les positions n-2 et n-1 et échange avec l'élt en position n-2
IPA – Catherine Faron Zucker Tri par sélection • Algorithme itératif Pour i de 0 à n-2 Faire min <- i Pour j de i+1 à n-1 Faire Si tab[ j ] < tab[min] Alors min <- j FinSi FinPour Echanger tab[ i ] et tab[min] FinPour
IPA – Catherine Faron Zucker Tri par insertion • Principe le tableau étant trié jusqu'à l'élt i-1, insérer l'élt i à sa place parmi les i premiers élts récursion ou itération
IPA – Catherine Faron Zucker Tri par insertion • Algorithme itératif Pour i de 1 à n-1 Faire val <- tab[ i ] j <- i-1 TantQue j >= 0 et tab[ j ] > val Faire tab [ j+1] <- tab [ j ] j <- j - 1 FinTantQue tab [ j+1 ] <- val
IPA – Catherine Faron Zucker Tri à bulles • Principe comparaison 2 à 2 des éléments adjacents et échange s'ils ne sont pas ordonnés comme les bulles, les plus grands élts remonten en fin de liste
IPA – Catherine Faron Zucker Tri à bulles • Algorithme itératif Pour i de 0 à n-2 Faire Pour j de 0 à n-2-i Faire Si tab[ j+1 ] < tab[ j ] Alors échanger tab[ j+1 ] < tab[ j ] FinSi FinPour FinPour