



























Étudies grâce aux nombreuses ressources disponibles sur Docsity
Gagnz des points en aidant d'autres étudiants ou achete-les avec un plan Premium
Prépare tes examens
Étudies grâce aux nombreuses ressources disponibles sur Docsity
Obtiens des points à télécharger
Gagnz des points en aidant d'autres étudiants ou achete-les avec un plan Premium
Communauté
Demandes de l'aide à la communauté et dissipes tes doutes concernant l'étude
Guide gratuite
Télécharges gratuitement nos guides sur les techniques d'étude, les méthodes de gestion de l'anxiété, les conseils pour la thèse réalisés par les tuteurs Docsity
Exercices d’informatique sur l'initiation à l’algorithmique. Les principaux thèmes abordés sont les suivants: Discours de la Méthode, Quelques d´efinitions et quelque syntaxe, Arbre, pile et trace des appels.
Typologie: Notes
1 / 35
Cette page n'est pas visible dans l'aperçu
Ne manques pas les parties importantes!




























emes 4 TABLE DES MATI ERES eme impl´ementationa l’aide d’un tasCe cours est d´edi´e aux ´etudiants de 1ere ann´ee de l’Enseirb sp´ecialit´e infor- matique. Son intitul´e “Initiationa l’algorithmique” est d’un certain point de vue un contresens. Tous les ´etudiants de l’Enseirb b´en´eficient d’une solide culture math´ematique et ont donc n´ecessairement de larges connaissances en algorithme. En effet, la quasi totalit´e des objets math´ematiques qu’ils ont rencontr´e depuis leur plus tendre ˆage ont ´et´e d´efinis de fa¸con calculatoire. L’objet de ce cours est donc de s’appuyer sur ces connaissances et ce qu’elles recelent d’intuition pour pr´esenter diff´erentes m´ethodes g´en´erales pour fournira un probleme une ou plusieurs solutions algorithmiques. Nous insisterons sur la n´ecessit´e pour r´esoudre un probleme de le d´ecouper en sous-problemes auxiliaires, de r´esoudre ainsi le premier probleme avant mˆeme d’avoir r´esolu ces problemes auxiliaires. Cette approche descendante que nous suggere Descartes (Chapitre 1) est pr´esent´ee dans le Chapitre 4. Ce principe universel rappel´e, nous pr´esenterons des m´ethodes de r´esolution de probl`emes qui ont pour nom :
es souvent contradictoires. Un algorithme tres rapide en temps s’´ecrit de fa¸con plus complexe. Cette opposition apparaˆıt dans l’´ecriture r´ecursive : dans de tres nombreux cas, celle-ci offre une d´efinition tres simple mais utilise des ressources en espace non constant, alors qu’une version it´erative plus compliqu´ee `a d´efinir utilise moins d’espace. Pour cette raison, nousaurons soin pour certains problemes d’´ecrire plusieurs solutions algorithmiques, chacune ayant une qualit´e singuliere. La r´esolution du probleme Tri conclura ce cours en illustrant l’int´erˆet des m´ethodes pr´esent´ees plus haut. Ce cours n’est pas un cours d’algorithmique et structures de donn´ees. Il ne contiendra pas notamment les classiques notions de Pile, Liste et File, d’arbres ou de graphes, ni leurs d´efinitions, nia fortiori leurs impl´ementations. Les exemples de problemes concernant autant que faire ce peut des objets simples comme les bool´eens, les entiers ou des objets d´eja tres familiersa tous les ´etudiants comme les tableaux ou matrices. Nous pouvons conseiller quelques documents :
a http://www.enseirb.fr/~lapoire/1ereAnnee/InitiationAlgorithme/Cours/. Nous rappelons que ce document est disponible sous forme papier. Il n’est donc pas utile de l’imprimer. Les remarques, corrections ´eventuelles sont les bienvenues et peuvent ˆetre adress´eesa [email protected].a l’algorithmique” de Cormen and Co. Collection Dunod. Cet ouvrage est pr´esenta la bibliotheque de l’Enseirb. Il est complet, long (plus de 1000 pages) et couvre l’ensemble des notions vues dans ce cours dans de nombreux autres cours d’Informatique de l’Enseirb. Les chapitres concern´es par ce cours sont les chapitres 1, 2, 3, 4, 6, 7, 15, 16 et 28. Remerciementsa Jean-Luc Migot, promotion 2015, pour les corrections ap- port´ees.Dans ce chapitre, nous pr´esentons le pourquoi d’un algorithme : sa raison d’ˆetre est de r´esoudre un probl`eme.
Nous pr´esenterons en outre un langage de description algorithmique. Celui-ci est propre a ce cours. Il a ´et´e choisi pour des raisons de simplicit´e et de proximit´e avec d’autres langages comme le langage C. Les problemes et les algorithmes sont des objets distincts qui ne sont pas en re- lation bijective. Ainsi, a un probleme correspond ou aucun algorithme le r´esolvant ou une infinit´e (certains meilleurs que d’autres). R´eciproquement, tout algorithme (sauf un : voir exercice) est solution algorithmique de plusieurs probl`emes voire d’une infinit´e!
La raison d’ˆetre d’un algorithme est de r´esoudre un probleme. La plus grande attention doit ˆetre port´eea la compr´ehension du probl`eme, faute de quoi l’algo- rithme n’a aucune chance d’ˆetre correct.
Le langage utilis´e pour la d´efinition d’un probleme est un langage scientifique utilisant pour des raisons de simplicit´e une langue naturelle (le fran¸cais par ex- emple) ou, pour lever toute ambiguit´e, un langage logique. La compr´ehension du probleme n´ecessite la maˆıtrise de ce langage.
Un probleme est une relation binaire liant deux objets ou deux s´equences d’objets de types fix´es. Un exemple de probleme est :
probl`eme Puissance Entr´ee : un r´eel x 6 = 0, un entier n Sortie : le r´eel xn
Le type bool´een
Le type le plus ´el´ementaire est sans contestation possible le type de nom bool´een, dont le domaine est compos´e des deux seuls ´el´ements vrai et faux et d´efini par les cinq op´erations :
Pourquoi un type abstrait
Except´e le type bool´een ou plus g´en´eralement tout type a domaine fini, la d´efinition d’un typea des fins de calculs pose des difficult´es. Supposons que l’on veuille d´efinir un type r´eel et d´efinir quelques op´erateurs et comparateurs bien utiles comme par exemple +, ., inv, √, ≤. Dans le monde r´eel (concret), deux solutions s’offrent `a nous :
a l’aide d’un autre r´eel l’approchant. Le type float dit “a virgule flottante 32 bits IEEE” code un r´eel r sur 4 octets en approchant tout r´eel par un triplet compos´e d’un bit de signe, d’un exposant sur 8 bits et d’une “mantisse” sur 23 bits. Les r´esultats sont toujours faux, selon une approximation qui d´epend de la qualit´e des fonctions fournies.a l’aide d’une expression d´ecimale avec puissance maisa l’aide d’une expres- sion. Ainsi, inv(pi()) repr´esente l’inverse de π. Les calculs r´ealis´es d´ependent naturellement de l’´etat des connaissances impl´ement´ees ou non qui perme- ttent ce calcul formel.Ces deux solutions ont pour d´esavantage l’une de fournir des r´esultats (presque) toujours erron´es, et l’autre de ne pouvoir fournir une r´eponse que dans un nombre limit´e de cas. Pour cette raison, pour r´esoudre un probleme algorithmique concret, nous d´ecomposerons celui-ci en deux sous-problemes.
a ´etudier, en l’am´enageant ou non, l’algorithme pr´ec´edent en consid´erant son ex´ecution sur un type r´eel concret. Notre enseignement ne sera concern´e que par le premier aspect. Le second aspect n´ecessite de connaˆıtre le contexte pr´ecis de r´esolution des problemes et sera abord´e dans d’autres cours. En clair, le type abstrait permet d’oublier ou de s’accommoder, dans un pre- mier temps, de la petitesse de notre monde r´eel et de simplifier le probleme en le situant dans un monde plus abstrait. Ce monde abstrait peut-ˆetre consid´er´e comme une premiere approximition du monde r´eel et permet ainsi d’identifier plus simplement la partie essentielle des probl`emes algorithmiques ´etudi´es.Voici quelques types d’entiers que nous aurons `a consid´erer :
Un type entier concret : le type int
Ce type fourni par le langage C manipule des entiers cod´es sur 4 (parfois
Un type entier concret : le type entierLong
Ce type permet de manipuler des entiers n sur un espace m´emoire non con- stant ´egal a log 2 (n) bits et r´ealise les op´erations courantes selon une complexit´e en temps tres souvent non constante (par exemple, log 2 (n) pour l’addition).
Le type le plus souvent consid´er´e dans cet enseignement est le type inimpl´ementable suivant :
Un type entier abstrait : le type entier
Ce type permet de manipuler des entiers utilisant un espace constant en utilisant des op´erations (+, ·, etc) respectant toujours et parfaitement leurs sp´ecifications math´ematiques ; ces op´erations sont suppos´ees s’ex´ecuter en temps constant. Que r´ever de mieux?
2.3 Algorithme
Un exemple d’algorithme r´esolvant Puissance est :
fonction puissance( x : r´eel ; n : entier) : r´eel
d´ebut res ← 1.0 ;
faire n fois res ← res · x ; retourner res fin
Figure 2.1 – L’algorithme puissance r´esolvant Puissance
Comme nous pouvons l’observer sur l’exemple de l’algorithme puissance, un algorithme est un texte compos´e de deux parties :
es l’entˆete, commence par la penthese ouvrante d´ebut et finit par la derniere parenthese fermante fin. La quasi-totalit´e des probl`emes n´ecessitent pour leur r´esolution un espace m´emoire auxiliaire sur lequel sont ex´ecut´es des calculs interm´ediaires. Pour g´erer de fa¸con simple et lisible cet espace m´emoire, on utilise des “variables”.Ainsi, derriere toute variable, se trouve un espace m´emoire dont on peut modifier le contenu. Dans un objectif de simplicit´e de syntaxe (et non d’´ecriture d’algorithmes), nous ne consid´erons lors de cet enseignement que des variables locales, c’esta dire qui sont supprim´ees a la fin de l’appel de fonction ou elles ont ´et´e cr´e´ees. Une variable poss`ede plusieurs attributs :
u est stock´e son contenu. Cette adresse est proprea la variable. Il s’agit mˆeme de l’unique attribut qui ne peut ˆetre partag´ee par une autre variable.es sa cr´eation, la variable possede un contenu. Ce contenu peut naturelle- ment varier : d’o`u le nom de variable. Si la variable est de type simple(bool´een, entier, r´eel), son contenu est un bool´een, un entier ou un r´eel. Sinon, dans le cas d’un type tableau (ou plus g´en´eralement d’un type com- plexe), son contenu est l’adresse de ce tableau. Nous dirons que la variable d´esigne ce tableau (mais contient l’adresse du tableau).
edea sa cr´eation un type dont elle ne peut pas changer. Notons que dans d’autres langages, d’autres choix existent.a la fin de cet appel (apres ex´ecution de l’instruction retour pour une fonction).Notez desa pr´esent, que si une variable d´esignant un tableau est supprim´ee (`a la fin de l’appel de fonction). L’espace m´emoire propre de la variable contenant l’adresse du tableau est supprim´e mais pas le tableau (voir le rˆole de la fonction liberer).
Remarque 3 Le terme identificateur est trompeur : ce qui identifie v´eritablement une variable est son adresse. Lors de l’ex´ecution d’une fonction, par exemple r´ecursive comme
fonction factoriel(a:entier):entier
d´ebut si a ≤ 1 alors retourner 1 sinon retourner a · fact(a-1)
Le calcul de factoriel(100) n´ecessitera 100 appels a la fonction factoriel sur les arguments 100, 99 ,... , 1. A l’instant ou est calcul´e factoriel(1), les 99 autres calculs ont ´et´e suspendus en attente du r´esultat de ce calcul. Ce qui signifie qu’a cet instant, il existe 100 variables toutes diff´erentes poss´edant le mˆeme identificateur a mais stock´eesa 100 adresses diff´erentes et contenant les 100 entiers 100, 99 ,... , 1. Nous verrons dans le prochain chapitre le m´ecanisme utilis´ee par le mod`ele de calcul pour g´erer cette complexit´e : il a pour nom la pile d’appel.
Nous allons d´efinir ici une syntaxe permettant d’´ecrire tout algorithme. Cette syntaxe est propre a ce cours. Elle n’a pas vocationa permettre la compilation ou l’ex´ecution de l’algorithme sur une machine. Son ambition est de fournir selon une syntaxe simple des algorithmes simples et non ambigus qui pourront ˆetre traduits, avec un minimum d’effort, dans un langage de programmation comme le langage C.
Tout programme contient des expressions typ´ees. Une expression typ´ee est une expression bien form´ee v´erifiant la syntaxe du type consid´er´e.
Puisque a tout moment de l’ex´ecution d’un algorithme chaque variable possede un contenu, a tout moment on peut ´evaluer toute variable et donc toute expres- sion (bien form´ee), c’esta dire lui associer une valeur.
Une expression est bien form´ee si elle respecte les regles de typage ainsi que les regles d’utilisation usuelles des op´erateurs math´ematiques. A dessein de simpli- cation, nous utiliserons un mˆeme op´erateur (·, +, etc) pour manipuler des valeurs de type entier ou r´eel. Nous supposerons que lors d’une ´evaluation d’une expression e :
Exemple 1 Ainsi, si j est une variable de type entier de contenu 5, l’expression 2.j + 2 est bien form´ee et est ´evalu´ee a la valeur 12 qui est de type entier. Si cela est utile, nous autorisons qu’un op´erateur opere sur deux entiers, deux r´eels ou un r´eel et un entier. Ainsi, si j est une variable de type reel de contenu 5.0, l’expression 2.j + 2 est bien form´ee et est ´evalu´ee `a la valeur 12.0 qui est de type reel.
Remarque 5 Certains langages de programmation offrent des syntaxes nou- velles, puissantes, utiles et qui relevent du langage commun comme par exemple l’expression entiere i++ dans l’instruction j<-i++. Nous ne c´ederons pas `a la ten- tation et ´ecrirons la suite d’instructions j <- i ; i <- i + 1.
De mˆeme, nous encourageons l’´ecriture d’instructions et d’expressions claires non ambigues quitte a utiliser un plus grand nombre d’instructions, de par- entheses ou de variables : l’objectif ici est d’avoir des algorithmes simples a comprendre et non pas n´ecessairement ´ecrits avec un minimum de caracteres ou
optimis´es pour une prochaine compilation. Ce travail est r´ealis´e apr`es au moment de l’´ecriture du programme en C.
Remarque 6 Dans certains langages, on autorise l’´ecriture d’expressions bool´eennes e comme (i>longueur(T)) OU (T[i] = 134). Dans ces langages, l’´evaluation de l’expression commence a gauche et si la sous-expression i>longueur(T) est vraie, la sous-expression droite (T[i] = 134) n’est pas ´evalu´ee : l’´evaluation de e ´etant VRAI. Nous ne faisons pas ce choix et consid´erons que les deux sous-expressions sont toutes deux ´evalu´ees. Et si la premiere est ´evalu´ee VRAI, la seconde est mal form´ee (car i a pour contenu un entier qui n’est pas un indice du tableau). Nous consid´erons que l’algorithme est mal ´ecrit.
Pour cr´eer une variable a, il suffit d’utiliser l’op´eration affectation ← et de pr´eciser a droite une expression < expr > dont l’´evaluation permettra de fournir le type et le contenu de la variable. L’instruction ainsia ex´ecuter est de la forme :
a ←
Cas d’un type simple : bool´een, entier, r´eel
Ainsi, lors de l’ex´ecution de la fonction
procedure exempleSimple() : bool´een debut i <- 4 ; r <- 4.0 ; j <- i ; j <- j + 1 ;
retourner (i = j) fin
apres ex´ecution de la premiere instruction i<-4 est cr´e´ee une variable de nom i, de type entier puisque 4 est de type entier et de contenu 4 ; apres ex´ecution de la seconde instruction, est cr´e´ee une variable de nom r, de type r´eel puisque 4. 0 est de type r´eel et de contenu 4.0 ; apres ex´ecution de la troisieme instruction, est cr´e´ee une variable de nom j, de type entier puisque i est de ce type et de contenu celui de ia savoir 4.