Algorithmes et structures de données 3ème cours Patrick Reuter
Ingrédients dalgorithmes Affectation Condition/Comparaison Appel de fonction Structure de contrôle –Branchements conditionnels (multiples) –Boucles Bloc dinstruction
Ajourdhui 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 : 16 MOYEN : 0 FAUX : 20
Sondage BOUCLE
Ingrédients dalgorithmes Structure de contrôle –Boucle TANT QUE FAIRE FIN TANT QUE ou FAIRE TANT QUE
Sondage Bloc dinstruction à répéter : writeln("Jadore les lundi"); i := i + 1;
Bloc dinstruction Bloc dinstruction à répéter : (toujours dans begin end sil y a plusieurs) begin writeln("Jadore les lundi"); i := i + 1; end
Boucle Condition darrêt : i>5 while (i<=5) do begin writeln("Jadore les lundi"); i := i + 1; end
Initialisation var i : integer; i := 1; while (i<=5) do begin writeln("Jadore les lundi"); i := i + 1; end
Sondage var i : integer; i := 1; while (i<=5) do begin writeln("Jadore les lundi"); i := i + 1; end i123456i123456
Sondage var i : integer; i := 1; while (i<=5) do begin writeln("Jadore les lundi"); i := i + 1; end i123456i BON : 36 MOYEN : 0 FAUX : 11
Ingrédients dalgorithmes Structure de contrôle –Branchements conditionnels SI ALORS SINON
Ingrédients dalgorithmes Structure de contrôle –Branchements conditionnels SI ALORS SINON Exemple: SI (score>meilleur_score) ALORS meilleur_score := score;
Ingrédients dalgorithmes Structure de contrôle –Branchements conditionnels SI ALORS SINON 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ébut si (entree < 0) alors result := true; sinon result := false; fin;
function estNegatif(entree : integer) : boolean; begin if (entree < 0) then begin estNegatif := true writeln(« valeure est négative »); end; else estNegatif := false; end;
function estNegatif(entree : integer) : boolean; begin if (entree < 0) then mw.lines.add(true); else mw.lines.add(false); end; NON !! Ne pas afficher à lécran !!
function estNegatif(entree : integer) : boolean; begin if (entree < 0) then mw.lines.add(true); else mw.lines.add(false); end; NON !! Ne pas afficher à lécran !!
function estNegatif(entree : integer) : boolean; begin if (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 : 30 MOYEN : 10 FAUX : 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 FAIRE SI (nombre MOD diviseur = 0) ALORS estPremier := FAUX; Diviseur := Diviseur + 1; FIN TANT QUE FIN 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) ALORS estPremier := FAUX; SINON estPremier := 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) ALORS estPremier := FAUX; SINON estPremier := 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 Diviseur estPremier 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 Diviseur estPremier 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 Diviseur 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 % 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 2 3 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 3 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 3 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 3 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 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 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 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 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 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 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) ALORS estPremier 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 Diviseur estPremier 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 Diviseur estPremier 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 Diviseur 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 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 3 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 3 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 3 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 3 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 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 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 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 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 FAUX 5 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; begin var resultat : integer; if ((n = 0) OR (n = 1) then resultat := 1; else resultat = n * factoriel(n-1); result := resultat; end Condition darrêt : la fonction nest 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 Puis les mettre ensemble quelques minutes Trier 200 entrées >> 20 minutes Comportement quadratique O(N 2 ) Comportement quadratique O(N log N)
Sondage Trier 100 entrées 10 minutes Puis les mettre ensemble quelques minutes Trier 200 entrées >> 20 minutes Comportement quadratique O(N 2 ) Comportement quadratique O(N log N) BON : 7 FAUX : 38