Information, Communication, Calcul Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne fait partie du cours d’introduction à l’information, à la communication, et au calcul. Il est le 3e de 7 videoclips portant sur les notions de calcul et d’information. Information, Communication, Calcul Module 1: Calcul & Information – Leçon 1: Algorithmes – Clip 3: Contrôle R. Guerraoui, J. Sam, J-C. Chappelier, R. Boulic, commentaire: P. Janson
Plan de la leçon Qu’est-ce qu’un algorithme? Quelles structures existent pour contrôler un algorithme? Quelques grandes familles d’algorithmes Recherche Exemple: recherche par dichotomie Comment quantifier et exprimer la complexité d’un algorithme Tri Plus court chemin Plus spécifiquement il aborde la question des structures de CONTROLE permettant de guider le déroulement d’un algorithme
Terminologie Un algorithme effectue des opérations ou instructions sur des données Des structures de données (voir leçon 1.4) Permettent à un algorithme de mémoriser les données pour y accéder selon ses besoins Pour y accéder il doit pouvoir y faire référence => leur donner des noms / identificateurs Une donnée nommée est ce qu’on appelle une variable Des structures de contrôle (ce clip) Groupent les opérations en expressions Indiquent à un algorithme l’ordre dans lequel effectuer ces opérations selon les données opérations = opérateurs Expression Delta <= b2 – 4*a*c Expression variables = opérandes - Le videoclip précédant a expliqué qu’un algorithme traite des données au moyen d'opérations. Reste à définir plus précisément en quoi consistent des données et des opérations. Les données sont organisées en structures (dont on parlera plus tard dans la 4e leçon de ce module). Elles ont pour but de permettre aux algorithmes de mémoriser les données qu’ils traitent et de les utiliser en y faisant référence par des noms ou identificateurs qui les distinguent. Une donnée distinguée par son propre nom ou identificateur est ce qu’on appelle une variable. Les opérations sont aussi organisées en structures (qui sont le thème du présent videoclip). Ces structures groupent les opérations en expressions qui indiquent à l’algorithme l’ordre dans lequel elles doivent être exécutées. Cet ordre est typiquement déterminé par les données-mêmes que l’algorithme traite. Si on considère la fameuse formule du delta figurant dans le calcul des racines d’une équation du second degré, cette formule n’est rien d’autre qu’une expression combinant des opérations de multiplications, de soustraction, et d’affectation de façon à manipuler des variables traditionnellement appelées a, b, et c.
Opérations / Instructions élémentaires Il existe deux types d’opérations / instructions: Elémentaires Opération / instruction de coût constant, indépendant des données qu’elle traite Exemple: affecter une nouvelle valeur à une variable Delta <= b2 – 4*a*c Non-élémentaires Opération / instruction de coût variable, dépendant des données qu’elle traite Exemple: compter le nombre de caractères contenus dans une phrase (dépend de la longueur de la phrase) - Il existe 2 grands types d'opérations ou instructions. Les instructions élémentaires, dont le coût est constant et indépendant des données traitées, par exemple l’affectation d’une nouvelle valeur à une variable comme delta, et… … et les instructions non-élémentaires, dont le coût est variable et dépend des données traitées, par exemple l’opération de comptage des caractères d’une phrase qui dépend évidemment de la longueur de la phrase.
Structures de contrôle Par défaut un algorithme exécute une série d’instructions de façon séquentielle Une instruction après l’autre Une séquence d’instructions suffit à exprimer certains algorithmes simples Exemple: la suite de multiplications, soustraction, puis affectation de l’expression Delta <= b2 – 4*a*c La majorité des algorithmes intéressants requièrent un contrôle plus complexe L’ordre d’exécution n’est pas strictement séquentiel Il dépend des données traitées et peut être modifié par 2 ou 3 structures de contrôle non-séquentielles Des branchements conditionnels Des boucles (conditionnelles) Des itérations Comme nous l’avons déjà mentionné, les structures de contrôle rencontrées dans un algorithme lui indiquent dans quel ordre exécuter les différentes instructions qui le composent. - Par défaut l’ordre normal d’exécution est séquentiel: les instructions sont exécutées l’une après l’autre. Une telle suite d’instructions séquentielles suffit pour réaliser certains algorithmes simples. Par exemple le calcul du fameux delta dont nous parlions est une simple séquence de multiplications, soustraction, puis affectation de la valeur calculée à delta. En pratique, la majorité des algorithmes intéressants requièrent cependant des structures de contrôle beaucoup plus sophistiquées et non séquentielles. Des suites d’instructions purement séquentielles sont typiquement interrompues par des structures de contrôle qui rompent la séquentialité. Selon le point de vue, on reconnaît 2 ou 3 types de structures de contrôle capables de rompre une pure séquence: Une structure de branchement sous condition et … Une structure en boucle répétitive avec terminaison sous condition À ces deux structures s’ajoute souvent une structure itérative qui, comme nous le verrons, revient à une combinaison des 2 structures précédentes
3 structures de contrôle non-séquentielles Branchements conditionnels Exemple: Si ∆=0 {X1 <= -b/2, X2 <= -b/2} Sinon {X1 <= −b− ∆ 2a , X2 <= −b+ ∆ 2a } Boucles conditionnelles Exemple: Tant que on n’est pas au bout de la phrase {ajouter 1 au compteur de caractères rencontrés} Itérations Exemple: calculer la somme des 10 premiers nombres entiers S <= 0 Pour n allant de 1 à 10 {S <= S + n} On peut toujours utiliser une boucle conditionnelle pour réaliser une itération - Un branchement conditionnel est une instruction qui rompt une séquence pure sous une condition donnée. Par exemple, comme on le voit ici, une équation du second degré admet des racines égales ou non selon que son fameux delta est nul ou non. Ceci peut s’exprimer en termes algorithmiques par une formule du style SI (telle condition est remplie) … … ALORS (exécuter la séquence d’instructions suivante) … … SINON (exécuter cette autre séquence d’instructions) … en rouge sur cette planche Une boucle conditionnelle est une suite d’instructions séquentielles qui doit être répétée jusqu’à ce qu’une condition donnée (positive ou négative) soit remplie. Par exemple, compter le nombre de caractères dans une phrase est clairement répétitif puisqu’il faut totaliser une unité de plus pour chaque caractère rencontré. Mais cette répétition doit être interrompue quand on arrive en fin de phrase, ce qui peut être indiqué par une ponctuation ou un autre caractère spécial. par une formulation du style TANT QUE (telle condition est ou n’est pas remplie) … … (exécuter la séquence d’instructions suivante) en rouge sur cette planche. Une itération est aussi une suite d’instructions séquentielles qui doit être répétée non pas jusqu’à ce qu’une condition soit remplie mais bien un nombre de fois connu ou donné a priori. Ainsi, par exemple, si on désire calculer la somme des 10 premiers nombres entiers, on doit répéter 10 fois une opération qui additionne le Nème nombre à la somme courante des N-1 nombres déjà totalisés. par une formulation du style POUR (telle variable) … … ALLANT DE (telle valeur initiale) A (telle valeur finale) … On voit donc tout de suite qu’une telle itération est équivalente à une boucle conditionnelle dont la condition de terminaison est connue a priori.
Itérations et boucles conditionnelles Exemple: calculer la somme des 10 premiers nombres entiers S <= 0 i <= 1 Tant que i ≤ 10 {S <= S + i i <= i + 1} est évidemment parfaitement équivalent à Pour i allant de 1 à 10 {S <= S + i} On peut toujours utiliser une boucle conditionnelle pour réaliser une itération Ceci est clairement illustré par la planche présente. On y voit qu’on peut tout aussi bien calculer la somme des 10 premiers entiers soit en utilisant un compteur i qui est incrémenté à chaque exécution de la boucle, laquelle est répétée tant que i ≤ 10, soit en répétant une boucle 10 fois sous le contrôle d’un compteur qui peut s’appeler i.
Exemple d’algorithme Le cargo-bot https://www.youtube.com/watch?v=i56nbx_6nLc est un automate programmable qui exécute un algorithme pilotant une grue La vidéo de R. Guerraoui http://wandida.com/fr/archives/513 illustre un algorithme calculant les solutions d’une équation du second degré du type ax2 + bx + c = 0 Si a = 1 et ∆ = b2 - 4c, les solutions réelles sont si ∆ > 0 −b− ∆ 2 , −b+ ∆ 2 si ∆ = 0 -b/2 sinon 0 Cet algorithme simple parce que déjà bien formalisé mais un algorithme peut devenir (très) complexe (voir leçon 1.2) Le cargo-bot est un exemple d’automate programmable qui suit un algorithme pour piloter une grue. Nous vous conseillons vivement de visionner la vidéo correspondante sur YouTube. - Un autre exemple d’algorithme est fort bien illustré par une vidéo du Prof. R. Guerraoui que nous vous recommandons aussi vivement de visionner. Cet algorithme calcule les racines d’une équation du second degré telle que celle représentée ici, dans laquelle le paramètre typiquement appelé a est égal à 1. D’un point de vue purement mathématique, comme représenté ici en vert, les formules pour le calcul des deux racines sont bien connues. Exprimer cela sous forme algorithmique est relativement simple vu que ces formules sont elles-mêmes des expressions déjà relativement formelles.
Exemple formalisé Algorithme second degré Entrée: b, c Sortie: x1, x2 réels ∆ <= b2 – 4c Si ∆ < 0 x1 <= 0; x2 <= 0 sortir : {x1, x2} Sinon Si ∆ = 0 x1 <= −b/2; x2 <= −b/2 x1 <= −b− ∆ 2 ; x2 <= −b+ ∆ 2 ∆ <= b2 – 4c x1 <= 0 x2 <= 0 oui La présente planche illustre deux formalismes différents, l’un plus graphique, l’autre plus tabulaire, pour exprimer le même calcul algorithme des racines d’une telle équation du 2nd degré. La partie gauche de la planche représente l’enchaînement des opérations sous la forme d’un diagramme dit de flux, dans lequel les parties séquentielles sont représentées par des rectangles aux angles arrondis, alors que les branchements conditionnels sont représentés par des losanges dont les sorties sont libellées par la valeur logique des conditions testées. La partie droite de la planche représente l’enchaînement des opérations sous la forme d’une table spécifiant 1°/ le titre de l’algorithme, 2°/ les données qu’il attend en entrée et celles qu’il fournit en sortie, et 3°/ la suite des opérations à exécuter, y compris certaines opérations affectant le séquencement des instructions selon la valeur du delta, et exprimées dans le langage semi-formel utilisé antérieurement pour définir de telles structures de contrôle, dans le cas présent uniquement des branchements conditionnels. ∆ < 0 non oui non ∆ = 0 sortir : {x1, x2} x1 <= −b/2 x2 <= −b/2 x1 <= −b−√∆/2 x2 <= −b+√∆/2 sortir : {x1, x2} sortir : {x1, x2}
Conclusion & résumé Un algorithme utile devrait toujours Se terminer et … Produire le bon résultat … Quelles que soient les données d’entrée Malheureusement on ne peut jamais Prouver ces propriétés empiriquement Ni même les garantir mathématiquement dans tous les cas => Importance du soin à apporter à la conception d’un algorithme - En conclusion et en résumé, on souhaiterait que tout algorithme Se termine toujours Fournisse lors de sa terminaison des résultats corrects ou en tout cas attendus Et ceci quelles que soient les données qui lui sont soumises Malheureusement On ne peut jamais vérifier ces propriétés empiriquement Il n’est en effet pas possible de les tester pour toutes les combinaisons d’entrées possibles vu leur nombre potentiellement astronomique On peut tout au plus tenter de les prouver mathématiquement mais même cela n’est pas faisable dans tous les cas. Ceci souligne donc clairement combien la prudence et le soin sont importants dans la conception d’un algorithme utilisable.