Algorithmes et structures de données 4ème cours Patrick Reuter maître de conférences preuter.
Algorithmes et structures de données Patrick Reuter maître de conférences preuter.
Transcript of Algorithmes et structures de données Patrick Reuter maître de conférences preuter.
Algorithmes et structures de données
Patrick Reutermaî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 lemeilleur score
Motivation
Structure de donnée:
- tableau a 2 dimension
Algorithmes:
- surtout I.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’éliminationdes parties cachées)
Motivation
Structure de donnée :
Graphe(pour plannifier destrajets)
AlgorithmeDé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.
Structure de donnéesDé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 :
nombreyi patrick x1
• Mais non pas :3xentré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;
Ingrédients d’algorithmes
• Condition/Comparaison
a = 7absent = FAUXmalade = VRAI OU vacances = VRAIscore > 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<bloc d’instructions>
Ingrédients d’algorithmes
• Structure de contrôle– Branchements conditionnels
SI <condition> ALORS
<bloc d’instructions>
SINON
<bloc d’instructions>
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<bloc d’instructions>
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)
Ingrédients d’algorithmes
• Structure de contrôle– Boucle
TANT QUE <condition> FAIRE<bloc d’instructions>
FIN TANT QUE
ou
FAIRE<bloc d’instructions>
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;
FIN TANT QUE
• Faire tourner un algorithme
nombre := 1;nombrecarre := nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre := nombre + 1;nombrecarre := nombre * nombre;
FIN TANT QUE
nombre nombrecarre
Chaque variable une colonne
nombre := 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre := nombre + 1;nombrecarre := nombre * nombre;
FIN TANT QUE
nombre
1
nombrecarre
Chaque instruction une ligne
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
nombrecarre
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
nombrecarre
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
nombrecarre
1
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
2
nombrecarre
1
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
2
nombrecarre
1
4
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre
1
2
nombrecarre
1
4
1
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre nombrecarre
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
FIN TANT QUE
nombre nombrecarre
nombre = 1;nombrecarre = nombre * nombre;
TANT QUE (nombrecarre<100) FAIREafficher(nombre);nombre = nombre + 1;nombrecarre = nombre * nombre;
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 FAIREafficher(i);afficher(i*i);
FIN POUR
« 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) ALORSestPremier := FAUX;
FIN TANT QUEFIN FONCTION
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
DiviseurestPremier
EXEMPLE: resultat = testSiPremier(9);
resultatNombre
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
DiviseurestPremier
EXEMPLE: resultat := testSiPremier(9);
resultatNombre
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
DiviseurestPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
2
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
2
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
2
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
23
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
23
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
23
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
23
estPremier
VRAI
FAUX
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
234
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
234
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
234
estPremier
VRAI
FAUX
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
234
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat
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
Diviseur
234
FAUX
estPremier
VRAI
Nombre
9
EXEMPLE: resultat = testSiPremier(9);
resultat