algorithmes et structures de données 3ème cours patrick reuter preuter

Post on 03-Apr-2015

115 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Algorithmes et structures de données

3ème cours

Patrick Reuter

http://www.labri.fr/~preuter

Ingrédients d’algorithmes

• Affectation

• Condition/Comparaison

• Appel de fonction

• Structure de contrôle– Branchements conditionnels (multiples)– Boucles

• Bloc d’instruction

Ajourd’hui

• Sondage

• Organisation de la mémoire

• Types de bases

Sondage

• o Compteur := 8 ;

• o Nom := "Patrick";

• o 7+3 := 10 ;

• o resultat := 20*5 ;

• o 20 := c ;

• o score := score + 10;

• o highscore := score;

Sondage

• o Compteur := 8 ;

• o Nom := "Patrick";

• o 7+3 := 10 ;

• o resultat := 20*5 ;

• o 20 := c ;

• o score := score + 10;

• o highscore := score;

Sondage

• o Compteur := 8 ;

• o Nom := "Patrick";

• o 7+3 := 10 ;

• o resultat := 20*5 ;

• o 20 := c ;

• o score := score + 10;

• o highscore := score;

BON : 16MOYEN : 0FAUX : 20

Sondage

BOUCLE

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>

Sondage

Bloc d’instruction à répéter :

writeln("J’adore les lundi");

i := i + 1;

Bloc d’instruction

Bloc d’instruction à répéter :

(toujours dans begin end s’il y a plusieurs)

begin

writeln("J’adore les lundi");

i := i + 1;

end

Boucle

Condition d’arrêt : i>5

while (i<=5) do

begin

writeln("J’adore les lundi");

i := i + 1;

end

Initialisation

var i : integer;

i := 1;

while (i<=5) do

begin

writeln("J’adore les lundi");

i := i + 1;

end

Sondage

var i : integer;

i := 1;

while (i<=5) do

begin

writeln("J’adore les lundi");

i := i + 1;

end

i

123456

Sondage

var i : integer;

i := 1;

while (i<=5) do

begin

writeln("J’adore les lundi");

i := i + 1;

end

i

123456

BON : 36MOYEN : 0FAUX : 11

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;

function estNegatif(entree : integer) : boolean;

débutsi (entree < 0) alors

result := true;sinon

result := false;fin;

function estNegatif(entree : integer) : boolean;

beginif (entree < 0) then

beginestNegatif := truewriteln(« valeure est négative »);

end;else

estNegatif := false;end;

function estNegatif(entree : integer) : boolean;

beginif (entree < 0) then

mw.lines.add(true);else

mw.lines.add(false);end;

NON !! Ne pas afficher à l’écran !!

function estNegatif(entree : integer) : boolean;

beginif (entree < 0) then

mw.lines.add(true);else

mw.lines.add(false);end;

NON !! Ne pas afficher à l’écran !!

function estNegatif(entree : integer) : boolean;

beginif (entree < 0) then

result := true;else

result := false;end;

function estNegatif(entree : integer) : boolean;

begin

if (entree < 0) then

result := true;

else

result := false;

end;

A := estNegatif(100);

C := estNegatif(-30);

function estNegatif(entree : integer) : boolean;

begin

if (entree < 0) then

result := true;

else

result := false;

end;

A := estNegatif(100);

C := estNegatif(-30);

BON : 30MOYEN : 10FAUX : 5

« FAIRE TOURNER » un algorithme

• Exemple: Tester si un nombre est premier

« 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.

« 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) : boolean;estPremier := VRAI;Diviseur := 2;TANT QUE diviseur<nombre ET estPremier := VRAI

FAIRESI (nombre MOD diviseur = 0) ALORS

estPremier := FAUX;Diviseur := Diviseur + 1;

FIN TANT QUEFIN FONCTION

« 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) : boolean;Diviseur := 2;TANT QUE diviseur<nombre FAIRE

SI (nombre MOD diviseur = 0) ALORSestPremier := FAUX;

SINONestPremier := VRAI;

Diviseur := Diviseur + 1;FIN TANT QUE

FIN FONCTION

FAUX !!!!

« 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) : boolean;Diviseur := 2;TANT QUE diviseur<nombre ET estPremier := VRAI FAIRE

SI (nombre MOD diviseur = 0) ALORSestPremier := FAUX;

SINONestPremier := VRAI;

Diviseur := Diviseur + 1;FIN TANT QUE

FIN 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

23

4

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

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

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

« 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 QUE

FIN FONCTION

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

DiviseurestPremier

EXEMPLE: resultat ← testSiPremier(9);

resultatNombre

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

DiviseurestPremier

EXEMPLE: resultat ← testSiPremier(9);

resultatNombre

9

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

DiviseurestPremier

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

2

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

2

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

2

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

23

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

23

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

23

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

23

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

23

4

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

23

4

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

23

4

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

23

4

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

23

4

FAUX5

estPremier

VRAI

FAUX

Nombre

9

EXEMPLE: resultat ← testSiPremier(9);

resultat

Sondage

Récursion

• Exemple :  factoriel(5);

• factoriel := 5 * 4 * 3 * 2 * 1;

Sondage

function factoriel(n : integer) : integer;beginvar resultat : integer;

if ((n = 0) OR (n = 1) thenresultat := 1;

else resultat = n * factoriel(n-1);

result := resultat;end

Condition d’arrêt : la fonction n’est plus appelé par elle-même

• Appel de fonction :  factoriel(5);

• factoriel := 5 * factoriel(5 - 1);

• factoriel := 5 * (4 * factoriel(4 - 1));

• factoriel := 5 * (4 * (3 * factoriel(3 - 1)));

• factoriel := 5 * (4 * (3 * (2 * factoriel(2 - 1))));

• factoriel := 5 * (4 * (3 * (2 * (1 ))));

Sondage

Complexité

Sondage

Jeux de cartes 54, sortir les jokers 1 minute

Jeux de cartes 108 joker, sortir les jokers 2 minutes

Comportement linéaire O(N)

Sondage

Trier 100 entrées 10 minutes

Trier 100 entrées 10 minutes

Puis les mettre ensemble quelques minutes

Trier 200 entrées

>> 20 minutes

Comportement quadratique O(N2)

Comportement quadratique O(N log N)

Sondage

Trier 100 entrées 10 minutes

Trier 100 entrées 10 minutes

Puis les mettre ensemble quelques minutes

Trier 200 entrées

>> 20 minutes

Comportement quadratique O(N2)

Comportement quadratique O(N log N)

BON : 7

FAUX : 38

top related