MATHMATIQUES DISCRTES Chapitre 2 section 1 Franois Meunier
































- Slides: 32
MATHÉMATIQUES DISCRÈTES Chapitre 2 (section 1) François Meunier DMI
Algorithmes Fondement de la programmation et du développement de logiciel. l Généralement, un algorithme représente une procédure définie effectuant une tâche donnée. l Un programme est une description d’un algorithme, écrit dans un language qu’un ordinateur peut interpréter, utilisant que des opérations que l’ordinateur peut exécuter. l Un programme est l’implémentation de son algorithme correspondant. l
Algorithmes déjà utilisés l Arithmétique: Addition de deux nombres naturels sous forme décimale, en utilisant la retenue. l Similaire: Soustraction en utilisant l’emprunt. l Multiplication & division. l l Votre recette de cuisine préférée. l Comment vous inscrire aux cours de l’UQTR. l Comment voter au. X élection. S.
Langages de programmation l Langages programmation communs: Récents: Java, C, C++, C#, Visual Basic, Java. Script, Perl, Tcl, Pascal, et autres… l Anciens: Fortran, Cobol, Lisp, Basic l Assembleurs, codage de bas-niveau. l l Dans ce cours, nous utiliserons un langage “pseudo-code”.
Exemple d’Algorithme (Français) l Tâche: Avec une séquence {ai}=a 1, …, an, ai N, trouver le plus grand élément. l Algorithme correspondant, en Français: Initialiser une variable temporaire v (valeur la plus grande actuelle) à la valeur de a 1. l Inspecter les prochains éléments ai dans la séquence. l SI ai>v, Alors ré-initialiser v avec la valeur de a i. l Répéter les 2 dernières étapes tant qu’il y a des éléments dans la séquence, & retourner v. l
Execution d’un Algorithme Quand un logiciel est démarré, son programme ou son algorithme est alors exécuté par un ordinateur. l Avec un algorithme, nous pouvons aussi faire l’exécution à la main, en parcourant chacune des étapes de façon crayon-papier. l Avant ~1940, “ordinateur” signifiait une personne dont la tâche était d’exécuter des algorithmes. l
Exécution de l’algorithme Max l Avec {ai}=1, 7, 12, 3, 15, 8, 5. Trouver le maximum… l Initialiser v = a 1 = 1. l Inspecter l’élément: a 2 = 7. l SI a 2>v? OUI, alors v est initialisé à 7. l Inspecter l’élément : a 3 = 12. l SI 12>7? OUI, v est initialisé à 12. l SI 3>12? NON, v reste inchangé. l SI 15>12? OUI, v est initialisé à 15.
Caractéristiques d’un Algorithme l l l l Input: Informations entrantes. Output: Informations sortantes. Précision: Algorithme définit précisément. Correctitude: Outputs reliés aux inputs. Finitude: Exécutable dans un temps fini. Efficacité: Chaque instruction est exécutable. Généralité: Fonctionne pour différents inputs. Efficience: Utilise un minimun de ressources (CPU, mémoire).
Langage Pseudocode procédure nom(argument: type) variable : = expression Énoncés informels début énoncés fin {commentaires} si condition alors énoncés [sinon énoncés] pour variable : = valeur initiale à valeur finale faire énoncés tant que condition faire énoncés nomproc(arguments) retourne expression
procédure nomproc(arg: type) l Permet de définir une procédure nomproc avec comme inputs (arguments) arg qui sont des objets de type. l Exemple: procédure maximum(L: liste d’entiers) [énoncés cherchant le maximum…]
variable : = expression l Un énoncé d’assignation évalue l’expression, et réassigne la variable à la valeur du résultat. l Exemple d’assignation: v : = 3 x+7 (si x est 5, v devient 22. ) l En pseudocode, une expression peut être exprimée de façon informelle: l x : = entier le plus grand de la liste L
Énoncé Informel l Nous pouvons écrire un énoncé informel en français, si son sens reste clair et précis: ex: “permuter x et y” l Seulement possible en pseudo-code. l Un algorithme ne doit pas être trop général, trop vague. l Décomposer un algorithme en étapes assez detaillées.
début énoncés fin l Grouper une séquence d’énoncés ensemble: début énoncé 1 énoncé 2 … énoncé n fin Parenthèses {} sont utilisées dans plusieurs langages. Cette séquence est utilisée comme un seul énoncé. l Peut être utilisé: l l Après la déclaration d’une procédure. Dans un énoncé si après le alors ou le sinon. Dans le corps des boucles pour ou tant que.
{commentaire} l Pas exécuté (ne fait rien). l Texte en Langage-Naturel exprimant certains aspects de la procédure aux lecteurs humains. l Aussi appelé remarque (REM) dans des langages de programmation, ex: . BASIC. l Exemple, du programme max: l {Noter que v est le plus grand entier trouvé actuellement pour un i donné. }
si condition alors énoncé l Évaluation condition. de l’expression propositionelle Si le résultat de la proposition est VRAIE, alors exécuter les énoncés; l autrement, passer aux énoncés suivant l’énoncé si. l l Variante: énon 2 l si cond alors énon 1 sinon ssi cond est Fause, exécuter énon 2.
tant que condition énoncés l Évaluer l’expression propositionelle (Booléenne) condition. l Si le résultat est Vrai, alors exécuter énoncés. l Répéter ces deux actions tant que condition n’est pas Fause; alors poursuivre au prochain énoncé.
pour var : = début à fin énoncés début une expression entière. l fin une expression entière. l Sens: Répéter l’exécution des énoncés, avec la variable var : = début, ensuite avec var : = début+1, ensuite avec var : = début+2, etc. , avec finallement var : = fin. l Question: Qu’arrive-t-il si énoncés changent la valeur de var, ou les valeurs des expressions de début ou fin ? l
pour var : = début à fin énoncés l Le pour peut être exprimé en terme du tant que: début var : = début tant que var fin début énoncés var : = var + 1 fin
procédure(argument) l Un appel de la procédure, en fournissant en input les valeurs des expressions argument. l Plusieurs langages de programmation réfèrent à la notion de fonctions (un appel de procédure est similaire à l’application d’une fonction f(x)), ou sousroutines, sous-programmes, ou méthodes.
Procédure Max en pseudocode procédure max(a 1, a 2, …, an: entiers) v : = a 1 {premier élément plus grand} pour i : = 2 à n {visiter les autres éléments} si ai > v alors v : = ai {autre plus grand} { v correspond à la valeur la plus grande de la liste} retourner v
Exemple de création d’algorithme l Supposons que nous voulons écrire un algorithme qui évalue le prédicat: Est. Premier: N→{T, F} l Détermine si un nombre naturel donné est premier. l Définir une première forme de cette fonction en logique des prédicats: n: Est. Premier(n) ¬ 1<d<n: d|n d divise n sans reste
Exemple Est. Premier , suite… l Notez que la forme existentielle peut être réécrite sous forme universelle : ¬ 1<d<n: d|n l 1<d<n: d | n 2≤ d ≤ n− 1: d | n d ne divise pas n de façon entière (reste ≠ 0) La forme universelle peut être traduite directement sous forme d’un énoncé de boucle pour: pour d : = 2 to n− 1 { Tester les diviseurs >1 & <n } si d|n alors retourner F {n a un diviseur d; non premier} retourner V { aucun diviseur; n est premier}
Optimiser Est. Premier l Optimisation possible: l Théorème soujacent: Si n a des diviseurs entiers, d ≤ n 1/2. Notez un intervalle de pour d : = 2 à n 1/2 si d|n alors retourner F recherche plus petit. retourner V Preuve: Supposons un diviseur de n, a > 1, avec b : ≡ n/a. Alors n = ab, mais si a > n 1/2 alors b < n 1/2 (sachant que a est le plus petit diviseur) et n = ab = (n 1/2)2 = n, donc b serait alors un diviseur < que a ce qui est une contradiction.
Autre exemple l Problème de recherche dans une liste ordonnée. Avec une liste L de n éléments triés dans un ordre donné (ex: numérique, alphabétique), l Avec un élément x donné, l Déterminez si x est dans la liste, l Si présent, retourner la position de x dans la liste. l
Algo. #1: Recherche Linéaire procédure recherche linéaire (x: entier, a 1, a 2, …, an: suite d’entiers) i : = 1 {commencer au début de la liste} tant que (i n x ai) faire {TTQ non trouvé} i : = i + 1 {prochaine position} fin si i n alors position : = i {trouvé} sinon position : = 0 {non trouvé} retourner position {0 si non trouvé}
Algo. #2: Recherche Binaire lÀ chaque étape, inspecter l’élément milieu de la liste résiduelle pour la séparer en deux et en éliminer aussi la moitié pour ainsi converger vers l’élément recherché. <x <x <x >x
Algo. #2: Recherche Binaire procédure recherche binaire (x: entier, a 1, a 2, …, an: suite d’entiers) i : = 1 {extrémité gauche de l’intervalle} j : = n {extrémité droite de l’intervalle} tant que i<j début {TTQ intervalle >1 élément} m : = (i+j)/2 {point milieu} si x>am alors i : = m+1 sinon j : = m fin si x = ai alors position : = i sinon position : = 0 retourner position
Autres exercises l Algorithme qui calcule la somme des valeurs entières d’un liste. l procédure somme(a 1, a 2, …, an: entiers) s : = 0 {accumulateur} pour i : = 1 à n faire {parcourir la liste} s : = s + ai {+ l’élément ai} {s est la somme de tous les éléments} retourner s
Algorithme de tri l Les opérations de tri sont communes dans plusieurs applications. l Ex: tableurs, BD l Aussi utiliser comme fonction dans des algorithmes de traitement de données. l Deux algorithmes de tri: Tri à bulle l Tri par insertion l Peu efficaces, ne devraient pas être utilisés sur de larges BDs
Tri à bulle l Les éléments les plus petits montent en haut de la liste. 30 31 1 32 33 2 34 3 30 1 31 32 2 33 3 34 1 30 31 2 32 3 33 34 1 30 2 31 3 32 33 34 1 2 30 3 31 32 33 34 1 2 3 30 31 32 33 34
Tri par insertion l Description l de l’algorithme: Pour chaque élément de la liste, l “Insérer” cet élément à la position appropriée dans la liste triée générée actuellement: l l l Faire une recherche binaire pour trouver la position où doit être inséré le nouvel élément. Déplacer les éléments déjà triés de une position vers le bas. Insérer le nouvel élément à la position laissée vacante.
Revue: Algorithmes l Caractéristiques des algorithmes. l Pseudocode. l Exemples: Algorithmes Max, nombre premier, recherche linéaire & binaire, de tri. l Comment évaluer formellement l’efficacité des algorithmes?