Introduction à l’algorithmique
Introduction Algorithme: Procédure décrivant, étape par étape, une méthode permettant de résoudre un problème. Mot provenant du nom d’un mathématicien arabe du IXeme siècle El-Khawarizmi C’est la base de tout programme informatique Exemple: Recette de la sauce blanche: 1.Faire revenir l’oignon haché fin dans du beurre, 2.Ajouter la farine, bien mélanger; 3.Rajouter le lait chaud, et mélanger pour éviter les grumeaux; 4.Laisser mijoter 15 minutes
Algorithme: Suite finie d’instructions vérifiant: Chaque étape est décrite de façon précise; Chaque étape est déterministe: produit des résultats uniques; L’algorithme s’arrête après un nb fini d’instructions Reçoit des données en entrée; Produit des données en sortie; Généralité: Applicable à des ensembles différents de données d’entrée
Différence entre problème et instance du problème Exemple d’un problème: Tri d’un ensemble d’éléments –Entrée: Suite de n éléts a 1,…a n –Sortie: La suite réordonnée Instances du problème: –Suite de nombres: 475, 787, 34, 245, 56, 350 –Suite de noms: Pierre, Christine, Sylvie, Samuel, Fabien
Exemple d’un algorithme 1. x := a; 2. Si b>x, alors x := b; 3. Si c>x, alors x := c; := Opérateur d’assignation y := z signifie ``copie la valeur de z dans y’’. Valeur de z inchangée Paramètres d’entrée: a, b, c Valeur de sortie: x = max (a,b,c)
Pseudo-Code Algorithme maximum: Retourne le maximum de 3 entiers Entrée: Trois entiers a, b, c; Sortie: x contenant la valeur maximale parmi a, b, c 1. Procédure max(a,b,c) 2. x := a; 3. Si b>x alors // Si b plus grand que x, mettre x à jour 4.x := b; 5. Si c>x alors // Si c plus grand que x, mettre x à jour 6.x := c; 7. Retourner (x) 8. Fin max Trace de l’algorithme pour: a=1; b=5; c=3 x = 1 x = 5
Pseudo-Code: Notation proche du code des langages de programmation (C, Pascal). Notation standard mais pas rigoureuse Titre de l’algorithme, description brève, entrées, sorties Procédures consécutives Numéroter les lignes (facultatif) Procédure commence par le mot ``Procédure’’, suivit du nom, suivit des paramètres Instructions (lignes exécutables) entre ``Procédure’’ et ``Fin’’, exécutées l’une après l’autre Bloc d’instructions entre ``Début’’ et ``Fin’’ Ligne de commentaires signalée par // (ou /* */) ``Retourne (x)’’ termine une procédure et retourne la valeur de x
Instruction Si-Alors-Sinon (If-Then-Else) Si condition p vérifiée, exécuter action. Si p alors action Si p alors action 1; Sinon action 2; Si condition p vérifiée, exécuter action 1. Sinon, exécuter action 2. Si x ≥ 0 alors Début x := x-1; a := b+c; Fin Bloc de conditions entre Début et Fin.
Instruction Tant que Tant que p est vrai exécuter actionTant que p Faire action; Algorithme Plus-Grand-Element: Retourne la plus grande valeur d’une liste Entrée: n entiers S 1,…, S n Sortie: grand contenant le plus grand élément Procédure plus-grand (S,n) grand := S 1 ; i:=2; Tant que i ≤ n Faire Début Si S i > grand alors // une plus grande valeur a été trouvée grand := S i ; i := i+1; Fin Retourne (grand) Fin plus-grand; Trace de l’algorithme: n=4; S 1 = -2; S 2 =6; S 3 =5; S 4 =6 grand =-2i = 2 grand = 6i = 3 i = 4 i = 5
Instruction Pour (For) À chaque passage dans la boucle, var est incrémenté de 1. On s’arrête dès que var > limite Pour var := init à limite Faire action; Algorithme Plus-Grand-Element: Réécriture de l’algorithme précédent mais avec une boucle ``Pour’’ Entrée: n entiers S1,…, Sn Sortie: grand contenant le plus grand élément Procédure plus-grand (S,n) grand := S 1 ; Pour i =1 à n Faire Si S i > grand alors // une plus grande valeur a été trouvée grand := S i ; Retourne (grand) Fin plus-grand;
Subdivision d’un problème en sous- problèmes (plusieurs procédures) Problème: Trouver le plus petit nombre premier strictement supérieur à un entier positif donné –Procédure pour déterminer si un entier m est un nombre premier. Il suffit de tester si m est divisible par un entier entre 2 et m/2 –Utiliser cette procédure pour trouver le plus petit nombre premier p supérieur à un entier n.
Entrée: Un entier positif m Sortie: Vrai si m est premier, Faux si non. Procédure est-premier (m) Pour i := 2 à ENT(m/2) Faire Si m mod i = 0 alors // i divise m Retourne (Faux) Retourne (Vrai) Fin est-premier Entrée: Un entier positif n Sortie: Le plus petit nb premier m > n Procédure premier-plus-grand (n) m := n+1; Tant que est-premier(m) est Faux Faire m := m+1; Retourne(m) Fin est-premier Trace de premier-plus-grand pour n=8: m = 9 Trace de est-premier pour m=9: i=29 mod 2 = 1 9 mod 3 = 0i=3 m = 10 Trace de est-premier pour m=10: 10 mod 2 = 0 m = 11 Trace de est-premier pour m=11: 11 mod 2 = 1 i=511 mod 5 = 1
Algorithme d’Euclide Trouver le plus grand diviseur commun (pgcd) de deux entiers Définition: q est un diviseur commun de m et n si q divise à la fois m et n (le reste de la division entière est 0) Le pgdc de m et n est le plus grand entier q divisant à la fois m et n. Exemple: pgcd(4, 6) = 2; pgcd(3,8) = 1; pgcd(9, 12) = 3; Utile pour la simplification de fractions: 9/12 = 3.3/4.3 = 3/4
Théorème 1: Soient m, n et c trois entiers 1.Si c est un diviseur commun de m et n, alors c divise (m+n). 2.Si c est un diviseur commun de m et n, alors c divise (m-n). 3.Si c divise m, alors c divise mn Soient a, b deux entiers >0. Si on divise a par b, on obtient un reste r et un quotient q vérifiants: a = bq+r, avec 0≤r<b, et q≥0 À l’aide du théorème 1 on montre: Théorème 2: Soient a, b deux entiers positifs. Soient q le quotient et r le reste de la division entière de a par b. Alors pgcd(a,b) = pgcd(b,r)
Trouver le PGCD de a et b Exemple: pgcd(30, 105) 1ère méthode: Trouver tous les diviseurs de a et b, et trouver le diviseur commun le plus grand –Diviseurs de 30: 1, 2, 3, 5, 6, 10, 15, 30 –Diviseurs de 105: 1, 3, 5, 7, 15, 21, 35, 105 pgcd(30, 105) = 15 2ème méthode: Utiliser le théorème 2 –105 = Donc pgcd(105, 30) = pgcd(30,15) –30 = Donc pgcd(30, 15) = pgcd(15,0) –pgcd(15,0)=15 pgcd(105,30)=pgcd(30,15)=pgcd(15,0)=15 La méthode 2 est la méthode d’Euclide
Méthode d’Euclide Soient r 0, r 1 deux entiers strictement positifs, tels que r 0 =r 1.q+r 2 avec 0≤r 2 <r 1 Si r 2 = 0, pgcd (r 0, r 1 ) = r 1 Sinon, rediviser r i par r i+1 tant que r i+1 est différent de 0 Si r n est le premier reste nul, alors pgcd(r 0,r 1 ) = pgcd(r 1,r 2 ) = … =pgcd(r n-1,r n )= pgcd(r n-1,0) = r n-1
Algorithme d’Euclide Entrée: a, b deux entiers positifs Sortie: pgcd(a,b) Procédure pgcd(a,b) Tant que b pas 0 Faire Début diviser a par b: a = b.q+r, 0 ≤ r < b; a:=b; b:=r; Fin Retourner (a) Fin pgcd Trace de l’algorithme pour a=504 et b= a b a b a b a b
Procédure récursive Procédure qui s’invoque elle-même Exemple: n! = n(n-1)(n-2)…2.1 Si n≥0 0! = 1 n! = n(n-1)! pour n≥1 5! = 5.4!4! = 4.3!3! = 3.2!2! = 2.1!1! = 1.0! = 1 = 2 = 6 = 24 = 120 Toute procédure récursive doit avoir une condition d’arrêt: cas de base qui permet de ne plus invoquer la procédure. Ici, la condition d’arrêt est n=0
Entrée: Entier n≥0 Sortie: n! Procédure factoriel (n) Si n = 0 alors Retourne (1) Retourne (n. factoriel(n-1)) Fin factoriel Trace pour n =3: factoriel( 3 ): Retourne: 3. factoriel(2) factoriel( 2 ): Retourne: 2. factoriel(1) factoriel( 1 ): Retourne: 1. factoriel(0) factoriel( 0 ): Retourne: 1 1.1=1 2.1=2 3.2=6
Procédure itérative pour le calcul de n! Entrée: Entier n≥0 Sortie: n! Procédure factoriel-iteratif (n) res = 1; courant = n; Tant que courant>0 Faire res := res * courant; courant := courant-1; Fin Tant que Retourne (res) Fin factoriel-iteratif Trace pour n =3 : res = 1 courant = 3 res = 3courant = 2 res = 6courant = 1 res = 6courant = 0
Procédure récursive pour le calcul du pgcd Entrée: a, b deux entiers >0 Sortie: pgcd(a,b) Procédure pgcd-rec (a,b) Si b = 0 alors Retourner (a); diviser a par b: a = b.q+r, 0 ≤ r < b; Retourner (pgcd-rec (b,r)) Fin pgcd-rec Trace pour a=504 et b=396: pgcd-rec(504, 396) 504 = pgcd-rec(396, 108) 396 = pgcd-rec(108,72) 108 = pgcd-rec(72,36) pgcd-rec(36, 0) 36
Nombres de Fibonacci Exemple: Un robot peu avancer par des pas de 1 ou 2 mètres. Calculer le nombre de façons différentes de parcourir une distance de n mètres Distance Suite de pasNb de possibilités ,1 ou 22 31, 1, 1 ou 1, 2 ou 2, 13 41,1,1,1 ou 1,1,2 ou 1,2,1 ou 2,1,1 ou 2,25
Pas(n): Nombre de possibilités pour parcourir n mètres. Pas(1) = 1, Pas(2) = 2; Pour n>2: –Si premier pas = 1 mètres, il reste n-1 mètres -> Pas(n-1) –Si premier pas = 2 mètres, il reste n-2 mètres -> Pas(n-2) Donc, Pas(n) = Pas(n-1)+Pas(n-2) Entrée: n Sortie: Pas(n) Procédure pas-robot (n) Si n=1 ou n=2 alors Retourne (n) Retourne (Pas(n-1) + Pas(n-2) ) Fin pas-robot Séquence de Fibonacci: f 1 = 1 f 2 = 2 f n = f n-1 + f n-2 pour n>2