Notions fondamentales d’Algorithmique François Bonneville - ARICIA 1
Ethymolologie Algorithme : du mathématicien perse Al-Khawarizmi (mort en 850 à Bagdad), le « père » de l’algèbre l’algo n’est donc pas « rythmique », à la différence du rock’n roll. Avez-vous déjà indiqué un chemin à un touriste égaré ? Avez vous fait chercher un objet à quelqu’un par téléphone ? Avez-vous déjà suivi une recette de cuisine ? Si oui, vous avez déjà conçu et fait exécuter des algorithmes. 2
Définition d’un algorithme Suite finie de règles à appliquer dans un ordre donné à un nombre fini de données pour arriver en un nombre fini d’étapes à un résultat Un algorithme est indépendant du langage dans lequel il est écrit et de l’ordinateur qui l’exécute
Qualités nécessaires pour concevoir un algorithme Avoir une certaine intuition : aucune méthode ne permet de savoir quelles instructions permettront d’obtenir le résultat voulu. Suivre le paradigme « diviser pour régner » : réduire chaque problème en problèmes plus petits Etre méthodique : évitez de sauter les étapes. Être rigoureux : chaque fois qu’on écrit une série d’instructions qu’on croit justes, vérifier systématiquement en se plaçant mentalement comme la machine qui va les exécuter. 4
Qualité d’un algoritme Lisibilité : respecter l’indentation, choisir judicieusement les noms de variables et de fonctions Terminaison : atteindre le résultat en un nombre fini d’étapes Validité : le résultat doit répondre au problème posé Faible complexité : en temps : nombre d’instructions élémentaires, nécessaires à sa réalisation en mémoire occupée
L’algorithmique : un art plus qu’une technique Pas de méthode générale Nécessite du talent = expérience + intuition Rechercher la simplicité : le simple est toujours beau Penser universel :savoir généraliser pour pouvoir réutiliser
Structures Un algorithme est une boite noire composée de mécanismes d’entrée / sortie de données de structures de données permettant de mémoriser les données du problème Variables typées Tableaux Structures chaînées par des pointeurs de structures de contrôle permettant de manipuler ces données Tests Itérations de structures fonctionnelles permettant de décomposer et de formaliser la succession des traitements
Types de programmation Programmation impérative décrit les opérations en séquences d'instructions Fortran, Cobol, Basic, Pascal, C, C++, Ada, Java, Python Programmation déclarative Programmation logique ensemble de règles et de fait Prolog Programmation fonctionnelle évaluation de fonctions Lisp, Scheme, Oz
Programmation impérative 2 types d'instructions : affectations et structures de contrôle L'affectation : opération qui permet d'attribuer une valeur à une variable. $variable = 4; (affectation d'une valeur) $variable = 4 + 3; (affectation d'une expression) $variable = 'Je suis '.$pseudo (utilisation d'une autre variable)
Entrées-Sorties Obtenir des données afficher enregistrer des données Méthodes pour accéder aux périphériques : Clavier, souris, écran, réseau, fichiers, cartes E/S Obtenir des données afficher enregistrer des données
Structures de contrôles (1) programme impératif = séquence d'instructions séquence = structure de contrôle implicite qui donne l'ordre d'exécution des instructions, souvent séparées par un point-virgule ou par des retours chariots. Bloc d'instruction : encadré par {} ou par des déclarations de fonctions ou de procédures
Structures de contrôles (2) Tests conditionnels SI Test Instruction 1 SINON Instruction 2 FIN SI Instruction 3
Structures de contrôles (3) Itérateur POUR compteur DE debut à fin Instruction 1 FIN POUR Instruction 2
Structures de contrôles (4) Boucle "tant que" à précondition TANTQUE Test Instruction 1 FIN TANTQUE Instruction 2
Structures de contrôles (5) Boucle "jusqu'à ce que" à postcondition REPETE Instruction 1 JUSQUACEQUE Condition 1 Instruction 2
Fonctions Une fonction possède : Un nom Des paramètres Un bloc de code Une valeur de retour int max(int a, int b) { if a > b return a else return b; }
Quelques exemples marquants Trouver le plus grand de 3 nombres a, b, c Mauvais réflexe : se précipiter sur la solution « évidente » Si a > b alors max_temp = a sinon max_temp=b Si c > max_temp alors max = c sinon max= max_temp
Règle n°1 : DIVISER POUR REGNER Réduire le problème en un problème plus simple : écrire une fonction Max Fonction max (n , m) { Si n>m alors max=n sinon max=m } La solution apparait alors simple et belle Maximum = max(max(a,b),c) Télémaintenance / contrôle à distance / Webcam
Règle n°2 : réfléchir avant de coder Problème : Ecrire une fonction qui teste si un mot est un palindrome (mot qui peut se lire de la même manière de gauche à droite ou de droite à gauche) Exemple : radar Mauvaise méthode : se précipiter à comparer la première lettre avec la dernière, puis la seconde avec l’avant dernière, etc… Réfléchir et constater qu’un palindrome est égal à son inverse Appliquer la règle n°1 : écrire une fonction inverse
Palindrome (itératif) Fonction inverse( mot ) { resultat= '' ; Pour i=1 à longueur(mot) resultat=char(mot,i)+resultat ; } Fonction palindrome( mot ) { si mot=inverse(mot) alors palindrome= vrai sinon palindrome=faux
Récursivité Fonction inverse( mot ) { inverse=inverse(mot(2,fin)) }
Structures de données Variables simples Types composés Types de données Nombres Entiers Réels Booléen Chaînes de caractères Types composés Langages objet : types composés + fonctions
Structures de données complexes Tableau de données Données accessibles par un index Réservation en mémoire → taille figée Exemples : tableauEntier[] = {9,4,2,6,8,7} tableauChaine[] = {'Bonjour','Au revoir', 'Salut'} TableauReels[] = new float[20]
Structures de données complexes Files et Piles File : premier arrivé, premier sorti Pile : dernier arrivé, premier sorti Collections Liste, ensemble
Conclusion Un bon algorithme est comme un couteau tranchant il fait exactement ce que l’on attend de lui, avec un minimum d’efforts. L’emploi d’un mauvais algorithme pour résoudre un problème revient à essayer de couper un steak avec un tournevis : vous finirez sans doute par obtenir un résultat digeste, mais vous accomplirez beaucoup plus d’efforts que nécessaire, et le résultat aura peu de chances d’être esthétiquement satisfaisant