Algorithmes et structures de données Patrick Reuter maître de conférences http://www.labri.fr/~preuter
Déroulement CM mardi de 11h15 à 12h15 TD/TP en alternance - Groupe YB (Yonel Blanc) le mardi de 16h15 à 17h45 - Groupe PR (Patrick Reuter) le mercredi de 18h30 à 20h00
Motivation Niklaus Wirth, ETH Zuerich, 1976 « Algorithms + Data Structures = Programs »
Motivation 8.168.684.336 pages Comment ça marche ?
Motivation Structure de donnée: p.ex. fantôme couleur position direction aggressif ou pas ? Algorithmes: p.ex. mettre a jour le meilleur score p. ex. / ex:
Motivation Structure de donnée: - tableau a 2 dimension Algorithmes: - surtout I.A. a / à
Motivation Structure de donnée : File FIFO (First In First Out) Aussi: File à priorité
Motivation Structure de donnée : Pile LIFO (Last In First Out)
Motivation Structure de donnée : Arbre (pour l’élimination des parties cachées)
Motivation Structure de donnée : Graphe (pour plannifier des trajets) plannifier / planifier
Algorithme Définition Wikipedia (12/9/2005) L'algorithmique est la science des algorithmes, visant à étudier les opérations nécessaires à la réalisation d'un calcul. René Descartes dans le Discours de la Méthode : « diviser chacune des difficultés que j'examinerois, en autant de parcelles qu'il se pourroit, et qu'il seroit requis pour les mieux résoudre. ». Un algorithme est une méthode de résolution de problème énoncée sous la forme d'une série d'opérations à effectuer. La mise en œuvre de l'algorithme consiste en l'écriture de ces opérations dans un langage de programmation et constitue alors la brique de base d'un programme informatique (implémentation, « codage ») L'algorithme devra être plus ou moins détaillé selon le niveau d'abstraction du langage utilisé ; autrement dit, une recette de cuisine doit être plus ou moins détaillée en fonction de l'expérience du cuisinier. examinerois, pourroit, seroit, / examine, peut, est, (ici « autant que » est une comparaison donc pas de subjonctif, différent des phrases du type « quitte à s’être levé, autant que ce soit pour aller en cours) ; pour les mieux résoudre / pour mieux les résoudre ; problème / problèmes
Structure de données Définition Wikipedia (12/9/2005) une structure logique destinée à contenir des données afin de leur donner une organisation permettant de simplifier leur traitement. Exemple : On peut présenter des numéros de téléphone * - par département, - par nom - par profession (pages jaunes), - par numéro téléphonique (annuaires destinés au télémarketing), - par rue et/ou - une combinaison quelconque de ces classements. À chaque usage correspondra une structure d'annuaire appropriée.
Ingrédients d’algorithmes Variables : nombre y i patrick x1 Mais non pas : 3x entrée
Ingrédients d’algorithmes Affectation Condition/Comparaison Appel de fonction Structure de contrôle Branchements conditionnels (multiples) Boucles Bloc d’instruction
Ingrédients d’algorithmes Affectation a := 7; score := 0; score := score + 100; gameover := FAUX; Note: Affectation d’une seule variable avec un valeur. La variable à affecter figure à gauche, la valeur à droite Faux: a+b := 6; 7 := c; un valeur / une valeur
Ingrédients d’algorithmes Condition/Comparaison a = 7 absent = FAUX malade = VRAI OU vacances = VRAI score > highscore; … Note: Le résultat d’une condition/comparaison peut être uniquement soit VRAI, soit FAUX
Ingrédients d’algorithmes Appel de fonction, p.ex. afficher(« Bonjour tout le monde »); resultat := racine_carre(16);
Ingrédients d’algorithmes Structure de contrôle Branchements conditionnels SI <condition> ALORS <bloc d’instructions> SINON
Ingrédients d’algorithmes Structure de contrôle Branchements conditionnels SI <condition> ALORS <bloc d’instructions> SINON Exemple: SI (score>meilleur_score) ALORS meilleur_score := score;
Ingrédients d’algorithmes Structure de contrôle Branchements conditionnels SI <condition> ALORS <bloc d’instructions> SINON Exemple: SI (score>meilleur_score) ALORS meilleur_score := score; En PASCAL : IF (score>meilleur_score) THEN meilleur_score := score;
Ingrédients d’algorithmes Structure de contrôle Branchements conditionnels multiples CAS mois DE ‘1': nom := « Janvier » ; ‘2': nom := « Février » ; ‘3': nom := « Mars » ; ‘4': nom := « Avril » ; ‘5': nom := « Mai » ; …. ‘12': nom := « Décembre » ; AUTREMENT afficher('Erreur dans le mois') ; FIN CAS;
Ingrédients d’algorithmes Structure de contrôle Boucle Définition : Suite d’instructions qui peut être exécuté plusieurs fois (itération) exécuté / exécutée
Ingrédients d’algorithmes Structure de contrôle Boucle TANT QUE <condition> FAIRE <bloc d’instructions> FIN TANT QUE ou FAIRE TANT QUE <condition>
Ingrédients d’algorithmes Structure de contrôle Boucle TANT QUE <condition> FAIRE <bloc d’instructions> FIN TANT QUE Exemple : Afficher les nombres entiers dont le carré est inférieur à 100. nombre := 1; TANT QUE (nombre*nombre<100) FAIRE afficher(nombre); nombre := nombre + 1;
Faire tourner un algorithme
nombrecarre := nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre := nombre + 1; FIN TANT QUE Chaque variable une colonne nombre nombrecarre
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre := nombre + 1; nombrecarre := nombre * nombre; FIN TANT QUE Chaque instruction une ligne nombre 1 nombrecarre
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE nombre 1 nombrecarre 1
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE nombre 1 nombrecarre 1
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE 1 nombre 1 nombrecarre 1
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE 1 nombre 1 2 nombrecarre 1
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE 1 nombre 1 2 nombrecarre 1 4
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE 1 nombre 1 2 nombrecarre 1 4
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE nombre nombrecarre
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE nombre nombrecarre
nombrecarre = nombre * nombre; TANT QUE (nombrecarre<100) FAIRE afficher(nombre); nombre = nombre + 1; FIN TANT QUE nombre nombrecarre
Ingrédients d’algorithmes Structure de contrôle Boucle FAIRE <bloc d’instructions> TANT QUE <condition>
Ingrédients d’algorithmes Structure de contrôle Boucle FAIRE jouer(); afficher(« Voulez vous rejouer (O/N) ? »); prendreDuClavier(charactere); TANT QUE (caractere= "O" OU caractere = "o");
Ingrédients d’algorithmes Structure de contrôle Boucle POUR POUR variable de valeur à valeur FAIRE <bloc d’instructions> FIN POUR
Ingrédients d’algorithmes Structure de contrôle Boucle POUR POUR variable de valeur à valeur FAIRE <bloc d’instructions> FIN POUR Exemple POUR i:=1 à 10 FAIRE afficher(i); afficher(i*i);
« FAIRE TOURNER » un algorithme Exemple: Tester si un nombre est premier Stratégie: Supposer que le nombre est premier jusqu’à on a trouvé un diviseur. FONCTION estPremier(nombre) estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; FIN TANT QUE FIN FONCTION jusqu’à on a trouvé / jusqu’à ce qu’on ait trouvé (subjonctif)
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre estPremier Diviseur resultat
EXEMPLE: resultat := testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat := testSiPremier(9); Nombre 9 estPremier Diviseur resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre % diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI FAUX Diviseur 2 3 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 4 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 4 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) : boolean; estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI FAUX Diviseur 2 3 4 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) estPremier := VRAI; Diviseur := 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; diviseur := diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 4 resultat
EXEMPLE: resultat = testSiPremier(9); FONCTION testSiPremier(nombre) estPremier = VRAI; Diviseur = 2; TANT QUE diviseur<nombre ET estPremier = VRAI FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier = FAUX; diviseur = diviseur + 1; FIN TANT QUE RETOURNER estPremier; FIN FONCTION EXEMPLE: resultat = testSiPremier(9); Nombre 9 estPremier VRAI Diviseur 2 3 FAUX resultat