Algorithmes et structures de données Patrick Reuter maître de conférences preuter

Preview:

Citation preview

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

Recommended