ALGORITHMIQUE. Notes du cours FS/1/6584 Université de Mons-Hainaut Année préparatoire au Master en Informatique

Dimension: px
Commencer à balayer dès la page:

Download "ALGORITHMIQUE. Notes du cours FS/1/6584 Université de Mons-Hainaut Année préparatoire au Master en Informatique"

Transcription

1 ALGORITHMIQUE Notes du cours FS/1/6584 Uiversité de Mos-Haiaut Aée préparatoire au Master e Iformatique Gilles GEERAERTS Uiversité Libre de Bruxelles ANNÉE ACADÉMIQUE

2 2

3 Table des matières 1 Itroductio Le coteu et les objectifs du cours Algorithmes, Algorithmique Les objectifs et l orietatio du cours Le pseudo-lagage Types et variables Istructios Gestio de la mémoire Bibliographie Itératio, iductio, récursivité Itroductio Itératio Iductio Récurrece Itératio et iductio Raisoemet par iductio Preuves de programmes Notio d ivariat de boucle U exemple de preuve par ivariat Récursivité Récursivité et iductio Foctios récursives La complexité algorithmique Itroductio Notio d efficacité Mesure du temps de calcul Compter le ombre d étapes La otio de grad O Ituitio Déitio formelle Classes de complexité algorithmique Règles de combiaiso et de simplificatio Le cas des programmes récursifs Utilisatio de l iductio

4 4 TABLE DES MATIÈRES 4 Les listes Motivatio : critique des tableaux Les listes simplemet liées Comparaiso aux tableaux Algorithmes Listes triées Les listes circulaires avec élémet pré-tête Différeces par rapport aux listes «simples» Algorithmes Les listes doublemet liées Implémetatio des listes das les vecteurs Applicatio Vue récursive Algorithmes Les piles et les files Les piles Implémetatio das ue liste Implémetatio das u vecteur Les files Implémetatio das ue liste Implémetatio das u vecteur Applicatios Vérificatio des parethèses Évaluatio d ue expressio e otatio postfixée Les arbres Itroductio Déitios Vocabulaire Cas particuliers Implémetatio Applicatio : les arbres d expressios Parcours des arbres biaires Parcours préfixé ou parcours e profodeur Parcours ifixe Parcours postfixé Le parcours par iveaux ou parcours e largeur Applicatios des parcours Algorithmes de recherche Itroductio Doées stockées das des vecteurs Recherche liéaire simple Recherche liéaire das u vecteur trié Recherche dichotomique das u vecteur trié Tables de hachage Doées stockées das des listes Doées stockées das des arbres Parcours simple

5 TABLE DES MATIÈRES Arbres biaires de recherche Coclusio : aux limites de l algorithmique 141

6 6 TABLE DES MATIÈRES

7 Table des figures 1.1 Ue illustratio du tri par sélectio. Les cases grisées sot celles qui sot cosidérées e place Ue illustratio de la méthodologie que ous adopteros das le cours L ordiogramme de la boucle tat que Comparaiso de polyômes de degrés 3 et 4 (petite échelle) Comparaiso de polyômes de degrés 3 et 4 (grade échelle) Comparaiso de différetes foctios caractérisat les pricipales classes de complexité algorithmique (échelle logarithmique e ordoées) Ue illustratio de l exécutio de Facto(k) U exemple de liste compreat trois élémets, et dot la tête est stockée das la variable L U exemple de suppressio das ue liste simplemet liée. Les poiteurs et élémets e poitillés disparaisset lors de la suppressio U exemple d isertio das ue liste simplemet liée. Les poiteurs et élémets e poitillés disparaisset lors de l isertio U exemple de déplacemet : l élémet 4 se trouve etre 2 et 7 avat le déplacemet, et se retrouve etre 1 et 2 après les déplacemet. Trois poiteurs ot été modifiés. Les poiteurs e poitillés réprésetet les aciees valeurs U exemple de liste circulaire avec élémet pré-tête U exemple d isertio e tête das ue liste circulaire avec élémet pré-tête Ue liste circulare avec élémet pré-tête vide La recherche de l iformatio k das ue liste circulaire avec élémet pré-tête. Au pire cas (quad k est pas préset das la liste), le poiteur fait le tour de la liste et reviet à l élémet pré-tête, qui cotiet k U exemple de liste doublemet liée U exemple d isertio das ue liste doublemet liée. O isère u élémet portat la valeur 3 avat l élémet portat la valeur U exemple de liste implémetée das u vecteur, et so équivalet utilisat des poiteurs U exemple de pile coteat (de bas e haut) les valeurs 2, 3, 4 et La pile de la Fig. 5.1 implémetée das ue liste

8 8 TABLE DES FIGURES 5.3 U exemple de maipulatio de file das u vecteur. Les cases grisées sot celles qui fot partie de la file Le vecteur implémetat la file vu comme u vecteur circulaire. Les cases grisées sot celles qui fot partie de la file U exemple d arbre, qui représete l orgaisatio hiérarchique d ue etreprise (u peu fataisiste) U exemple d arbre. Les iformatios associées aux œuds e sot pas représetées La vue récursive de l arbre de la Fig Quelques illustratios du vocabulaire sur les arbres U exemple d arbre biaire équilibré U exemple d arbre d expressio qui représete (3 + 5) Les quatre parcours d arbre classiques. La flèche e potillé idique l ordre des appels. U poit à proximité d u œud idique à quel momet le œud sera effectivemet traité lors du parcours Ue illustratio du parcours e largeur. Les œuds grisés ot été traités. Le coteu de la file à chaque étape est représeté sous l arbre Ue illustratio de la recherche dichotomique. Les cases grisées délimitet l itervalle de recherche Ue illustratio du hachage avec chaîage U exemple d arbre biaire de recherche (équilibré). E poitillés, le chemi parcouru pour accéder à l iformatio L ordre sur les œuds iduit par u arbre biaire de recherche (il s agit de l ordre du parcours ifixe) Deux isertios das u ABR. Les chemis suivis sot idiqués e poitillés. Les comparaisos réalisées sot idiquées le log des chemis, à côté des œuds cocerés Ue illustratio des trois cas de suppressio das u ABR. Le œud à supprimer est idiqué e grisé Le détachemet du maximum das u ABR U exemple d arbre dot la hauteur est e O du ombre de œuds. Il s agit e fait d ue liste

9 Avat propos Cet ouvrage costitue les otes du cours d Algorithmique, dispesé das le cadre de l aée préparatoire au Master e Iformatique (horaire décalé), co-orgaisé par les Uiversités de Bruxelles et Mos. Il s agit de la première versio de ces otes. À ce titre, ce travail est certaiemet perfectible, et susceptible de coteir l ue ou l autre coquille. Je fais doc appel à l idulgece du lecteur, qui j e suis covaicu me pardoera volotiers e sogeat aux coseils de Nicolas BOILEAU : Hâtez-vous letemet ; et, sas perdre courage, Vigt fois sur le métier remettez votre ouvrage : Polissez-le sas cesse et le repolissez ; Ajoutez quelquefois, et souvet effacez. Mes remerciemets les plus vifs vot à M. Jérome JONCKERS, qui a accepté sas réserve de relire ces otes, avec la rigueur et le professioalisme qui le caractériset. Ses remarques toujours à propos ot idéiablemet cotribué à améliorer la qualité de ce syllabus. Je remercie égalemet les étudiats qui, à travers leurs ombreuses questios et remarques durat le cours m ot permis de corriger plusieurs erreurs et imprécisios. Bruxelles, décembre

10 10 TABLE DES FIGURES

11 Chapitre 1 Itroductio 1.1 Le coteu et les objectifs du cours Algorithmes, Algorithmique Pour expliquer ce que sot les ordiateurs, il est de coutume de les comparer aux calculatrices de bureau, et d expliquer que, somme toute, u ordiateur est rie d autre qu ue calculatrice très perfectioée. Il y a pourtat ue différece importate etre ue calculatrice capable d effectuer les quatre opératios de base et u ordiateur : c est que l ordiateur est, par déitio, programmable, ce qui est le cas que des modèles les plus évolués de calculatrices... Cette différece est fodametale. Alors qu ue calculatrice e doe accès qu aux foctioalités qui sot liées à chacue de ses touches, l ordiateur offre u jeu d istructios de base très riche, dot l utilisateur peut se servir à sa guise a d élaborer des programmes capables de résoudre des problèmes bie plus complexes que ceux traités par les istructios de base. L immese majorité du travail effectué par u professioel de l iformatique touche doc de près ou de loi à la questio suivate : «Commet faire résoudre tel problème à u ordiateur?» Ue part de la répose à cette questio est parfois trouvée das l assemblage de solutios préexistates fouries par des tierces parties. Néamois, tout iformaticie se retrouve cofroté u jour ou l autre avec la écessité de programmer ue ouvelle foctioalité, soit pour résoudre le problème posé das so etièreté, soit comme étape particulière d ue solutio globale dot certaies étapes sot déjà fouries. La tâche de l iformaticie cosiste alors, grosso modo à traduire des desiderata exprimés de faço plus ou mois claire et plus ou mois formelle e u programme das u lagage de programmatio bie détermié. U exemple de desiderata pourrait être : «Trier u tableau de ombres etiers par ordre croissat». Das ce cas, il y aura lieu, das u premier temps, d établir la méthode géérale qui va être appliquée. Par exemple : 1. Rechercher das tout le tableau la valeur miimale. 2. Placer cette valeur miimale e première positio, et placer la valeur qui était e première positio là où était la valeur miimale (e d autres mots : échager les deux valeurs). La valeur miimale est maiteat «à sa place» 11

12 12 CHAPITRE 1. INTRODUCTION 3. Recommecer le même traitemet sur la partie du tableau coteat les élémets qui e sot pas ecore à leur place, et ce, tat qu il y e a. Cette méthode est illustrée à la Fig Nous l appelleros tri par sélectio, car à chaque étape ous sélectioos l élémet à placer e tête du tableau, Elle semble satisfaisate, et peut doc être traduite das le lagage de programmatio choisi. Il est itéressat de remarquer que ous avos itroduit ue étape itermédiaire etre la compréhesio du problème et sa résolutio e terme de programme iformatique. Cette étape a cosisté e la descriptio d ue méthode géérale de tri, qui exprime l essece du programme à produire, et qui aurait d ailleurs pu être traduite das plusieurs lagages de programmatio différets. Cette méthode est ce que ous appelos u algorithme, c est-à-dire ue suite d actios bie déies à echaîer pour résoudre u problème. Remarquos que tout programme est, lui aussi, u algorithme. Mais le pseudo-laagage a l avatage d être idépedate du choix du lagage de programmatio al, ce qui ous permettra souvet de teir des raisoemets formels et rigoureux sur l algorithme choisi. La méthodologie que ous veos d esquisser est résumée à la Fig Das ce cadre, la phase de coceptio de l algorithme est l étape essetielle, car c est à travers l algorithme qu o spécifie l idée du traitemet à réaliser. Cela e veut pas dire pour autat que la phase de traductio e programme est facile ou triviale : elle a ses problèmes spécifiques, mais ous e les aborderos pas ici. Au cotraire, ous allos ous cocetrer sur l étude de l algorithmique, c est-à-dire la disciplie qui étudie les algorithmes et leur coceptio. Pour autat, il e faut pas cofodre l algorithmique avec ue liste de solutios préétablies pour chaque problème, u peu comme u bo livre de cuisie offre ue recette adaptée à chaque circostace. E effet, la méthode décrite ci-dessus peut soulever certaies questios comme : 1. Cette méthode est-elle correcte? Autremet dit, est-o sûr qu e l appliquat à importe quel tableau, o obtiedra toujours u tableau trié? A de ous e covaicre le mieux possible, ous ue preuve formelle et rigoureuse est écessaire. Le cocept de correctio d u algorithme et les méthodes pour la prouver serot itroduits au Chapitre La méthode utilisée cosiste e la répétitio d u même traitemet. Est-il possible d utiliser d autres «caevas» d algorithme? Nous étudieros otammet la récursivité au Chapitre Quelle est l efficacité de la méthode utilisée? Commet peut-o la mesurer? Commet peut-o comparer deux méthodes différetes résolvat le même problème a de sélectioer la plus efficace? Nous apporteros des réposes à ces questios au Chapitre 3. Par ailleurs, l algorithmique est étroitemet liée à l étude des structures de doées. Das l exemple de cette itroductio, la structure des doées est doée explicitemet : c est u tableau d etiers. O peut dès lors se demader si o aurait pas obteu u algorithme de tri plus efficace si o avait structuré les doées autremet. De même, la structure de tableau est pas forcémet adaptée à tous les problèmes. Das les chapitres 4, 5 et 6 ous étudieros d autres structures de doées aisi que leurs algorithmes associés.

13 1.1. LE CONTENU ET LES OBJECTIFS DU COURS 13 FIG. 1.1 Ue illustratio du tri par sélectio. Les cases grisées sot celles qui sot cosidérées e place.

14 P 14 CHAPITRE 1. INTRODUCTION F r a ç a i s o u a u t r e l a g u e a t u r e l l e { P r o b l è m e e t d e s i d e r a t a F o r m u l a t i o d e s h y p o t h è s e s s e u d o / l a g a g e { A l g o r it h m e e t r é fl e x i o s u r l e p r o b l è m e P e r m e t d e r a i s o e r f o r m e l l e m e t : P r e u v e d e c o r r e c t i o, e t c... T r a d u c t i o v e r s l e l a g a g e c h o i s i L a g a g e d e P r o g r a m m a t i o { P r o g r a m m e FIG. 1.2 Ue illustratio de la méthodologie que ous adopteros das le cours Les objectifs et l orietatio du cours Ce cours adopte ue approche scietifique de l algorithmique. Cela sigifie qu o y eseigera des algorithmes et des structures de doées de base qui permettet de résoudre des problèmes typiques, mais aussi des outils (comme la complexité, les ivariats) qui permettet d aalyser ces solutios, de les justifier, de mieux les compredre, et d e élaborer de ouvelles. Ce cours fera doc appel tat à la rigueur qu à la créativité des étudiats. 1.2 Le pseudo-lagage A de pouvoir ous cocetrer sur les aspects puremet algorithmiques des otios étudiées das ce cours, ous allos ous détacher autat que faire se peut des problèmes liés aux lagages de programmatio. Nous exprimeros doc pas os algorithmes das u des lagages classiques comme C, C++ ou PASCAL. Nous allos adopter u pseudo-lagage qui pourra être aisémet traduit vers importe quel lagage de programmatio procédural. Cette approche aura l itérêt de mettre e avat les traitemets écessaires pour résoudre u certai problème Types et variables Nous supposeros que les variables sot typées et déclarées, ce qui sigifie qu o veillera à toujours déclarer ue variable avat de l utiliser, et qu o spécifiera le type de doées que cette variable peut coteir. Les types admis serot les types classiques comme Etier, Boolée, Chaie (de caractères), etc. Nous pourros déclarer et utiliser des tableaux multidimesioels de ces types, e utilisat la otatio [ ], comme e C ou C++. Nous maipuleros égalemet des poiteurs (voir ci-dessous). Par ailleurs, le pesudo-lagage permettra d erichir les types que ous pouvos utiliser, e créat de ouveaux types. Ceux-ci serot costruits à partir des types de bases ou à partir d autres structures, de la même faço que les ØÖÙØ e C ou C++. Ue structure peut être vue comme le groupemet de plusieurs variables. O déclare

15 1.2. LE PSEUDO-LANGAGE 15 ue structure à l aide du mot-clé struct, suivi du om du type, suivi de la liste des différetes variables à regrouper das le type. Ces variables sot appelées des champs, portet toutes u om différet et peuvet être de types différets : struct om Type1 omchamp1 ; Type2 omchamp2 ;. TypeN omchampn ; Exemple 1 La structure suivate déclare le ouveau type Etudiat qui regroupe u etier (le matricule de l étudiat) et deux chaîes de caractères (ses om et préom) : struct Etudiat Etier matricule ; Chaie om ; Chaie preom ; Il faut bie garder à l esprit qu ue telle déclaratio crée u ouveau type et o pas ue ouvelle variable, ce qui sigifie que rie est créé e mémoire par ces istructios. Par cotre, ue fois cette déclaratio effectuée, ous pourros déclarer des variables du type Etudiat. État doé ue variable v dot le type est ue structure, ous pouvos accéder à chacu des champs de v comme à des variables idépedates. Ces champs sot ommés par v.omduchamp. Exemple 2 Si E est ue variable de type Etudiat, o assige le matricule 123 à E de la faço suivate : E.matricule := 123 ; Istructios Les istructios que ous utiliseros sot les suivates : := Il s agit de l opérateur d assigatio ou affectatio. À gauche de cet opérateur, o trouvera obligatoiremet ue variable. À droite de l opérateur, o trouve ue expressio du même type que la variable. L effet de l opérateur d assigatio est le suivat : o commece par évaluer la valeur de l expressio à droite. Esuite, cette valeur est stockée das la variable. Certais ouvrages utiliset plutôt la otatio pour désiger l assigatio e pseudo-lagage. Il ous arrivera d utiliser l ue ou l autre. si... sio Il s agit de l istructio permettat d effectuer u test. La sytaxe typique est si coditio alors istructios 1 sio istructios 2. Das le cas où la coditio est vérifiée, le bloc istructios 1 uiquemet sera exécuté. Das le cas cotraire, c est le bloc istructios 2 uiquemet qui sera exécuté. La partie sio est optioelle. O utilisera parfois l extesio permettat de tester plusieurs coditios e séqueces : si coditio 1 alors istructios 1 sio si coditio 2 alors istructios 2... sio istructios. Das ce cas, la coditio 1 est testée d abord. Si elle est vérifiée, le bloc istructios 1 uiquemet est exécuté (les autres coditios e sot pas testées). Si la coditio 1 est pas

16 16 CHAPITRE 1. INTRODUCTION vérifiée, o teste la coditio 2, et exécute le bloc istructios 2 quad cette derière est vérifiée. Das le cas cotraire, o cotiue aisi à tester les istructios de faço séquetielle, jusqu à découvrir ue coditio vérifiée, ce qui doe lieu à l exécutio du bloc d istructios associé. Si aucue des coditios est vérifiée, le bloc istructios est exécuté. tat que Il s agit de l istructio permettat de répéter u traitemet tat qu ue certaie coditio est vérifiée. Sa sytaxe est tat que (coditio) faire istructios. Le bloc d istructios sera exécuté tat que la coditio est vraie. Plus précisémet, ue boucle tat que s exécute aisi : la coditio est testée. Si elle est pas vérifiée, les istructios e sot pas exécutées et la boucle s arrête. Si la coditio est vérifiée, l itégralité du bloc d istructios est exécutée, et o recommece : o teste à ouveau la coditio ; si elle est fausse o arrête la boucle, si elle est vraie, o exécute les istructios, etc. pour Cette istructio permet, comme l istructio tat que, de répéter u certai traitemet. Il s agit doc d ue boucle. La particularité de la boucle pour est que le traitemet déped d ue certaie valeur i qui varie à chaque éxécutio. Exemple 3 Pour afficher toutes les cases d u tableau, il faut afficher la case 0, puis la 1, puis la 2, etc. Le traitemet à répéter est doc «Afficher la case i», et il est à répéter pour i variat de 0 à 1 (taille du tableau). La sytaxe de la boucle pour est la suivate : pour var := a...b faire istructios. Cette boucle exécutera d abord les istructios e doat à la variable var la valeur a. Elle exécutera esuite les istructios e doat à var la valeur a + 1, puis a + 2, etc jusqu à doer à var la valeur b (pour laquelle les istructios serot aussi exécutées). Exemple 4 Pour afficher u tableau T de cases, o écrira : Gestio de la mémoire pour i := faire Afficher T[i] ; A de pouvoir itroduire des structures de doées dyamiques (c est-à-dire des structures dot la taille peut varier au cours de l exécutio du programme), comme les listes ou les arbres, ous supposeros que ous pouvos allouer de la mémoire de faço dyamique. Pour rappel, les lagages impératifs classiques permettet d accéder à la mémoire de deux faços différetes : 1. Soit via des structures statiques. Il s agit des variables qui sot déclarées das le code, et dot le type et la taille sot cous au momet de la compilatio. Ces variables peuvet soit être globales (auquel cas la mémoire associée est libérée au momet où le programme se termie), soit locales à u bloc de code (auquel cas la mémoire est libérée quad o quitte le bloc). Il est importat de remarquer qu u om uique est associé à chacue des zoes mémoires : le om de la variable correspodate. 2. Soit via des structures dyamiques. Ces structures serot stockées das des portios de mémoire, dot la taille et le type e sot pas cous à la compilatio. L allocatio de la mémoire devra doc se faire au momet de l exécutio. Comme ces emplacemets mémoires e sot pas associés à ue variable, ils sot

17 1.2. LE PSEUDO-LANGAGE 17 aoymes. O y accédera doc par u autre mécaisme : l adresse mémoire de la zoe cocerée. E pratique, o utilise gééralemet u poiteur, c est-à-dire ue variable qui peut coteir ue adresse, et qui permet de maipuler la zoe cocerée à travers cette adresse. Remarquos que, même si u poiteur est ue variable qui a u om, ue structure dyamique reste aoyme. E effet : Plusieurs poiteurs différets peuvet coteir l adresse d ue même zoe. Aisi, plusieurs oms sot associés à la zoe. Comme le poiteur est ue variable, il est possible de modifier so coteu plusieurs fois tout au log de l exécutio du programme. La zoe vers laquelle le poiteur «poite» peut doc chager, et u même om (de poiteur) e sera doc pas toujours affecté à la même zoe. Il est même possible qu aucu poiteur e poite vers ue zoe doée. Das ce cas, la zoe sera tout simplemet iaccessible, et la place mémoire réservée sera perdue (à mois qu u mécaisme du type garbage collector e soit implaté, comme das la plupart des compilateurs JAVA). Das tous les cas, il coviet doc de toujours bie faire la différece etre le poiteur (ue variable qui a u om et qui cotiet ue adresse, c est-à-dire u etier), et la zoe référecée (ou poitée) qui est aoyme et peut être de taille et de type arbitraire. Das otre pseudo-lagage, les poiteurs serot déclarés das ue sytaxe à la C++, c est-à-dire que pour déclarer u poiteur vers ue case mémoire de type T, o déclarera e fait ue variable de type T. Exemple 5 Si o veut déclarer u poiteur dot le om est p et qui devra poiter vers ue zoe mémoire capable de recevoir u élémet de type Etier, o écrira : Etier* p ; L allocatio dyamique sera effectuée au moye de l opérateur ew. Cet opérateur reçoit le om d u type. Il réserve e mémoire la place écessaire pour stocker ue structure du type spécifié et revoie l adresse de l emplacemet réservé. Il y aura doc lieu de stocker cette adresse das u poiteur, sous peie de e plus pouvoir accéder à la zoe réservée. Exemple 6 L istructio p := ew Etier ; crée e mémoire ue zoe mémoire aoyme de type Etier, dot l adresse est stockée das p. Il reste à expliquer commet o peut modifier ue zoe mémoire à travers u poiteur. Cela e peut pas se faire par ue «simple» assigatio au poiteur puisque celle-ci modifierait l adresse qui y est stockée. Pour modifier la zoe poitée par u poiteur p, o utilise la sytaxe p. Aisi, si p est u poiteur vers u etier et que l o veut stocker 5 das la zoe poitée, o écrira p := 5. Remarquos que cette valeur e chage pas la valeur du poiteur, qui poite toujours vers la même zoe (et cotiet doc so adresse). Il e faut pas cofodre cette istructio avec p := 5, qui stocke la valeur 5 das le poiteur. Das ce cas, l adresse de la zoe poitée par p avat l assigatio est perdue, et p poite vers la case mémoire d adresse 5.

18 18 CHAPITRE 1. INTRODUCTION Das le cas où le poiteur p poite vers ue structure, dot o veut accéder au champ c, par exemple, il faudrait doc écrire p.c. E effet, p est le om de la structure elle-même (puisque c est vers elle que p poite), auquel il faut ajouter.c pour accéder au champ c. Néamois, par souci de simplificatio, et puisque ous e maipulos pas u lagage qui doit, i e être compilé, ous écriros souvet p.c à la place de p.c. Il est de toute faço toujours possible de retrouver le sytaxe exacte, e regardat si o a affaire à ue variable ou à u poiteur. Exemple 7 Pour créer de faço dyamique u élémet de type Etudiat et lui affecter le uméro de matricule 123, o peut procéder de la faço suivate : Etudiat * p ; p := ew Etudiat ; p.matricule := 123 ; Remarquos que, das le cas préset, p est u poiteur, cotrairemet à E das l Exemple Bibliographie Ce cours se base e grade partie sur les premiers chapitres du livre Foudatios of Computer Sciece, A. Aho, J. Ullma, Computer Sciece Press, New York, Cet excellet ouvrage aborde différets aspects fodametaux de l iformatique, avec ue approche résolumet scietifique. Néamois, il va au-delà du coteu de ce cours car il aborde aussi les graphes ou la logique. Il e existe différetes versios das lesquelles les algorithmes sot présetés soit e C, soit e Pascal. Ue traductio fraçaise est publiée chez Duod sous le titre Cocepts fodametaux de l iformatique. L ouvrage Itroductio to algorithms 2 e ed., T. Corme, C. Leiserso, R. Rivest, C. Stei, MIT Press, 2001 est cosidérée par beaucoup comme la référece e matière d algorithmes. Le sujet est traité e profodeur, et, à ouveau, avec beaucoup de rigueur. Ue traductio e fraçais existe égalemet sous le titre Itroductio à l algorithmique, chez Duod (ISBN ). D autres référeces sot doées das la bibliographie.

19 Chapitre 2 Itératio, iductio, récursivité 2.1 Itroductio Das ce chapitre, ous allos étudier trois otios différetes mais proches : l itératio, l iductio et la récursivité Itératio Itératio est syoyme de répétitio, auquel o le préfère e gééral das le vocabulaire courammet utilisé e iformatique. Tous les lagages de programmatio fourisset des mécaismes permettat de répéter, ou itérer ue certaie tâche. E gééral, il s agit de boucles (pour, tat que, etc). Le coteu de la boucle sera itéré jusqu à ce qu ue certaie coditio soit remplie. U algorithme est appelé itératif si so traitemet pricipal cosiste e la répétitio d ue certaie séquece d istructios (voir, par exemple, l Algorithme 3, ci-dessous) Iductio Ce terme appartiet au vocabulaire des mathématiques. Le petit Robert y voit ue opératio metale qui cosiste à remoter des faits à la loi, à des cas doés. Das le cadre des mathématiques, l iductio est ue méthode de preuve, permettat de motrer qu ue propositio est vraie pour importe quelle valeur d u paramètre. Pour ce faire, o commece par motrer que la propositio est vraie pour certaies valeurs iitiales bie choisies de (par exemple = 0). C est ce qu o appelle le «cas de base 1». Esuite, o prouve que si la propositio est vraie pour certaies valeurs (dot les valeurs iitiales), alors elle est aussi vraie pour d autres. O appelle cette partie de la preuve le «cas iductif». Le cas de base et le cas iductif permettet de costruire ue chaîe de raisoemet motrat que la propositio est vraie pour toute valeur. Comme exemple de cas iductif, o motre que si la propositio est vraie pour = k, avec k 0, elle est aussi vraie pour = k + 1. Aisi, ous obteos la chaîe de raisoemets suivate : puisque la propositio est vraie pour = 0 (ce qui est vrai, d après le cas de base), elle est aussi vraie pour = 1 (o utilise ici le cas iductif). Maiteat que l o sait que la propositio est vraie pour = 1, o e déduit, grâce au cas iductif à ouveau que la propositio est vraie pour = 2. Elle est doc aussi vraie 1 Cela correspod à la loi, au cas doé évoqué par la déitio du Petit Robert. 19

20 20 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ pour = 3, pour = 4, etc. La propositio est doc vraie pour toute valeur etière positive de. E iformatique, et plus particulièremet e algorithmique dès lors qu il s agit de raisoer formellemet sur certaies propriétés d algorithmes, les preuves par iductio sot très souvet utilisées Récurrece Le terme «récurrece» recouvre lui aussi ue certaie idée de répétitio. Das le cadre des mathématiques, o parle de déitio par récurrece ou de déitio récursive, quad o déit u cocept par rapport à lui-même. Exemple 8 O peut déir la factorielle! du ombre 1 comme! = i=1 i = ( 1) ( 2) 1 ce qui est la déitio classique ; mais aussi comme :! = { ( 1)! si > 1 1 si = 1 (2.1) La secode déitio est récursive, car das le cas ou > 1, o déit la factorielle de par rapport à ue autre factorielle (e l occurrece, celle de 1). La otio mathématique de récurrece a doé lieu à ue techique de programmatio, appelée récursivité, das laquelle u algorithme fait appel à lui-même pour résoudre u problème. Exemple 9 La déitio récursive de la factorielle (2.1) suggère immédiatemet l Algorithme 1. La déitio classique, par cotre, suggère plutôt ue implémetatio itérative, comme celle de l Algorithme 2. Etier Facto(Etier ) si = 1 alors retourer 1 ; sio := Facto( 1) ; retourer ; Algorithme 1 : Ue implémetatio récursive du calcul de la factorielle. 2.2 Itératio et iductio Nous allos maiteat voir commet les techiques d iductio peuvet être utilisées pour raisoer sur les comportemets d algorithmes itératifs. A de justifier l itérêt des techiques d iductio, qui serot itroduites das la sectio 2.2.1, ous

21 C 2.2. ITÉRATION ET INDUCTION 21 Etier Facto2(Etier ) Etier F := ; Etier i := 1 ; tat que i 2 faire F := F i ; i := i 1 ; retourer F ; Algorithme 2 : Ue implémetatio itérative du calcul de la factorielle. f a u x v r a i I s t r FIG. 2.1 L ordiogramme de la boucle tat que. allos d abord examier u algorithme itératif dot ous aimerios obteir certaies propriétés. Das le cadre de ce cours, ous cosidéreros des programmes itératifs dot le traitemet est réalisé par ue boucle du type tat que. Pour rappel, u telle boucle est composée d ue coditio C, et d ue séquece d istructios qui est répétée tat que la coditio C est vraie. Ce comportemet est représeté par l odiogramme de la Fig Remarquos d emblée que la boucle tat que ous garatit que la coditio C sera fausse à la de so exécutio. Cette iformatio peut être itéressate pour raisoer sur le comportemet de la boucle, mais est e géérale pas suffisate, comme le motre l exemple qui suit. Cosidéros l Algorithme 3 qui est u exemple d algorithme itératif. Il reçoit u tableau d etiers T et u etier. Il calcule la moyee des valeurs stockées das les premières cases de T. Pour ce faire, il calcule la somme de ces première valeurs das

22 22 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ la variable S, puis revoie S. Le calcul de la somme est effectué de maière itérative : à chaque tour de la boucle tat que, ue ouvelle case du tableau (la case T[i]) est examiée et ajoutée à la variable S. Etier Moyee(Etier T[],Etier ) Etier S := 0 ; Etier i := 0 ; tat que i < faire S := S+T[i] ; i := i+1 ; retourer S/ ; Algorithme 3 : U algorithme pour calculer la moyee des premières valeurs stockées das le tableau T. O fait l hypothèse que > 0. Nous aimerios ous covaicre, par u raisoemet formel et rigoureux, que cet algorithme est correct. Il ous faut d abord exprimer rigoureusemet ce que ous etedos par là. Ituitivemet, l algorithme est correct s il revoie bie la moyee des premières valeurs du tableau T. Nous faisos l hypothèse que > 0. Autremet dit, ous voulos prouver que : > 0 : Moyee(T,) = 1 i=0 T[i] (2.2) Remarquos que si ous sélectioos ue valeur de e particulier (par exemple = 5), il est assez simple de faire la preuve, car le ombre d itératios de la boucle est fixé. Mais das ce cas, o a pas prouvé la correctio de l algorithme de maière géérale, c est-à-dire pour importe quelle taille du tableau T. Remarquos égalemet que la seule chose que ous pouvos déduire directemet de la boucle tat que est que la coditio i < sera fausse à la de l exécutio, c està-dire que i. E observat que la variable i est icrémetée que de 1 à chaque tour de boucle, o peut même affirmer que i = à la de la boucle. Mais tout cela est pas suffisat pour prouver l assertio (2.2). Pour prouver la correctio de cet algorithme (pour importe quel ), ous devos essetiellemet prouver que la variable S cotiet bie 1 i=0 T[i] à la de la boucle. Pour ce faire, il est écessaire d utiliser u raisoemet par iductio, comme suggéré das le paragraphe itroductif de ce chapitre Raisoemet par iductio A d itroduire la otio de preuve par iductio, ous allos cosidérer l exemple suivat : 0 : i=0 2 i = (2.3) Nous avos affaire à la propositio i=0 2i = qui doit être vraie pour importe quelle valeur positive de. Nous allos prouver ce fait par iductio.

23 2.2. ITÉRATION ET INDUCTION 23 Caevas d ue preuve par iductio Ue preuve par iductio compred deux parties, appelées cas : 1. La première est le cas de base, das laquelle la propositio est prouvée directemet pour certaies valeurs bie choisies du paramètre. 2. La secode est le cas iductif, où l o prouve que, si la propositio est vraie pour certaies valeurs du paramètre, alors elle l est pour d autres valeurs. À l aide du cas du base et du cas iductif, il doit être possible de prouver que la propositio est correcte pour importe quelle valeur de. Il s agit doc de bie les choisir. Das le cadre de otre exemple, o choisira de motrer que : Cas de base la propositio est vraie pour = 0. Cas iductif si la propositio est vraie pour = k, où k 0, alors elle l est pour = k+1. Avec ces deux cas, o peut e effet motrer que la propositio est vrai pour importe quel. E effet, elle est vraie pour = 0 (par le cas de base), doc elle est vraie pour = 1 (cas iductif), ce qui implique qu elle est vraie pour = 2 (cas iductif), etc. Il est importat de oter que, das le cas iductif, o tiet u raisoemet sous hypothèse : o suppose que la propositio est vraie pour = k et o e déduit qu elle l est pour = k + 1. L hypothèse «la propositio est vraie pour = k» est appelée hypothèse d iductio. Remarquos qu o aurait pu prouver égalemet (par exemple) : Cas de base la propositio est vraie pour = 0, pour = 1 et pour = 2. Cas iductif si la propositio est vraie pour = k, où k 2, alors elle l est pour = k+1. Mais cela alloge iutilemet le cas de base. Par cotre, les découpes suivates e sot pas suffisate pour prouver que la propositio est vraie pour tout : Cas de base la propositio est vraie pour = 5. Cas iductif si la propositio est vraie pour = k, où k 5, alors elle l est pour = k+1. Cas de base la propositio est vraie pour = 0. Cas iductif si la propositio est vraie pour = k, où k 0 est u ombre pair, alors elle l est pour = k+2. E effet, das le premier cas, les valeurs 0, 1, 2, 3 et 4 e sot pas couvertes. Das le secod cas, les valeurs impaires de e sot pas couvertes. Nous pouvos maiteat, à titre d exemple, écrire la preuve complète de (2.1) : Exemple 10 Cas de base = 0. Cela reviet à prouver que : ce qui est équivalet à : 0 i=0 2 i = = Or, 2 0 = 1 et = 2 1 = 1. La propositio est doc vraie pour = 0.

24 24 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ Cas iductif Supposos que la propositio est vraie pour = k. Cela veut dire que (hypothèse d iductio) : k i=0 2 i = 2 k+1 1 (2.4) Motros que la propositio est vraie aussi pour = k + 1, c est-à-dire que : k+1 i=0 2 i = 2 k+2 1 Or, k+1 i=0 2i peut se réécrire e : k i=0 2i + 2 k+1. Doc o doit motrer que : k i=0 2 i + 2 k+1 = 2 k+2 1 L hypothèse d iductio (2.4) ous permet de remplacer k i=0 2i par 2 k+1 1. O doit doc motrer que : 2 k k+1 = 2 k+2 1 E réécrivat le membre de gauche, o se red compte que : 2 k k+1 = 2 k k+1 1 = 2 (2 k+1 ) 1 = 2 (2 2 2) 1 }{{} k+1 fois = }{{} k+2 fois = 2 k+2 1 E utilisat l hypothèse que la propositio est vraie pour = k, o a doc motré qu elle était vraie pour = k + 1. Quelques commetaires s imposet au sujet de cette preuve : 1. Remarquez que ous avos veillé à bie faire apparaître la découpe e cas de base et cas iductif. C est importat pour faciliter la compréhesio du lecteur. 2. Remarquez que ous avos bie précisé quelle est l hypothèse d iductio. Cela doit toujours apparaître clairemet das le cas iductif. 3. Observez commet ous avos trasformé k+1 i=0 2i e k i=0 2i + 2 k+1, a de pouvoir esuite se servir de l hypothèse d iductio. C est le poit crucial de la preuve, car c est là qu o ramèe le cas = k + 1 au cas = k, ce qui ous permet de costruire otre chaîe de raisoemets. D autres exemples sot doés au cours.

25 2.3. PREUVES DE PROGRAMMES Preuves de programmes Motros maiteat commet les techiques de preuves développées das la sectio précédete permettet de raisoer sur des programmes itératifs. Ce lie est assez aturel, car pour prévoir l effet de k itératios d ue boucle doée, il faut e gééral coaître l effet de k 1 itératios. E effet, la k e itératio s exécute après les k 1 première itératios, et so effet déped doc des valeurs des variables après k 1 itératios. O retrouve là l esprit des preuves par iductio : pour prouver qu ue certaie propositio est vraie après u ombre arbitraire d itératios d ue certaie boucle, o motrera d abord que la propositio est vraie avat la première itératio ; puis o motrera que si la propositio est vraie pour k 1 itératios, elle l est aussi pour k itératios. Cosidéros à ouveau l Algorithme 3. Pour rappel, ous aimerios prouver la propositio (2.2). Pour ce faire, ous allos prouver que : Après k itératios de la boucle tat que, ous avos : i = k et S = k 1 j=0 T[j] Autremet dit, la variable i compte le ombre d itératios effectuées par la boucle, et S cotiet la somme des k premiers termes du tableau T. Cette affirmatio exprime doc la faço dot l algorithme progresse : e cosidérat, à chaque tour de boucle, ue ouvelle case du tableau T, et e ajoutat le coteu de cette case à la variable S. Aisi, au bout de tour de boucles (quad i = ), S cotiedra bie la somme des cases T[0],T[1],...,T[ 1]. Remarquos que cette assertio doit être vraie pour tout k 0. Remarquos que das le cas où k = 0, otre assertio deviet «Après 0 itératios de la boucle...», ce qui doit être compris comme «Avat l exécutio de la boucle». Théorème 1 Pour tout k 0 : après k itératios de la boucle tat que de l Algorithme 3, ous avos : i = k et S = k 1 j=0 T[ j]. Preuve. La preuve est par iductio sur k. Cas de base k = 0 cela reviet à prouver que i = 0 et S = 0 avat l exécutio de la boucle, ce qui est trivialemet vrai e raiso des deux iitialisatios e d algorithme. Cas iductif k = l 1 l hypothèse d iductio est la suivate. Après l 1 itératios de la boucle tat que de l Algorithme 3, ous avos : i = l 1 et S = l 2 j=0 T[ j]. La l e itératio de l algorithme a pour effet d ajouter la valeur stockée das T[i] à S (avec i = l 1, par hypothèse d iductio), puis d icrémeter i de 1. Doc, à la de la l e itératio, ous avos : et Ce qui prouve le théorème. l 2 S = j=0 l 1 T[j]+T[l 1] = i = l 1 Ayat prouvé ce théorème, ous sommes maiteat e mesure de coclure que otre algorithme est bie correct. E effet, ous avos déjà observé que la variable i pred la valeur lorsque la boucle tat que se termie. Doc, d après le Théorème 1, S = 1 j=0 T[j] (ous pouvos remplacer i et k par, puisque i = et i = k). Comme la foctio revoie S/, ous avos prouvé qu elle calcule bie la moyee des premiers élémets du tableau T. j=0 T[j]

26 26 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ Notio d ivariat de boucle Si ous observos attetivemet le Théorème 1, ous costatos qu il ous fourit ue iformatio sur les valeurs des variables de l Algorithme 3, à des poits précis de l exécutio de la boucle tat que. Ces poits das l exécutio sot : avat l exécutio de la boucle et après chaque itératio de la boucle. Autremet dit : à chaque fois que l algorithme aborde l istructio qui évalue la coditio i < (ce que ous appelleros plus simplemet «le de la boucle»). Ces istats sot ceux qui correspodet à la boule oire sur la Fig 2.1. Le Théorème 1 ous appred qu à ces istats, la variable i cotiet exactemet le ombre k d itératios qui ot été effectuées, et que la variable S cotiet la somme des k = i premières cases du tableau. Ceci peut être résumé par : S = i 1 j=0 T[j] (2.5) Ue assertio qui est toujours vraie e de boucle est appelée u ivariat de la boucle. C est le cas de la formule (2.5). Les ivariats représetet u outil précieux pour expliquer le comportemet d ue boucle (et doc pour prouver la correctio de la boucle). Remarquos qu il existe plusieurs ivariats possibles pour ue boucle doée. E effet, il est égalemet toujours vrai, e de boucle, que S = i 1 j=0 T[j] i, ce qui est plus précis que (2.5). Il est égalemet toujours vrai, e de boucle, que 1+1 = 2. E effet, cette derière assertio est toujours vraie (idépedemmet de la boucle), et est doc aussi u ivariat de la boucle tat que de l Algorithme 3. L icovéiet est que ce derier ivariat e ous appred rie sur les variables de l Algorithme 3, et ous permettra doc pas de raisoer à propos de ce derier. Il importe doc de choisir u ivariat suffisammet précis que pour pouvoir raisoer sur l algorithme cosidéré. Remarquos égalemet que l ivariat (2.5) ous permet de prouver la correctio de l Algorithme 3. E effet, à la de l exécutio de la boucle, ous savos que i =. E remplaçat i par das 3, ous obteos que S = 1 j=0 T[j] à la de la boucle. Das l exemple que ous avos cosidéré, ous avos d abord prouvé le Théorème 1, que ous avos esuite ré-exprimé sous forme d ivariat. Cette démarche a été adoptée a d exposer clairemet les raisoemets à l œuvre, et d itroduire aisémet la otio d ivariat. E pratique, o procède e gééral de faço quelque peu différete. Imagios qu o veuille prouver qu ue certaie assertio P est vraie à la d ue boucle. 1. O commece par «devier» u ivariat I de la boucle, qui exprime le plus précisémet possible le comportemet de celle-ci. 2. O prouve que I est bie u ivariat. Ceci se fait par iductio, das le même esprit que la preuve du Théorème 1 : (a) O motre que I est vrai iitialemet («au bout de 0 itératios»). (b) O motre que si I est vrai après k itératios, il est aussi vrai après k + 1 itératios. Aisi, o est certai que I est vrai au bout d u ombre quelcoque d itératios, ce qui e fait bie u ivariat.

27 2.3. PREUVES DE PROGRAMMES O motre que dès qu o sort de la boucle (c est-à-dire dès que la coditio C de la boucle est fausse), l ivariat garatit que P est vrai. Autremet dit, o motre que I C P. Si o arrive pas à effectuer le derier poit, c est soit parce que P est pas vraie à la de la boucle (o a doc trouvé u bug...), soit parce que l ivariat I est pas assez précis. Il faut alors e trouver u autre et recommecer U exemple de preuve par ivariat Illustros cette faço de procéder sur l Algorithme 4. Celui-ci est cesé parcourir les premières cases du tableau T et revoyer le miimum des valeurs stockées das ces cases. Pour ce faire, il parcourt les premières cases du tableau T tout e maiteat ue variable M qui cotiet la plus petite valeur recotrée jusque là. Le traitemet de chaque ouvelle case T[i] cosiste à la comparer à M et à mettre M à jour si écessaire (c est-à-dire sir T[i] < M). Etier Miimum(Etier T[],Etier ) Etier M := T[0] ; Etier i := 1 ; tat que i < faire si T[i] < M alors M := T[i] ; i := i+1 ; retourer M ; Algorithme 4 : U algorithme qui revoie la valeur miimum stockée das les premières cases du tableau T. O aimerait prouver que Miimum revoie bie le miimum de premières cases de T, c est-à-dire que : Miimum(T, ) = mi T[j] (2.6) 0 j 1 A de réaliser cette preuve, ous proposos l ivariat (2.6) qui formalise l idée développée ci-dessus. Cet ivariat spécifie que M cotiet le miimum des cases de T qui ot été explorées. Ces cases sot celles dot l idice est compris etre 0 et i 1. Prouvos qu il s agit bie d u ivariat : M = mi T[j] i (2.7) 0 j i 1 Théorème 2 L assertio (2.7) est u ivariat de la boucle tat que de l Algorithme 4. Preuve. La preuve est par iductio sur le ombre k d itératios de la boucle. Cas de base : k = 0 Avat l exécutio de la boucle, ous avos i = 1. L assertio (2.7) deviet : M = mi 0 j 0 T[j] ce qui est équivalet à M = mi{t[0]} = T[0]. Ceci est vrai grâce à l iitialisatio de M.

28 28 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ Cas iductif : k = l 1 L hypothèse d iductio spécifie qu au bout de l 1 itératios de la boucle, l ivariat est respecté. Observos 2 qu o bout de l 1 itératios, la variable i pred la valeur l. L hypothèse d iductio garatit doc qu au bout de l 1 itératios, M = mi 0 j l 1 T[ j] i. Ue fois etré das la boucle, o sait que i < car la coditio est vérifiée. O a doc : M = mi 0 j l 1 T[j] i < i = l. O a esuite deux possibilités : 1. Soit o etre das le si. Das ce cas, o sait que T[i] < M, autremet dit que T[l] < mi 0 j l 1. Ceci veut dire que T[l] est le miimum des cases de 0 à l (iclus). Comme o assige T[i] = T[l] à M, o obtiet M = mi 0 j l T[j]. Par ailleurs i reste ichagé, et doc o a aussi i < i = l. 2. Soit o etre pas das le si. Das ce cas, T[i] M, autremet dit : T[l] mi 0 j l 1. Doc T[i] e permet pas de modifier le miimum, et o a bie M = mi 0 j l T[j]. Par ailleurs, i reste ichagé, et doc o a aussi i < i = l. Das les deux cas, o arrive à la même coclusio : M = mi 0 j l T[ j] i < i = l. Le tour de boucle se termie par l icrémetatio de i, et o a doc, à la de la l e itératio : M = mi T[ j] i i = l+1 0 j l Ce qui est équivalet à (o peut remplacer l par i 1) : M = mi T[ j] i 0 j i 1 O peut maiteat prouver que l algorithme est correct. E effet, quad o sort de la boucle, o sait que i. À ce même momet, l ivariat M = mi 0 j i 1 T[j] i reste valable. Doc, à la sortie de la boucle, o a 3 : i M = mi 0 j i 1 T[j] i. La cojoctio de i et i implique que i =. O a doc : M = mi T[j] i = 0 j 1 ce qui implique, e particulier que M (la valeur revoyée) cotiet le miimum des premières cases du tableau T. 2.4 Récursivité Comme ous l avos déjà metioé das l itroductio de ce chapitre, ue déitio récursive est ue déitio qui fait référece à elle-même ; das laquelle l objet à déir est déi e foctio d u autre objet sur lequel la même déitio s applique. Nous avios fouri l exemple de la factorielle du ombre : si = 1, alors la factorielle de est 1, sio, la factorielle de est la factorielle de 1 multipliée par (ce que ous avios exprimé sous ue forme plus «matheuse» ci-dessus). Pourquoi ue telle déitio a-t-elle du ses? Pour le compredre, calculos la factorielle de 5, à l aide de cette déitio : 5! = 4! 5 2 Ceci pourrait être prouvé rigoureusemet. 3 C est ce que ous avios désigé par I C plus haut.

29 2.4. RÉCURSIVITÉ 29 or, par la même déitio, ous avos : Doc : 4! = 3! 4 5! = 3! 4 5 E appliquat le même raisoemet, ous obteos : 5! = 2! ! = 1! Nous retombos doc alemet sur le cas 1!, qui vaut 1, par déitio. Doc : 5! = = 120 Ce qu il importe de remarquer das ce développemet, c est qu o peut, à u certai momet, ivoquer le cas 1!, dot la déitio ous est doée directemet (o a pas besoi de calculer ue autre factorielle pour déduire 1!). C est cette propriété importate qui fait que la déitio récursive de la factorielle a du ses. Sas cela, o pourrait e être réduit à ue déitio qui se «mord la queue» comme das l exemple suivat : Exemple 11 f(x) = 5 si x = 0 2 f ( ) x 2 si x est pair et 0 f(2 x) 1 si x est impair Das le cas f(0), la foctio est bie déie. Par cotre, das le cas f(2), par exemple, la déitio ous dit de calculer 2 f(1), et f(1) = f(2) 1... La valeur f(2) est doc déie e foctio de f(1), qui est déie e foctio de f(2). Cette déitio a pas de ses. U autre exemple de déitio récursive classique et doée par le plus grad diviseur commu, ou pgcd. E effet, si i > j, alors : { j si i mod j = 0 pgcd(i, j) = pgcd( j, i mod j) sio Remarquos alemet que cette idée a doé lieu à diverses boutades, otammet das le choix des oms des projets das la commuauté ope source. L acroyme GNU, par exemple, sigifie officiellemet 4 GNU is ot Uix... U expert e pédagogie a u jour décrété que «Pour compredre la récursivité, il faut d abord compredre la récursivité», etc... 4 Voir ØØÔ»»ÛÛÛº ÒÙºÓÖ» ÒÙ» ÒÙ¹ ØÓÖݺ ØÑÐ.

30 30 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ Récursivité et iductio Comme o l a vu das au cours des paragraphes précédet, ue déitio récursive compred u ou plusieurs cas gééraux qui sot propremet récursifs (par exemple :! = ( 1)!), et u ou plusieurs cas de base qui e sot pas récursifs, et auxquels o aimerait se rameer (par exemple : 1! = 1). O retrouve doc l idée de «tout rameer à des cases de base bie déis», déjà présete das les preuves par iductio. Ces deux cocepts sot e effet liés, et il est possible de prouver des propriétés de déitio récursives à l aide de l iductio, comme le motre l exemple suivat : Exemple 12 Prouvos le théorème suivat, qui idique que les deux déitios (orécursive et récursive) de la factorielle sot équivaletes. La foctio f 1 calcule la factorielle par la déitio o-récursive, et la foctio f 2 la calcule par la déitio récursive. Théorème 3 Pour tout 1, f 1 () = f 2 (), avec : f 1 () = i=1 i et f 2 () = { f2 ( 1)! si > 1 1 si = 1 Preuve. Par iductio sur. Cas de base : = 1 Das ce cas, o a f 1 (1) = 1 et f 2 (1) = 1. Cas iductif : = k > 1 L hypothèse d iductio ous garatit que pour = k 1 f 1 () = f 2 (). Das le cas où = k, ous avos : f 2 () = f 2 (k) = k f 2 (k 1) Or, par hypothèse d iductio, f 2 (k 1) = f 1 (k 1). Doc : f 2 () = f 2 (k) = k f 1 (k 1) Par ailleurs, f 1 (k 1) = (k 1), par déitio. Doc : f 2 () = f 2 (k) = k (k 1) = (k 1) k = i=1 i = f 1 (k) = f 1 ()

31 2.4. RÉCURSIVITÉ Foctios récursives La otio de récursivité telle qu appliquée aux déitios mathématiques a doé lieu à ue techique de programmatio, la récursivité, das laquelle u algorithme fait appel à lui-même pour résoudre u programme. Cela a déjà été illustré par l Algorithme 1, qui calcule la valeur! de faço récursive. Comme das le cas des déitios récursive, ue foctio récursive peut poser problème si elle exécute jamais so cas de base. Par exemple, l Algorithme 5 (qui implémete la foctio f(x) de l Exemple 11 ci-dessus) e reverra jamais aucue valeur pour x = 2, par exemple. E écrivat ue foctio récursive, il faut doc toujours s assurer que celle-ci ira par atteidre u de ses cas de base, et ceci, quelle que soit la valeur avec laquelle o l appelle. Etier FoctioRec(Etier x) begi si x = 0 alors retourer 5 ; sio si x mod 2 = 0 alors Etier y := FoctioRec(x/2) ; retourer 2 y ; sio Etier y := FoctioRec(2 x) ; retourer y 1 ; ed Algorithme 5 : Ue foctio récursive problématique... L utilisatio de la récursivité e algorithme sera extesivemet illustrée das la suite du cours. Preuves de programmes récursifs Il est possible de raisoer formellemet au sujet de programmes récursifs. Par exemple, o peut prouver que l Algorithme 1 revoie toujours 1 2 : 1 : Facto() = Cette preuve se fait par iductio est est essetiellemet la même que celle du Théorème 3. D autres exemples serot développés au cours. i=1 i

32 32 CHAPITRE 2. ITÉRATION, INDUCTION, RÉCURSIVITÉ

33 Chapitre 3 La complexité algorithmique 3.1 Itroductio Le but d u algorithme est de fourir ue solutio automatisable à u problème doé, ous l avos dit das le chapitre d itroductio. Mais fourir ue solutio correcte est pas suffisat, ecore faut-il que l algorithme proposé se motre efficace. E effet, quelle est l utilité d u algorithme correct mais qui est pas capable de fourir ue répose e mois de dix as, même quad il est exécuté sur les meilleurs ordiateurs du marché? Nous aimerios doc disposer d ue mesure de l efficacité d u algorithme. Celleci ous permettrait, état doé plusieurs algorithmes résolvat le même problème, de comparer leurs efficacités respectives et de choisir le plus adapté au cas de figure qui ous itéresse. C est l objet de la complexité algorithmique, que ous appelleros tout simplemet complexité das ce cours 1. La complexité d u algorithme est ue mesure de so efficacité, et u algorithme aura ue complexité d autat plus élevée qu il sera iefficace. Tetos de préciser quelque peu ces otios Notio d efficacité Nous cosidéreros qu u algorithme est d autat plus efficace qu il cosomme peu de ressources. Les ressources cosommées par u algorithme sot typiquemet : Le temps (processeur) La mémoire L espace disque Le ombre d accès au disques... Das le cadre de ce cours, ous ous restreidros au temps. Néamois, les techiques et résultats développés ici serot aisémet adaptables à d autres types de ressources. 1 Remarquez cepedat qu il existe d autres otios de complexité, tout à fait différetes, comme la complexité d u problème, ou la complexité de Kolmogorov. 33

34 34 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE Mesure du temps de calcul La questio «Quel est le temps cosommé par tel algorithme» a, telle quelle, aucu ses. E effet, le temps de calcul déped : 1. De la machie sur laquelle l algorithme est exécuté. U véérable i386 est beaucoup plus let que la derière géératio de Petium De la quatité de doées à traiter. Par exemple, u algorithme aura certaiemet besoi de plus de temps pour calculer la somme de ombres que pour calculer la somme de 10 ombres. Comme coséquece du premier de ces deux poits (ous reviedros sur le secod u peu plus tard), ous pouvos exclure de mesurer l efficacité d u algorithme e effectuat des tests où l o chroométrerait le temps d exécutio das différets cas de figure. Ue telle mesure dépedrait trop du matériel utilisé pour les tests, et e refléterait pas fidèlemet ue caractéristique de l algorithme. Pour illustrer la techique que ous allos utiliser pour évaluer l efficacité d u processeur, ous pouvos cosidérer le problème suivat : Lire ue valeur e etrée, et afficher à l écra : les couples (i, i) pour i variat de 1 à. Par exemple, si o lit sur l etrée la valeur 5, l algorithme doit afficher : ½ ½ ¾ ¾ Pour résoudre ce problème ous proposos les algorithmes 6 et 7. i := 1 ; lire ; tat que i faire j := 1 ; tat que j faire si i = j alors Afficher i j; j := j + 1; i := i+1; Algorithme 6 : U algorithme pour afficher toutes les paires (i, i) avec 1 i. Das le cas de l algorithme 6, les variables i et j preet des valeurs qui e serot pas affichées. E effet, iitialemet, i vaut 1 et j vaut 1. Ces valeurs serot affichées puisque i = j. Esuite, j sera icrémeté successivemet à 2, 3,... jusqu à atteidre. Toutes ces valeurs e serot pas affichées puisque ous auros i j (autremet dit, le couple (i, j) predra les valeurs (1, 2), (1, 3),... (1, ), qui e serot pas affichées). O voit doc que toute ue série d opératios sot iutiles. L algorithme 7, par cotre, s arrage pour maiteir i = j et o écoomise aisi ue boucle et u test 2. 2 Comme i et j ot toujours la même valeur, o aurait pu se passer d ue des deux variables. Nous avos choisi de les garder pour simplifier la comparaiso.

35 3.2. NOTION D EFFICACITÉ 35 i := 1 ; j := 1 ; lire ; tat que i faire Afficher i j ; j := j + 1 ; i := i+1 ; Algorithme 7 : U autre algorithme pour afficher toutes les paires (i,i) avec 1 i. Il est clair que le secod algorithme est itrisèquemet meilleur que le premier, car il fait l écoomie de calculs iutiles à l affichage, et cette écoomie est totalemet idépedate de la machie choisie pour l exécutio du programme. C est ce gere d observatios que ous aimerios capturer das la otio de complexité Compter le ombre d étapes Ces cosidératios ous amèet à mesurer le temps d exécutio d u algorithme e ombre d étapes de calcul élémetaires effectuées. Autremet dit, o cosidérera qu ue étape de calcul pred ue uité de temps. Nous predros la covetio que les istructios suivates correspodet à ue étape élémetaire : Ue assigatio Ue opératio arithmétique (additio, soustractio,...) Ue comparaiso de deux variables (,,...) Ue lecture sur l etrée U affichage Exemple 13 L opératio i :=(i+3) 2 cosomme trois étapes, car l évaluatio de (i+ 3) 2 compred deux opératios arithmétiques, qui cosommet ue étape chacue, et l assigatio cosomme ue étape. Nous pouvos immédiatemet observer que le ombre d istructios élémetaires cosommées par u algorithme peut dépedre des doées e etrée, et plus précisémet de leur quatité. Par exemple, cosidéros les algorithmes 8 et 9. Il est clair que l algorithme 8 cosomme deux uités de temps, et ce, quelle que soit la valeur lue sur etrée (car l exécutio de l algorithme 8 e déped pas de ). Par cotre, l algorithme 9 exécutera les istructios «Afficher» (ue opératio) et i := i+1 (ue opératio), aisi que le test «i» (ue opératio égalemet) exactemet fois. So temps d exécutio dépedra doc de : il vaut 3+2. Lire ; Afficher ; Algorithme 8 : U algorithme dot le ombre d étapes de calcul est costat.

36 36 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE lire ; i := 1 ; tat que i faire Afficher ; i := i+1 ; Algorithme 9 : U algorithme dot le ombre d étapes de calcul déped de la valeur lue e etrée. U problème similaire se présete das le cas où l o a u test. Cosidéros l Algorithme 10. Das le cas où l utilisateur etre la valeur 1 pour, l algorithme cosommera 3 étapes (lecture de, test et affichage). Sio, l algorithme cosommera 3+3 étapes (le étapes qui sot commues à l Algorithme 9, plus le test). Das le premier cas, l Algorithme 10. est doc beaucoup plus efficace que das le secod. Or, ous voulos doer ue complexité uique pour cet algorithme. Le choix gééralemet adopté das ce cas de figure cosiste à être pessimiste et à fourir le pire cas. Das le cadre de ce cours, ous feros toujours ce choix. O dira doc que cet algorithme cosomme étapes. lire ; si = 1 alors Afficher ; sio i := 1 ; tat que i faire Afficher ; i := i+1 ; Algorithme 10 : U algorithme dot le ombre d étapes de calcul est parfois costat, parfois liéaire. De maière géérale, la difficulté das l évaluatio du ombre d étapes requises par u algorithme se trouvera das l évaluatio du ombre d étapes cosommées par ses boucles, car il e sera pas toujours facile de voir combie de fois la boucle s exécute. O peut résumer les cosidératios de cette sectio par les quelques règles cidessous. Celles-ci sot souvet 3 suffisates pour évaluer le ombre d étapes écessaires à l exécutio d u algorithme. Das les règles qui suivet I, I 1 et I 2 sot des blocs d istructios, et T est u test. 1. Si I 1 cosomme k 1 étapes et I 2 cosomme k 2 étapes, la séquece I 1 ;I 2 cosomme k 1 + k 2 étapes. 2. Si I cosomme k étapes, T cosomme l étapes, alors la boucle TatQue(T){I} cosomme (l+k)+l étapes, où est le ombre d exécutios de la boucle. 3 Mais pas toujours : voir les exemples doés au cours. Pour évaluer correctemet le ombre d étapes cosommé par u algorithme, il est doc impératif d e compredre le foctioemet das les moidres détails.

37 3.3. LA NOTION DE GRAND O 37 Remarquos que les l étapes supplémetaires vieet du fait qu il faut exécuter ue fois supplémetaire le test pour se redre compte qu o doit sortir de la boucle. 3. Si I 1 cosomme k 1 étapes, I 2 cosomme k 2 étapes et T cosomme l étapes, l istructio If(T){I 1 }Sio{I 2 } cosomme l+max{k 1,k 2 } étapes. 3.3 La otio de grad O Nous sommes maiteat capables de caractériser le ombre d étapes (toujours au pire cas, selo ce que ous avos dit plus haute) écessaires à u algorithme pour effectuer so traitemet. Nous allos maiteat itroduire la otio de grad O, qui va ous permettre d exprimer ces temps d exécutio de maière plus uiforme, et d effectuer des simplificatios Ituitio Pour ce faire, cosidéros l exemple suivat. Supposos qu o veuille comparer trois algorithmes, qui doivet traiter des doées de taille. Pour réaliser ce traitemet : 1. le premier algorithme écessite étapes. 2. le secod algorithme écessite étapes. 3. le troisième algorithme écessite étapes. Le graphique de la Fig. 3.1 motre l évolutio de ce ombre d étapes e foctio de la valeur de (pour compris etre 0 et 5). O a égalemet idiqué le ombre d étapes que predrait u algorithme écessitat 3 étapes. O costate que les comportemets des algorithmes 2 et 3 sot très proches l u de l autre, et très proches de 3, alors que l algorithme 1 se démarque. Cette tedace est beaucoup plus ette si o regarde des grades valeurs de, comme o peut le voir sur la Fig. 3.2 : les courbes des algorithmes 2 et 3, et la courbe de 3 se cofodet, l algorithme 1 explose. Sur base de ces observatios, ous pouvos dire que les algorithmes 2 et 3 se comportet grosso modo de la même maière, c est-à-dire e cosommat de l ordre de 3 étapes, alors que l algorithme 1 est beaucoup mois efficaces et cosomme de l ordre de 4 étapes. Remarquos qu il s agit à chaque fois du terme de poids le plus élevé du polyôme (sas la costate). La otio de grad O ous permet de formaliser cela. Nous diros que et sot e grad O de 3, tadis que est e grad O de 4. Les deux deriers algorithmes serot doc cosidérés comme aussi performats l u que l autre, alors que le premier sera vu comme mois performat Déitio formelle La déitio formelle est la suivate : Déitio 1 Soiet f(x) et g(x) deux foctios réelles. O dit que f est e grad Ode g, ce qui est oté f(x) = O ( g(x) ), si et seulemet s il existe deux costates x 0 0 et k 0 telles que : x > x 0 : 0 f(x) k g(x)

38 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE A l g o r i t h m e 1 x ^ 3 A l g o r i t h m e 2 A l g o r i t h m e FIG. 3.1 Comparaiso de polyômes de degrés 3 et 4 (petite échelle). 1 x A l g o r it h m e 1 8 x x ^ 3 A l g o r i t h m e 2 A l g o r i t h m e 3 6 x x x FIG. 3.2 Comparaiso de polyômes de degrés 3 et 4 (grade échelle).

39 3.3. LA NOTION DE GRAND O 39 Ituitivemet, cette déitio dit que la foctio g(x) (multipliée par ue certaie costate k) est toujours au-dessus de la foctio f(x), si o églige les valeurs iitiales de x (celles qui sot x 0 ). La foctio g(x) peut doc être vue comme ue bore supérieure de la foctio f(x), et ce, pour des valeurs de x suffisammet grades, ce qui est bie compatible avec otre choix de faire des aalyses au pire cas. Regardos quelques exemples : Exemple La foctio f(x) = 2x 3 + x 2 est e O(x 3 ). Pour motrer cela, il suffit de trouver les deux costates x 0 et k de la déitio. O peut proposer, par exemple, k = 3 et x 0 = 0. E effet : x > x 0 : 0 f(x) k g(x) ssi x > 0 : 0 2x 3 + x 2 3x 3 ssi x > 0 : 0 2x 3 + x 2 2x 3 3x 3 2x 3 ssi x > 0 : 0 x 2 x 3 ce qui est vrai. E effet, pour tout ombre x strictemet positif, so carré est positif et iférieur ou égal à so cube. 2. La foctio f(x) = 2x 3 + x 2 est aussi e O(x 4 ), O(x 5 ), etc. C est bie cohéret avec otre ituitio qui cosiste à voir le O comme ue bore supérieure : il est clair que x 4 est ue bore supérieure de x 3. Or, 2x 3 + x 2 est e O(x 3 ). Doc, x 4 est aussi ue bore supérieure pour cette foctio. 3. Par cotre, f(x) = 2x 3 + x 2 est pas e O(x 2 ), O(x). 4. La foctio f(x) = 5 est e O(1) (preuve : preez x 0 = 0 et k = 5). Elle est doc aussi e O(x), e O(x 2 ), La foctio f(x) = 3 log(2x) est e O(log(x)). Preuve : exercice. Aisi, o peut maiteat exprimer les complexités des algorithmes 8, 9 et 10 e terme de O. L algorithme 8 a ue complexité e O(1), et les algorithmes 10 et 9 ot ue complexité e O(). Par la suite, o écrira souvet que ces algorithmes sot «e O(1)», «e O()» Classes de complexité algorithmique Il est commode de grouper les foctios e quelques «classes de complexité algorithme», e foctio de leur caractérisatio e terme de O. Voici les classes les plus courates : Complexité O Costate O(1) Logarithmique O(log()) Liéaire O() Quadratique O( 2 ) Cubique O( 3 ) Expoetielle O(2 )

40 1 40 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE 1 x y = 1 ( 0 2 0, 6 ) y = x ( 0 2 0, 6 ) y = x * * 2 ( 0 2 0, 6 ) y = x * * 3 ( 0 2 0, 6 ) y = l o g ( x ) ( 0 2 0, 6 ) y = 2 * * x ( 0 2 0, 6 ) FIG. 3.3 Comparaiso de différetes foctios caractérisat les pricipales classes de complexité algorithmique (échelle logarithmique e ordoées). Das ce tableau, ous avos préseté les classes par ordre croissat de complexité. Aisi, toute foctio e O( 2 ), par exemple, sera aussi e O( 3 ), O(2 ), etc. La Fig. 3.3 illustre cela e fourissat ue comparaiso des foctios caractéristiques de ces classes Règles de combiaiso et de simplificatio Jusqu à préset, la méthode suggérée pour calculer la complexité d u algorithme e terme de O cosiste à calculer la foctio f(x) qui doe le ombre d étapes écessaire à l algorithme pour des doées de taille x, puis à trouver u foctio g(x) (la plus précise possible) telle que f(x) = O(g(x)). Cette approche est pas très commode e pratique. O désirerait pouvoir raisoer directemet e terme de O sur certaies parties du programme, et esuite combier ces différets résultats. La déitio du O ous permet d obteir plusieurs règles de combiaiso et de simplificatio qui vot ous aider e cela. Parmi les règles de simplificatio, o trouve : Suppressio des costates multiplicatives Ue foctio f(x) = c h(x), où c est ue costate etière, est e O(h(x)). Pour le prouver, il suffit de predre x 0 = 0 et k = c das la déitio. Par exemple, 3x 2 est e O(x 2 ). Terme le plus sigificatif Das ue somme de foctios, o peut se coteter de garder le terme le plus sigificatif quad o passe au O (voir les classes ci-dessus). Par exemple, f(x) = x+log(x) est e O(x).

41 3.3. LA NOTION DE GRAND O 41 Das le cas particulier des polyômes, il s agit du terme de plus haut degré. Par exemple, 3x 2 + 2x+3 est e O(3x 2 ), et doc e O(x 2 ), par la règle de suppressio des costates multiplicatives. Les règles de combiaiso ous permette d aalyser le programme morceau par morceau, et de combier les différets résultats : Séquece Si I 1 est ue suite d istructios e O( f 1 ) et I 2 est ue suite d istructios e O( f 2 ), alors I 1 ;I 2 est e O( f 1 + f 2 ). Boucle Si I est ue suite d istructios e O( f), et que T est u test e O(g), alors tat que (T){I} est e O(l ( f + g)), où l est le ombre d exécutios de la boucle. Test Si I 1 est ue suite d istructios e O( f 1 ), I 2 est ue suite d istructios e O( f 2 ) et T est u test e O(g), alors si(t){i 1 }sio{i 2 } est e O(max f 1, f 2 + g), ou, plus simplemet, e O( f 1 + f 2 + g). Cette derière forme est équivalete par la règle du Terme le plus sigificatif. De maière similaire, si(t){i 1 } est e O( f 1 + g). Appel de foctio U appel de foctio passe le cotrôle de l exécutio à la foctio. Il faut doc calculer la complexité de la foctio, qui pourra alors être utilisée comme complexité de l appel. Das le cas des foctios récursives, cette complexité peut être plus difficile à calculer. La sectio 3.4 y est cosacrée. E pratique, le calcul de la complexité d u algorithme peut faire appel à plusieurs de ces règles, comme l illustre l exemple suivat. Exemple 15 Reveos aux algorithmes 6 et 7. Nous avios vu ituitivemet que le premier était mois efficace que le secod. Pouvos-ous obteir cette iformatio de maière plus précise grâce à la complexité? La répose est oui! Pour ce faire, ous calculos d abord la complexité de l algorithme 6. Nous commeços par aalyser le coteu de la boucle tat que j, la plus imbriquée. Celle-ci cotiet u si, dot le corps e cotiet qu ue istructio d affichage. Elle est doc e O(1). Le test i = j est égalemet e O(1). Par la règle du Test, tout le si est e O(1+1) = O(2), ce qui est e O(1), par la règle de suppressio des costates multiplicatives. Le si est suivi d ue assigatio, qui est e O(1). Le coteu de la boucle est doc e O(1 + 1) = O(2), par la règle de la séquece. À ouveau, o simplifie e O(1). Le test j de cette boucle est e O(1). La boucle s exécute fois, puisque j est iitialisée à 1 avat la boucle, et icrémetée de 1 à chaque tour de boucle. E appliquat la règle de la boucle, o trouve que celle-ci est e O( (1+1)) = O(2). O simplifie à ouveau e O(). Regardos maiteat la boucle tat que i. Elle cotiet ue séquece composée d ue assigatio j := 1, e O(1) ; de la boucle aalysée ci-dessous, e O() ; et e d ue autre assigatio i := i+1 e O(1). Le coteu de la boucle est doc e O(1++1) = O(+2), soit O(), car o e garde que le terme le plus sigificatif. Ici aussi, la boucle s exécute fois et le test est e O(1). La boucle est doc e O( (+1)) = O( 2 + ). Cette derière expressio est e O( 2 ), car o e garde que le terme de degré le plus élevé. Fialemet, l algorithme complet est lui-même ue séquece composée d ue assigatio i := 1 e O(1) ; d ue lecture de, e O(1) ; et de la boucle aalysée au paragraphe précédet, e O( 2 ). L algorithme 6 est doc e O( 2 + 2) = O( 2 ). E aalysat l algorithme 7 à l aide des mêmes méthodes, o trouve ue complexité de O(). E effet, celui-ci est composé d ue iitialisatio e O(1), et d ue boucle

42 42 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE s exécutat fois, et dot le coteu et le test sot e O(1). Ceci ous permet de coclure que l algorithme 7 est plus efficace que l algorithme Le cas des programmes récursifs Comme ous l avos déjà dit, o traite les appels de foctios e assigat à l appel la complexité de la foctio appelée. Par exemple, pour évaluer la complexité de l Algorithme 11, o procède comme suit : o évalue d abord la complexité de la foctio g, qui est e O(). Esuite, o cosidère la foctio f. Celle-ci est composée d ue boucle Tat que qui s exécute fois. Le corps de cette boucle compred u appel à g, e O() et ue icrémetatio e O(1). Le corps de la boucle est e O(+1) = O(). La boucle est doc e O( ) = O( 2 ). C est aussi la complexité de la foctio f. f(x) i := 0; tat que i < faire g(x) ; i := i+1 ; g(x)... U traitemet e O()... ; Algorithme 11 : Exemple d appel de foctio et de calcul de la complexité. L évaluatio de la complexité d ue foctio récursive peut poser des difficultés. E effet, si ous cosidéros le cas d ue foctio f qui s appelle elle-même, et que ous appliquos le même raisoemet que ci-dessus, ous ous retrouvos à devoir évaluer la complexité de f a de pouvoir calculer la complexité de f... Nous allos utiliser à ouveau le raisoemet par iductio pour arriver à os s. Cosidéros le cas de la foctio Facto, doée à l Algorithme 2 (Sectio 2.1.3), qui calcule la factorielle de de faço récursive. Clairemet, le temps écessaire pour calculer la factorielle de va dépedre du ombre d appels récursifs qui ot lieu. E effet, si ous appelos, par exemple Facto(5), la foctio Facto appelle Facto(4), qui appellera Facto(3), qui appellera Facto(2), qui appellera Facto(1). Cette derière s exécuter e O(1), e revoyat directemet la valeur 1. Le ombre d appels à la foctio Facto est doc exactemet 5. Il est facile de voir qu u appel à Facto(9), par exemple, aurait doé lieu à 9 appels à Facto ; qu u appel à Facto(3) aurait doé lieu à 3 appels, etc. Or, chacu de ces appels cosiste e l évaluatio de la coditio du Si (e O(1)), et e l appel récursif. Le traitemet propre à chaque appel (c est-à-dire tout ce qui e cocere pas l appel récursif) s exécute doc e temps costat. Doc, l algorithme cosiste à echaîer appels qui preet u temps costat, et o peut doc raisoablemet peser que la complexité de cette foctio est e O().

43 3.4. LE CAS DES PROGRAMMES RÉCURSIFS Utilisatio de l iductio Remarquos que pour arriver à cette coclusio, ous avos utilisé u raisoemet similaire à celui dot ous ous sommes servis das les preuves par iductio : ous avos rameé le calcul de la complexité de Facto() au calcul de la complexité de Facto( 1), que ous avos rameé au calcul de la complexité de Facto( 2),... jusqu à se rameer à la complexité de Facto(1). Cette derière est facile à obteir car aucu appel récursif a lieu. Ce que ous veos de faire est autre que l esquisse d ue preuve, par iductio, que la complexité de Facto() est bie O(). Écrivos-la formellemet. Théorème 4 Facto est e O(). Preuve. Nous allos prouver que l exécutio de Facto() peut être décomposée e traitemets e O(1). Cette preuve est par iductio sur. Cas de base : = 1 La foctio revoie directemet 1, ce qui est bie e O(1). Cas iductif : = k 1 L hypothèse d iductio stipule que l exécutio de Facto(k 1) peut être décomposée e k 1 traitemets e O(1). L exécutio de Facto(k) correspod à : 1. L évaluatio de la coditio du si e O(1). 2. L évaluatio du paramètre de l appel récursif, e O(1). 3. L appel récursif Facto(k 1). 4. La multiplicatio du résultat de l appel récursif par = k, e O(1). 5. L assigatio à, e O(1). 6. Le retour de la valeur de, e O(1). Au-dehors de l appel récursif, tous les traitemets sot doc e ( 1). O peut doc affirmer que l exécutio de Facto(k) se décompose e : 1. U appel récursif qui correspod à k 1 traitemets e O(1). 2. Des traitemets e O(1) L exécutio de Facto(k) peut doc être décomposée e k traitemets e O(1). O coclut doc que, pour tout 1, l exécutio de Facto() correspod à exécuter blocs d istructios e O(1). Doc, Facto() est e O(). Il est importat de remarquer que, das le cas de Facto, la complexité déped essetiellemet de la profodeur des appels récursifs, comme illustré à la Fig Celle-ci motre l arbre d exécutio de la foctio Facto, dot la hauteur déped clairemet de. Comme chaque iveau de l arbre s exécute e temps costat, o retrouve la complexité e O(). Ce raisoemet est à rapprocher de celui que ous appliquios das le cas des boucles : ous évaluios la complexité d ue itératio de la boucle, que ous multipliios esuite par le ombre d itératios effectuées. Das le cas préset, ous évaluos la complexité des traitemet propres à chaque appel, et ous la multiplios par le ombre d appels. Naturellemet, il est possible de combier appels récursifs et boucles. Das ce cas, le ombre d appels à la foctio récursive peut, lui aussi, dépedre des paramètres de la foctio (par exemple si l appel récursif est effectué das ue boucle dot le ombre d itératios déped d u paramètre). Il faut alors combier les différetes méthodes étudiées das ce chapitre.

44 k 44 CHAPITRE 3. LA COMPLEXITÉ ALGORITHMIQUE Facto(k) = é v a l u e r 1 A p p e l r e c u r s if é v a l u e r r e t o u r e r } O(1) = k 1 é v a l u e r 1 A p p e l r e c u r s if é v a l u e r r e t o u r e r } O(1) = k 2 é v a l u e r 1 é v a l u e r r e t o u r e r } O(1) = 3 = 2 A p p e l r e c u r s if é v a l u e r 1 A p p e l r e c u r s if é v a l u e r 1 A p p e l r e c u r s if é v a l u e r r e t o u r e r é v a l u e r r e t o u r e r } } O(1) O(1) } f o i s = 1 é v a l u e r = 1 r e t o u r e r 1 } O(1) FIG. 3.4 Ue illustratio de l exécutio de Facto(k).

45 Chapitre 4 Les listes Il existe éormémet d applicatios de l iformatique das lesquelles il est écessaire de stocker de l iformatio sous forme de liste, c est-à-dire sous forme de séquece. Par exemple, ue applicatio gérat les étudiats et les cours d ue uiversité devra maiteir : 1. Ue liste des cursus offerts 2. Ue liste des aées das chaque cursus. 3. Pour chaque aée d études, la liste des cours dispoibles 4. Ue liste des étudiats 5. Pour chaque étudiat, la liste des cours qu il a choisis 6. Pour chaque cours, la liste des eseigats impliqués 7. Ue liste des locaux dispoibles 8. etc À chaque fois, l odre des élémets peut être importat : o peut désirer stocker les cursus par ordre de Faculté (d abord les cursus e philosophie et lettres, puis ceux e sciece,...) ; stocker les aées das l ordre imposé par le cursus ; stocker les cours par ordre du ombre de crédits, ou par mémoique; stocker les étudiats par ordre alphabétique, etc. 4.1 Motivatio : critique des tableaux Imagios que ous désirios établir le palmarès des étudiats d ue uiversité. Supposos que les oms des étudiats et les otes obteues sot stockés sur u fichier. Pour ce faire, ous pouvos imagier ue solutio qui cosiste à : 1. Charger la liste des étudiats e mémoire. 2. Pour chaque étudiat, charger la liste de ses poits e mémoire et calculer sa moyee (que l o stocke e mémoire, e regard du om de l étudiat). 3. Trier les étudiats sur base de leur moyee. 4. Imprimer le résultat du tri : coordoées de l étudiat et moyee. Quelle structure allos-ous choisir pour stocker les étudiats e mémoire? Si ous choisissos u tableau, il sera écessaire de déclarer u tableau suffisammet grad 45

46 46 CHAPITRE 4. LES LISTES pour coteir tous les étudiats. Malheureusemet, le ombre d étudiats est peutêtre pas cou à l avace. O choisira doc ue taille qui ous semble beaucoup plus grade que le ombre réel d étudiats, a de e pas dépasser la du tableau. Malheureusemet, les cases suruméraires occuperot de la place «pour rie». De plus, ce ombre d étudiats est susceptible de varier d aée e aée (chaque fois que l o désire établir le palmarès). Rie e ous garatit que la taille suffisate choisie e pour stocker tous les étudiats le sera ecore e E, l implémetatio du tri risque d être lourde, car elle implique de déplacer les iformatios d u étudiat d ue case du tableau vers ue autre, ce qui peut être fort coûteux e temps. E effet, cosidéros le tableau suivat : Proust Hugo Lamartie Musset Baudelaire 12/20 15/20 18/20 19/20 14/20 Pour trier ces étudiats par ordre de otes croissates, et isérer l étudiat Baudelaire à la case 1, etre Proust et Hugo, il est écessaire de décaler Hugo, Lamartie et Musset d ue case «vers la droite». Pour résumer, la faiblesse d u tableau proviet de so aspect statique : 1. Ue fois qu il est déclaré, sa taille e chage plus. 2. Il est pas possible d isérer u élémet à ue positio précise du tableau sas écraser l iformatio qui s y trouve, à mois de la déplacer elle-même. 4.2 Les listes simplemet liées A de cotourer les difficultés liées aux tableaux, que ous veos d idetifier, ous allos itroduire la structure de liste simplemet liée 1. Toutes les structures de liste fot grademet usage de la gestio dyamique de la mémoire. Il est doc coseillé de revoir la Sectio 1.2.3, si écessaire. Das ce cours, ous supposeros égalemet que les listes servet à stocker des etiers, das le but de simplifier le discours. Tout ce que ous allos dire maiteat pourra s étedre aturellemet à d autres types d iformatios (comme des chaîes de caractères, etc). Les problèmes liés aux tableaux provieet pricipalemet du fait que l ordre des élémets est fixé de maière rigide. Si o déit u tableau de ciq cases, par exemple, ces ciq cases serot stockées de maière cotiguë et ordoée e mémoire, sas qu il soit possible d étedre la zoe réservée au tableau. Par exemple, si le premier élémet du tableau est das la 1024 e case mémoire, le secod sera das la 1025 e, le troisième das la 1026 e, etc 2. Das ue liste, les différets élémets costitutifs de la liste e serot pas écessairemet stockés de faço cotiguë, i ordoée. Aisi, le premier élémet de la liste peut se trouver à l adresse 1024, le secod à l adresse 256, le troisième e 532, le quatrième e 2084, etc. A de retrouver la boe séquece des élémets e mémoire, il est écessaire d ajouter de l iformatio à chaque élémet de la liste. Cette iformatio permettra, das ue première approche, de retrouver l élémet suivat, e idiquat so adresse. 1 Parfois appélée : liste chaîée. 2 E faisat l hypothèse que chaque élémet du tableau peut teir das ue case mémoire. Das le cas cotraire, si la tableau commece à l adresse b, et que chaque case cosomme ue place s e mémoire, la x e case du tableau commece à l adresse b+(x 1) s et se termie à l adresse b+x s 1

47 L 4.2. LES LISTES SIMPLEMENT LIÉES N I L FIG. 4.1 U exemple de liste compreat trois élémets, et dot la tête est stockée das la variable L. Aisi, chaque élémet d ue liste sera costitué d u eregistremet du type : struct Elem Etier ifo ; Elem * ext ; que l o représetera graphiquemet comme ceci : Das chaque élémet de la liste, ous stockeros doc ue iformatio, aisi qu u poiteur, idiquat l edroit e mémoire où se trouve l élémet suivat, s il existe. Cet élémet suivat idiquera lui-même où se trouve so suivat, et aisi de suite. Le derier élémet de la liste, qui e possède pas de suivat, cotiedra la valeur covetioelle NIL das so champ ext. Aisi, pour accéder à la totalité de la liste, il e sera écessaire de sauvegarder das ue variable qu u poiteur vers le premier élémet. Ce premier élémet, et, par extesio, la variable qui cotiet so adresse, serot souvet appelés la tête de la liste. O peut doc représeter schématiquemet ue liste simplemet liée comme préseté à la Fig Cet exemple présete ue liste faite de quatre élémets, coteat, respectivemet et das l ordre, les valeurs 1, 2, 4 et 7. La tête de la liste est stockée das la variable L (qui est doc de type «poiteur vers u Elem», et o pas Elem). Das le cas où l o désire ue liste vide, il suffira de stocker la valeur NIL das la variable L poitat vers la tête de la liste Comparaiso aux tableaux Avat d aborder les algorithmes de maipulatio de listes plus e détail, essayos de ous covaicre sur cet exemple que cette ouvelle structure répod aux critiques que ous avios formulées sur les tableaux. 1. La taille de la liste est dyamique, e ce ses qu elle e comporte pas plus d élémets qu il y a d iformatios à stocker. Si l o désire supprimer u élémet,

48 L L 3 48 CHAPITRE 4. LES LISTES N I L FIG. 4.2 U exemple de suppressio das ue liste simplemet liée. Les poiteurs et élémets e poitillés disparaisset lors de la suppressio N I L FIG. 4.3 U exemple d isertio das ue liste simplemet liée. Les poiteurs et élémets e poitillés disparaisset lors de l isertio. o peut s arrager pour qu il apparaisse plus das la séquece, et pour désallouer la mémoire qui le coteait, comme illustré sur la Fig Si o désire ajouter u élémet, il suffit d allouer u ouvel emplacemet mémoire pour le stocker, et modifier les poiteurs de maière à ce que cet élémet apparaisse e boe place das la séquece, comme illustré sur la Fig Le déplacemet d u élémet se résume à ue maipulatio de poiteurs, comme illustré sur la Fig. 4.4 Par cotre, le chaîage des élémets par poiteurs a u icovéiet : o e peut plus directemet accéder à u élémet arbitraire de la liste comme o pouvait le faire avec u tableau. Pour accéder au k e élémet du tableau T, par exemple, il suffit d utiliser l expressio T[k]. Das le cas d ue liste, il est écessaire de parcourir toute la liste depuis le, élémet par élémet, comme ous le verros ci-dessous Algorithmes Passos maiteat e revue différets algorithmes permettat de maipuler des listes simplemet liées. Toutes ces foctios recevrot e paramètre ue liste, c est-àdire u poiteur vers u élémet (la tête de la liste), aisi que d évetuels paramètres supplémetaires.

49 L 4.2. LES LISTES SIMPLEMENT LIÉES N I L FIG. 4.4 U exemple de déplacemet : l élémet 4 se trouve etre 2 et 7 avat le déplacemet, et se retrouve etre 1 et 2 après les déplacemet. Trois poiteurs ot été modifiés. Les poiteurs e poitillés réprésetet les aciees valeurs. Ces foctios sot présetées aux Algorithmes 12, 13 et 14. Costructio d ue liste vide La foctio ListeVide a pour but d iitialiser ue liste. Il suffit doc d assiger la valeur NIL à la tête de la liste. Sa complexité est O(1). Test de la liste vide La foctio EstVide est ue foctio booléee qui reçoit ue liste e paramètre, et qui revoie vrai si et seulemet la liste est vide (c est-à-dire si et seulemet si la tête est ulle). Sa complexité est O(1). Premier élémet de la liste La foctio PremierElem reçoit ue liste et revoie u poiteur vers le premier élémet de la liste, ou NIL si la liste est vide. Cette foctio est triviale, état doé que la tête de la liste est l iformatio demadée. Elle est doée uiquemet das le but d obteir u esemble complet de foctios pour maipuler ce type de listes. Sa complexité est O(1). Derier élémet de la liste La foctio DerierElem reçoit ue liste et revoie u poiteur vers le derier élémet de la liste, ou NIL si la liste est vide. La différece par rapport à la foctio précédete tiet essetiellemet e le parcours qu il est écessaire de réaliser pour obteir u poiteur vers le derier élémet de la liste. Pour ce faire, o utilise ue boucle qui déplace u poiteur sur chaque élémet successif de la liste, e commeçat par la tête. La caractéristique du derier élémet est que so champ ext vaut NIL. Il suffit doc de faire tourer la boucle jusqu à ce que cette coditio deviee vraie. Il faut éamois predre garde au cas de la liste vide, qui doit être testé et traité à part. E effet, si la liste est vide, ous avos p = L = NIL, et l évaluatio du test p.ext NIL doera lieu à ue erreur d accès mémoire.

50 50 CHAPITRE 4. LES LISTES La complexité de cette foctio est e O(), où est le ombre d élémets de la liste. Remarquos qu il s agit d ue complexité au pire cas, mais aussi au meilleur cas, car o est toujours obligé de parcourir tous les élémets de la liste. Isertio e tête d ue liste La foctio IsèreTête reçoit comme paramètres ue liste, et u etier qu il faut isérer das la liste. O souhaite que l élémet apparaisse e tête de la liste après l isertio. L opératio cosiste à créer u ouvel élémet coteat l etier i. Comme cet élémet doit apparaître e tête de liste, so suivat après l isertio sera l élémet e tête avat l isertio. O recopie doc l adresse (stockée das L) de l élémet de tête das le champ ext du ouvel élémet. O fait esuite poiter la tête vers ce ouvel élémet (ce qui justifie le passage par référece de la tête de liste). Remarquez que cet algorithme reste correct si la liste est vide iitialemet. La complexité est e O(1). Isertio e de liste La foctio IsèreFi reçoit comme paramètres ue liste, et u etier et réalise ue isertio e de liste. Le traitemet réalisé cosiste à effectuer ue isertio après le derier élémet de la liste. Il se pourrait que celui-ci existe pas, ce qui sigifie que la liste est vide. Das ce cas, l isertio e de liste reviet à ue isertio e tête. Si la liste est pas vide, ous utilisos DerierElem pour avoir accès au derier élémet, ous créos le ouvel élémet comme successeur de ce derier élémet, puis ous ajustos les champs e coséquece. Sa complexité déped des complexités de EstVide et DerierElem, soit, respectivemet O(1) et O(). E-dehors des appels à ces foctios, IsèreFi e réalise que des traitemet e temps costat. Elle a doc ue complexité e O(). Accès au k e élémet La foctio KIemeElemet reçoit ue liste L et u etier k, et doit revoyer u poiteur vers le k e élémet de L, s il existe. Cotrairemet aux tableaux, il est pas possible d accéder directemet au k e élémet d ue liste. Il faut parcourir la liste depuis le, élémet par élémet, tout e comptat le ombre d élémets visités. Il se peut que le k e élémet existe pas (la liste état trop courte). Das ce cas, la foctio revoie ue erreur, sous forme d u poiteur ul. Autremet, la foctio revoie u poiteur vers le k e élémet. Cette foctio est e O(k). Isertio à la k e positio La foctio IsèreKPos reçoit ue liste L et deux etier i et k. Elle isère das L u ouvel élémet dot l iformatio est i, et ce, à la positio k (si possible). Pour que l isertio soit possible, il faut que la liste cotiee au mois k 1 élémets. L isertio à la k e positio est aisée si o dispose d u poiteur vers le k 1 e élémet (que l o obtiet à l aide de la foctio KIemeElemet). L isertio suit alors l idée représetée à la Fig Remarquos, ue fois de plus, que l isertio e tête doit être traitée comme u cas particulier. Celle-ci a lieu si k = 1. Cette foctio est e O() au pire cas.

51 4.2. LES LISTES SIMPLEMENT LIÉES 51 ListeVide(Elem * &L) L := NIL ; Boolée EstVide(Elem * L) si L = NIL alors retourer vrai ; sio retourer faux ; Elem * PremierElem(Elem * L) retourer L ; Elem * DerierElem(Elem * L) Elem * p := L ; si EstVide(L) alors retourer NIL ; sio tat que p.ext NIL faire p := p.ext ; retourer p ; IsèreTête(Elem * &L, Etier i) Elem * p := ew Elem ; p.ifo := i ; p.ext := L ; L := p ; IsèreFi(Elem * &L, Etier i) si EstVide(L) alors IsèreTête(L, i); sio Elem * p := DerierElem(L) ; p.ext := ew Elem ; p := p.ext ; p.ext := NIL ; p.ifo := i ; Algorithme 12 : Algorithmes de maipulatio de listes simplemet liées (1).

52 52 CHAPITRE 4. LES LISTES Suppresio du premier élémet La foctio SuppressioPremier doit supprimer le premier élémet de la liste L, s il existe. Pour supprimer le premier élémet d ue liste, il y a lieu de l effacer physiquemet de la mémoire, mais égalemet d ajuster le poiteur tête. E effet, l élémet qui était e secode positio avat la suppressio passe maiteat e première positio. Remarquos que cette suppressio e peut s effectuer qu à la coditio que le premier élémet existe, c est-à-dire que la liste e soit pas vide. Il faut doc tester cela, et afficher u message d erreur si cette précoditio est pas remplie. La suppressio e tête est e O(1). Suppressio du k e élémet d ue liste La foctio SuppressioKIeme reçoit ue liste L et u etier k. Elle doit supprimer le k e élémet de L, s il existe. Comme ous l avos vu sur la Fig. 4.2, le seul élémet de la liste à être modifié lors d ue suppressio est celui qui précède l élémet à supprimer. Quad o supprime le k e élémet, il faut doc obteir u poiteur sur le k 1 e élémet (voir ci-dessus), et modifier le champ ext de cet élémet (outre la suppressio physique du k e élémet). Ceci est aturellemet possible que pour k > 1. Quad k = 1, o tete e fait de supprimer la premier élémet de la liste, ce qui demade de modifier le poiteur tête, comme vu au paragraphe précédet. Remarquos à ouveau qu il se pourrait que le k e élémet existe pas. Das ce cas, la recherche retourera ue erreur, matérialisée sous la forme d u poiteur ul, et la foctio de suppressio a alors pas d effet. La complexité est e O(k), car la complexité de la recherche est ici domiate. Recherche d ue iformatio La foctio Recherche reçoit ue liste L et ue iformatio k, et doit revoyer u poiteur vers le premier élémet de la liste L dot l iformatio est k (ou NIL si u tel élémet existe pas). Cette foctio est proche de la recherche du k e élémet. La différece pricipale tiet das le critère d arrêt de la boucle : o s arrêtera dès que l iformatio est trouvée das l élémet courat. Si l iformatio est pas présete das la liste, la boucle atteidra le derier élémet, et reverra u poiteur ul. La complexité (toujours au pire cas) est e O(), où est le ombre d élémets de la liste. Remarquos que pour que ce programme soit correct, il importe que le test d ue cojoctio se fasse clause par clause, et s arrête dès qu ue clause est fausse. E effet, si l élémet k est pas préset das la liste, la boucle ira par atteidre le derier élémet, et o aura à l itératio suivate p = NIL. Si le test de la boucle tat que est complètemet évalué, o accèdera au champ ifo d u poiteur ul, ce qui causera immaquablemet u erreur. Par cotre, si o évite d évaluer p.ifo k, puisque p = NIL, il y aura pas d erreur. E regardat la coditio de la boucle, o e déduit que, e sortie de boucle, soit p = NIL, auquel cas k est pas préset das la liste ; soit p.ifo = k. Suppressio d ue iformatio La foctio SuppressioIfo reçoit ue liste L et ue iformatio k. Elle doit supprimer das L la première occurrece d u élémet coteat k comme iformatio

53 4.2. LES LISTES SIMPLEMENT LIÉES 53 (o peut aisémet la modifier pour supprimer toutes les occurreces). Cette foctio combie les difficultés recotrées lors de la recherche d ue iformatio et de la suppressio. E effet, il e s agit pas seulemet de trouver l élémet coteat l iformatio k demadée ; il faut égalemet obteir u poiteur sur l élémet qui le précède, et ceci a de pouvoir effectuer la suppressio. Pour ce faire, la stratégie adoptée cosiste à parcourir la liste avec deux poiteurs p et q. O s arragera, durat le parcours, pour que le poiteur q poite toujours sur l élémet qui précède p das la liste. Aisi, si p poite vers u élémet coteat l iformatio k (qu il faut doc supprimer), q poite vers l élémet dot o doit modifier le champ ext. À la sortie de la boucle pricipale, il y a deux possibilités : 1. p = NIL. Das ce cas, o a parcouru toute la boucle sas trouver l iformatio à effacer. O peut décider d afficher ue erreur, ou de e rie faire. 2. p.ifo = k. Le poiteur p poite doc vers u élémet à supprimer. O doit ecore evisager deux cas de figure : (a) Soit p = L, c est-à-dire que p poite vers le premier élémet. Das ce cas, il y a lieu de faire ue suppressio, e tête, et le poiteur q e cotiet pas d iformatio utile. (b) Soit p L, c est-à-dire que p est «au milieu» de la liste. À ce momet, q poite bie vers l élémet qui le précède et o peut doc procéder à la suppressio de faço habituelle. La compexité de cette foctio est e O() au pire cas Listes triées Das certais cas, il peut être plus commode de coserver la liste triée. Autremet dit, e parcourat la liste de la tête au derier élémet, o trouvera les iformatios das u odre bie détermié (croissat ou décroissat pour les etiers, par exemple). Das ce cas, il coviet d adapter certaies opératios. Das la suite de cette sectio, ous predros la covetio que les listes maipulées sot des listes triées par ordre croissat d etiers. Isertio triée Le but de cette opératio est d isérer ue iformatio k das ue liste L, qui est déjà triée, tout e maiteat le caractère trié de cette liste. Pour ce faire, il coviet de repérer le premier élémet de L qui cotiee ue iformatio k. Il faudra alors isérer la ouvelle iformatio avat cet élémet. Comme d habitude, l isertio e tête doit être traitée avec soi. Celle-ci aura lieu si et seulemet si soit l iformatio stockée das la tête est k, soit la liste est vide. Das le cas cotraire, il faudra parcourir la liste. Nous allos à ouveau utiliser la stratégie développée pour la foctio SuppressioIfo, à savoir l utilisatio de deux poiteurs p et q, où q poite toujours vers l élémet qui précède p. O s arragera pour arrêter p sur le premier élémet dot l iformatio est k (s il existe). À la de la boucle pricipale, ous auros deux possibilités : 1. p = NIL. Das ce cas, tous les élémetsde la liste sot < k, et il coviet doc d isérer le ouvel élémet à la de la liste. Cela reviet à isérer après q, qui poite à ce momet vers le derier élémet (rappelos que la liste est pas vide, et qu o isère pas e tête).

54 54 CHAPITRE 4. LES LISTES Elem * KIemeElemet(Elem * L, Etier k) Elem * p := L ; Etier i := 1 ; tat que p NIL et i < k faire i := i+1 ; p := p.ext ; retourer p ; IsèreKPos(Elem * &L, Etier k, Etier i) Elem * p,q ; si k = 1 alors IsèreTête(L, i) ; sio p :=KIemeElemet(L,k 1) ; si p NIL alors q := ew Elem ; q.ifo := i ; q.ext := p.ext ; p.ext := q ; sio Afficher «Erreur : il y a pas assez d élémets» ; SuppressioPremier(Elem * &L) si EstVide(L) alors Afficher «Erreur, la liste est vide» ; sio Elem * p := L ; L := L.ext ; delete p ; SuppressioKIeme(Elem * &L, Etier k) Elem * p, q ; si k = 1 alors SuppressioPremier(L) ; sio p :=KIemeElemet(L,k 1) ; si p NIL alors q := p.ext ; p.ext := q.ext ; delete q ; Algorithme 13 : Algorithmes de maipulatio de listes simplemet liées (2).

55 4.3. LES LISTES CIRCULAIRES AVEC ÉLÉMENT PRÉ-TÊTE 55 Elem * Recherche(Elem * L, Etier k) Elem * p := L ; tat que p NIL et p.ifo k faire p := p.ext ; retourer p ; SuppressioIfo(Elem * & L, Etier k) Elem * q, p := L ; tat que p NIL et p.ifo k faire q := p ; p := p.ext ; si p NIL alors si p L alors SuppressioPremier(L) ; sio q.ext := p.ext ; delete p ; sio Afficher «L élémet a pas été trouvé» ; Algorithme 14 : Algorithmes de maipulatio de listes simplemet liées (3). 2. p.ifo k. Das ce cas, o peut sas risque d erreur isérer après q, puisque la liste est pas vide et qu o e fait pas d isertio e tête. Das les deux cas, o peut doc isérer après q, sas risque d erreur. Recherche d u valeur La recherche d ue valeur k das ue liste triée est simplifiée : e effet, dès qu o atteit ue valeur > k, o sait qu o e doit pas explorer le reste de la liste, car toutes les valeurs suivates sot elles aussi > k. Néamois, la foctio reste e O() au pire cas (où est le ombre d élémets das la liste). Das les sectios suivates, ous allos préseter différetes extesios des listes simplemet liées. Ces extesios permettet de pallier certais défauts ihérets aux listes simples. 4.3 Les listes circulaires avec élémet pré-tête Parmi les défauts des listes que ous avos présetées jusqu à préset, o trouve pricipalemet : Les difficultés liées à la maipulatio du poiteur tête : isertio et suppressio e tête. Les difficultés liées au cas particulier de la liste vide. Le fait qu o soit obligé, quad o parcourt la liste à l aide d u poiteur p, de tester cotiuellemet si p est ul, alors qu u seul élémet de la liste a so champ ext à NIL.

56 56 CHAPITRE 4. LES LISTES IsertioTriée(Elem * & L, Etier k) si EstVide(L) ou L.ifo k alors IsèreTête(L, k) ; sio Elem * q := L, p := L.ext, r ; tat que p NIL et p.ifo < k faire q := p ; p := p.ext ; r := ew Elem ; r.ext := p ; r.ifo := k ; q.ext := r ; Elem * Recherche(Elem * L, Etier k) Elem * p := L ; tat que p NIL et p.ifo < k faire p := p.ext ; si p NIL et p.ifo k alors p := NIL ; retourer p ; Algorithme 15 : Algorithmes de maipulatio de listes simplemet liées triées Différeces par rapport aux listes «simples» Tous ces problèmes peuvet être résolus e utilisat ue structure u peu plus complexe : les listes circulaires avec élémet pré-tête. Ue telle liste se différecie d ue liste «simple» par deux caractéristiques : 1. Ue liste circulaire avec élémet pré-tête cotiet toujours au mois u élémet, appelé élémet pré-tête ou élémet bido. Cet élémet est toujours le premier élémet de la liste et e cotiet pas d iformatio sigificative. Cela sigifie que l iformatio qui y est stockée e doit pas être cosidérée comme faisat partie de ce qui est stocké das la liste. 2. Comme so om l idique, ue liste circulaire avec élémet pré-tête est circulaire, c est-à-dire que le champ ext du derier élémet cotiet la même valeur que L, à savoir l adresse du premier élémet (l élémet bido, doc). U exemple de liste circulaire avec élémet pré-tête est représeté à la Fig L iformatio stockée das cette liste est 1, 2, 4, 7 (l iformatio coteue das l élémet bido représetée par? est igorée). Das ue telle liste, il coviet doc de distiguer le premier élémet (physique) de la liste, qui est l élémet bido, et le premier élémet sigificatif, qui est celui qui suit l élémet bido (s il y e a u). E quoi ces deux différeces resolvet-elles os problèmes? Passos-les e revue : Il y a plus vraimet d isertio et de suppressio e tête, puisque le premier élémet sigificatif d ue liste circulaire avec élémet pré-tête est e fait le secod de la liste (celui qui suit l élémet bido). La seule modificatio du poi-

57 ?? L L LES LISTES CIRCULAIRES AVEC ÉLÉMENT PRÉ-TÊTE FIG. 4.5 U exemple de liste circulaire avec élémet pré-tête FIG. 4.6 U exemple d isertio e tête das ue liste circulaire avec élémet prétête. teur L aura doc lieu au momet de la créatio de la liste. La Fig. 4.6 doe u exemple d isertio tête. Ue liste circulaire avec élémet pré-tête, même vide, cotiet toujours au mois u élémet (l élémet bido). O aura doc jamais de poiteur L égal à NIL. La Fig. 4.7 motre ue liste circulaire vide. La recherche d ue valeur k das la liste sera égalemet simplifiée. E effet, comme l iformatio coteue das l élémet bido est pas sigificative, rie e ous empêche de la modifier. Aisi, si o recherche l iformatio k das la liste, o peut placer cette iformatio das l élémet bido. O commece la recherche de k sur le premier élémet sigificatif. Comme la liste est circulaire, o est certai de trouver l élémet k : soit parmi les élémets sigificatifs, soit das l élémet bido, qu o recotrera immaquablemet comme successeur du derier élémet. Ces deux cas peuvet aisémet être discrimiés : tout élémet sigificatif a ue adresse L, et l élémet bido est poité par L. Le seul test à faire e parcourat ue telle liste à l aide du poiteur p est doc p.ifo k. La Fig. 4.8 illustre cela. De maière géérale, ces listes ot l avatage de e pas utiliser de poiteurs NIL, ce qui limite les risques d erreur.

58 58 CHAPITRE 4. LES LISTES FIG. 4.7 Ue liste circulare avec élémet pré-tête vide Algorithmes Comme das le cas des listes simplemet liées, ous passos e revue quelques algorithmes classiques. Ceux-ci sot présetés aux Algorithmes 16 et 17. Costructio d ue liste vide La foctio ListeVide iitialise la liste. Il faut créer l élémet pré-tête, est s arrager pour que la liste soit circulaire. Il s agit d ue foctio qui s exécute e temps costat. Test de la liste vide La foctio EstVide est ue foctio booléee qui reçoit ue liste e paramètre, et qui revoie vrai si et seulemet la liste est vide. C est le cas si et seulemet si la l élémet bido a so champ ext qui poite vers lui-même. Cette foctio est e O(1). Premier élémet de la liste La foctio PremierElem reçoit ue liste et revoie u poiteur vers le premier élémet de la liste, ou NIL si la liste est vide. Il faut predre garde à retourer le premier élémet sigificatif (poité par L.ext, s il existe (c est-à-dire si la liste est pas vide). Cette foctio e réalise que des tests et des traitemets e temps costat. Elle est doc e O(1). Derier élémet de la liste La foctio DerierElem reçoit ue liste et revoie u poiteur vers le derier élémet de la liste, ou NIL si la liste est vide. Das ce cas aussi, il est écessaire de parcourir la liste jusqu à atteidre le derier élémet. Cette fois, ce derier élémet

59 k k k L L L p p p 4.3. LES LISTES CIRCULAIRES AVEC ÉLÉMENT PRÉ-TÊTE FIG. 4.8 La recherche de l iformatio k das ue liste circulaire avec élémet prétête. Au pire cas (quad k est pas préset das la liste), le poiteur fait le tour de la liste et reviet à l élémet pré-tête, qui cotiet k.

60 60 CHAPITRE 4. LES LISTES est pas celui dot le champ ext est NIL (puisqu il y e a pas), mais celui dot le champ ext est L. Comme il est écessaire de parcourir toute la liste, cette foctio est e O(), où est le ombre d élémets de la liste. Isertio à la k e positio Cette foctio reçoit ue liste L, u etier k et u etier i. Elle isère l etier i das la liste, à la k e positio. Cette foctio profite grademet de l élémet pré-tête, ce qui évite de traiter l isertio e tête comme u cas particulier. Remarquos que si la liste e cotiet pas assez d élémets (mois de k 1), l isertio est pas possible. O parcourt la liste à l aide du poiteur p, e commeçat sur le premier élémet sigificatif. À chaque ouvel élémet recotré, o icrémete u compteur. La boucle s arrête soit parce que le compteur vaut k 1, soit parce que p poite vers l élémet bido. Si le compteur vaut k 1, p poite vers le k 1 e élémet de la liste, et il suffit d isérer après p. Sio, il est pas possible d isérer car la liste e cotiet pas assez d élémets. Remarquos que cette foctio est égalemet correcte das le cas de l isertio e tête. E effet, das ce cas k = 0, et o e retre doc pas das la boucle. p garde doc sa valeur iitiale, à savoir L. O réalise doc l isertio après l élémet bido, ce qui est bie ue isertio e tête. Pour autat, celle-ci a pas demadé de traitemet particulier, comme c était le cas das les listes simples. Comme cette foctio doit parcourir la liste a d atteidre le k e élémet, elle est e O(k). Recherche d ue valeur La foctio Recherche reçoit u poiteur vers la tête d ue liste, et ue valeur k. Elle revoie u poiteur vers le premier élémet qui cotiet la valeur k, ou NIL si aucu élémet e cotiet cette valeur. Cette foctio exploite le procédé décrit ci-dessus, qui cosiste à stocker la valeur k recherchée das l élémet pré-tête. Ceci permet de dimiuer le ombre de tests à effectuer das la boucle tat que qui parcourt la liste. Le seul test écessaire est p.ifo k. À la sortie de la boucle, o a doc la garatie que p poite vers ue élémet dot le champ ifo cotiet k. Il suffit de tester si p est égal à L, a de détermier si l élémet trouvé est u élémet sigificatif de la liste, ou bie l élémet pré-tête, auquel cas o est sûr que la liste e cotiet pas d élémet dot l iformatio est k. Cette foctio est e O(), où est le ombre d élémets das la liste. Remarquos que, si la suppressio du test p L das la boucle e chage pas la complexité (e terme de O) de la foctio (au pire cas, il faut malgré tout appliquer u traitemet qui reste costat à chaque élémet de la liste), le temps écessaire pour traiter chaque élémet est tout de même dimiué. La techique développée das le cadre de la recherche peut être éxploitée das d autres cas de figure. Par exemple, si o maipule ue liste circulaire avec élémet pré-tête triée par ordre croissat, il peut être utile de mettrela valeur + das l élémet pré-tête 3. Aisi, la boucle suivate sera suffisate pour trouver l edroit où isérer ue valeur k tout e gardat la liste triée (quelque soit la valeur k) : 3 E pratique, o utilisera ue valeur limite, qui déped du type de doées maipulé, et du lagage cosidéré. Par exemple, la costate ÁÆÌ Å remplit cet office e C ou C++.

61 4.3. LES LISTES CIRCULAIRES AVEC ÉLÉMENT PRÉ-TÊTE 61 Elem * ListeVide() Elem * p := ewelem ; p.ext := p ; retourer p ; Boolée EstVide(Elem * L) si L.ext = L alors retourer vrai ; sio retourer faux ; Elem * PremierElem(Elem * L) si EstVide(L) alors retourer NIL ; sio retourer L.ext ; Elem * DerierElem(Elem * L) Elem * p ; si EstVide(L) alors p := NIL ; sio p := L.ext ; tat que p.ext L faire p := p.ext ; retourer p ; Algorithme 16 : Algorithmes de maipulatio de listes circulaires avec élémet prétête (1).

62 62 CHAPITRE 4. LES LISTES IsèreKPos(Elem * L, Etier i, Etier k) Elem * save, p ; Etier cpt = 0 ; si k = 1 alors p := L ; sio p := L.ext ; tat que p L et cpt < k 1 faire cpt := cpt + 1 ; p := p.ext ; si cpt = k 1 alors save := p.ext ; p.ext := ew Elem ; p := p.ext ; p.ifo := i ; p.ext := save ; sio Afficher «Erreur : il y a pas assez d élémets das la liste» ; Elem * Recherche(Elem * L, Etier k) Elem * p := L.ext ; L.ifo := k ; tat que p.ifo k faire p := p.ext ; si p = L alors p := NIL ; retourer p ; Algorithme 17 : Algorithmes de maipulatio de listes circulaires avec élémet prétête (2).

63 L 4.4. LES LISTES DOUBLEMENT LIÉES 63 NI L NI L FIG. 4.9 U exemple de liste doublemet liée. tat que p.ifo < k faire p := p.ext ; De par la présece du + das l élémet bido, o a la certitude que ce test sera vrai au bout d u temps i, soit parce que les élémet sigificatifs de la liste cotieet effectivemet ue valeur k (auquel cas il faut isérer avat p), soit parce qu o a atteit l élémet bido (auquel cas il faut isérer e de liste, c est-à-dire avat l élémet bido, poité par p). Das tous les cas, o isère doc avat p. 4.4 Les listes doublemet liées Ue autre extesio possible des listes simplemet liées cosiste à eregistrer das chaque élémet de la liste l adresse de l élémet qui le précède, e plus de l élémet suivat. U élémet de la liste serot doc maiteat du type suivat : struct Elem Etier ifo ; Elem * ext ; Elem * prec ; Comme das le cas des listes simplemet liées, le derier élémet de la liste aura so champ ext à NIL. De faço symétrique, le premier élémet de la liste aura so champ prec à NIL égalemet, puisqu aucu élémet e le précède. La Fig. 4.9 présete ue illustratio de liste doublemet liée. Naturellemet, ce poiteur supplémetaire alourdit la structure. Néamois, cette adjoctio offre plus de flexibilité das les modalités de parcours de la liste, qui peut maiteat être traversée «e arrière». Illustros cela par l algorithme suivat. Nous désiros écrire ue foctio qui reçoit ue liste L, aisi que deux etiers i et j. Cette foctio doit isérer, das la liste L, u ouvel élémet dot l iformatio est i, et ce, avat la première occurrece d u élémet portat l iformatio j. Cette isertio est illustrée à la Fig La foctio IsèreAvatJ est doée à l Algorithme 18. Elle cosiste e u parcours de la liste à l aide du poiteur p, à partir de la tête. Ce parcours s arrête soit parce que p.ifo = j, auquel cas il faut isérer avat p ; soit parce que p = NIL, auquel cas la liste e cotiet pas d élémet dot l iformatio est j. Das le cas où l isertio doit être effectuée, celle-ci est redue plus simple par le poiteur prec, qui permet d accéder directemet à l élémet précédet celui poité par p. Sas ce poiteur, il eût été écessaire de maiteir u secod poiteur q qui poite toujours sur l élémet précédet p, ce qui alourdit le parcours.

64 L 3 64 CHAPITRE 4. LES LISTES NI L NI L FIG U exemple d isertio das ue liste doublemet liée. O isère u élémet portat la valeur 3 avat l élémet portat la valeur 4. IsèreAvatJ(Elem * L, Etier i, Etier j) Elem * p := L, q ; tat que p NIL p.ifo j faire p := p.ext ; si p = NIL alors Afficher «Erreur, élémet o trouvé» ; sio q := ewelem ; q.ifo := i ; q.ext := p ; q.prec := p.prec ; p.prec := q ; q.prec.ext := q ; Algorithme 18 : L isertio d u élémet dot l iformatio est i avat u élémet dot l iformatio est j, das ue liste doublemet liée.

65 4.5. IMPLÉMENTATION DES LISTES DANS LES VECTEURS 65 Par cotre, l isertio à propremet parler est plus complexe que das le cas d ue liste simplemet liée, puisqu il y a maiteat quatre (et o plus deux) poiteurs à modifier. Remarquos que les deux extesios des listes que ous veos de préseter peuvet être combiées. Il est e effet tout à fait possible d evisager des listes doublemet liées circulaires avec élémet pré-tête. Das ce cas, le premier élémet de la liste e sera pas sigificatif, et aura so champ prec qui poite vers le derier élémet de la liste. Ce derier aura so champ ext qui poite vers l élémet pré-tête. 4.5 Implémetatio des listes das les vecteurs Nous veos d étudier trois types de listes, et ous les avos toutes présetées e utilisat la otio de poiteur. E effet, c est la possiblité de pouvoir référecer ue case mémoire arbitraire comme élémet suivat (ou précédet, das le cas des listes doublemet liées) qui ous a permis de ous libérer de la rigidité des vecteurs (voir l itroductio de ce chapitre). Néamois, u poiteur exprime jamais qu u adresse e mémoire, c est-à-dire u décallage par rapport au de la mémoire. Il est possible de trasposer cette idée das le cotexte des vecteurs : si o associe à chaque case du vecteur ue valeur etière qui idique l idice (c est-à-dire le décallage par rapport au du vecteur) de la case qui la suit logiquemet (et o plus physiquemet), o peut implémeter le cocept de liste das u vecteur. E pratique, ous procéderos comme suit pour implémeter ue liste simplemet liée das u vecteur 4. O utilisera deux vecteurs I et N, et ue variable etière T qui représetera la tête de la liste. U élémet de la liste sera réparti sur ue case d idice j du vecteur I (qui cotiedra l iformatio de l élémet), et sur ue case d idice j égalemet, du vecteur N (qui cotiedra l idice de l élémet suivat). Le premier élémet à cosidérer sera d idice L. Aisi, le premier élémet cotiedra l iformatio I[L], le secod I[N[L]], le troisième I[N[N[L]]], etc. La de la liste sera idiquée e stockat la valeur covetioelle 1 das N. Aisi l élémet d idice j tel que N[ j] = 1 sera le derier de la liste. Cette valeur setielle remplace le NIL des poiteurs. E, sigalos que, das le cas où l o voudra isèrer u ouvel élémet das ue telle liste, il sera écessaire de savoir das quelle case des vecteur I et N o peut le stocker. Das le cas des listes avec poiteur, cela était effectué de faço automatique par l opérateur ew. Das le cas préset, o passera à la foctio, e plus de L, N et I, u etier pos, idiquat la positio de la première case libre das le vecteur (e faisat l hypothèse que toutes celles qui suivet le sot égalemet). La Fig 4.11 présete u exemple de liste implémetée das u vecteur, avec so équivalet utilisat des poiteurs. O voit que tous les algorithmes écrits sur les listes simples sot aisémet trasposés das le préset cotexte. U poiteur p est remplacé par ue variable etière i idiquat u idice. Les expressios du type p.ifo ou p.ext devieet respectivemet I[i] et N[i], etc. À titre d exemple, cosidéros les algorithmes d isertio e tête, de recherche du k e élémet et d isertio e k e positio. Ils sot doés à l Algorithme 19. La comparaiso avec leurs équivalets exploitat les poiteurs (voir Algorithme 12 listes. 4 Tout ce que ous allos préseter ici pourra égalemet être appliqué si o cosidère d autres types de

66 L???? CHAPITRE 4. LES LISTES N I L FIG U exemple de liste implémetée das u vecteur, et so équivalet utilisat des poiteurs. et Algorithme 13) permet de voir qu il s agit véritablemet d ue traductio : rie e chage sur le pla algorithmique Applicatio L utilité de ces listes est peut être pas évidete au premier abord. Ue première justificatio de ces techiques est que certais lagages (comme COBOL) admettet pas l utilisatio de poiteurs. Ue autre utilité de ces listes cosiste à optimiser certais algorithmes travaillat sur des vecteurs, e le traformat temporairemet e liste, par les moyes décrits ci-dessus. Illustros cela à l aide d u algorithme recevat deux vecteurs d etiers V et W (de tailles et m), qui sot triés par ordre croissat, et qui doit isérer das V tous les élémets de W, tout e gardat le caractère trié de V. O supposera que V est suffisamet grad que pour réaliser ce traitemet. Pour ce faire, o supposera que seules les l premières cases de V cotieet de l iformatio sigificative. Les cases l+1 à sot o-iitialisées. U tel algorithme demadera aturellemet d effectuer plusieurs déplacemets d élémets das le vecteur V pour «faire de la place» aux élémets de W qui doivet y être isérés. Commeços par décrire ue solutio «stadard» à ce problème (voir Algorithme 20). Nous doos d abord ue foctio DécallageVecteur, qui reçoit u vecteur V (de taille ) et u etier i, et qui décalle toutes les cases d idice i d ue positio vers la droite (la derière case est doc perdue). Cette foctio parcourt le vecteur V depuis sa peultième case jusqu à sa case d idice i, à l aide d ue variable j ; et déplace chaque case de V à l aide de l istructio V[ j + 1] := V[ j]. Nous pouvos maiteat écrire la foctio FusioVecteur. Celle-ci reçoit les deux vecteurs V et W, aisi que le ombre l de cases de V qui cotieet de l ifor-

67 4.5. IMPLÉMENTATION DES LISTES DANS LES VECTEURS 67 IsèreTête(Etier &L, Etier &pos, Etier I[], Etier N[], Etier i) Etier j := pos ; pos := pos+1 ; I[ j] := i ; N[ j] := L ; L := j ; Etier KIemeElemet(Etier L, Etier I[], Etier N[], Etier k) Etier j := L ; Etier i := 1 ; tat que j 1 et i < k faire i := i+1 ; j := N[ j] ; retourer j ; IsèreKPos(Etier &L, Etier &pos, Etier I[], Etier N[], Etier k, Etier i) Etier i,l ; si k = 1 alors IsèreTête(L, pos, I, N, i) ; sio j :=KIemeElemet(L,k) ; si j 1 alors l := pos ; pos := pos+1 ; I[l] := k ; N[l] := N[ j] ; N[ j] := l ; sio Afficher «Erreur : il y a pas assez d élémets» ; Algorithme 19 : Trois algorithmes maipulat des listes simples implémetées das des vecteurs.

68 68 CHAPITRE 4. LES LISTES matio. La foctio maitiet e permaece deux idices i et j. L idice j parcourt le vecteur W, et idique quelle case de W doit être isérée das V. L idice i parcourt le vecteur V, et permet de répérer la positio à laquelle W[ j] doit être iséré. Chaque itératio de la boucle pricipale met u élémet W[ j] à sa place das V. Pour ce faire, la boucle itérieure fait avacer l idice i tat que les valeurs V[i] sot strictemet iférieures à W[ j]. La boucle s arrête égalemet si i = l+ j 1. E effet, V cotiet à tout momet l + j 1 valeurs sigificatives, à savoir les l valeurs présetes itialemet, plus les j 1 valeurs de W qui ot déjà été placées. Quad la boucle itérieure s arrête, o sait que : 1. soit V[i] W[ j]. La valeur W[j] doit doc être recopiée e V[i], après que les cases V[i], V[i+1],..., V[] ot été déplacées vers la droite. 2. soit o a passé e revue toutes les valeurs sigificatives de V, et o doit doc isérer W[ j] après celles-ci, soit e V[i]. Le décallage des cases V[i], V[i+1],..., V[] est pas écessaire mais est pas icorrect o plus (o peut l éviter à l aide d u test). DécallageVecteur(Etier V[], Etier i) Etier j := 1 ; tat que j i faire V[ j + 1] := V[ j] ; j := j 1 ; FusioVecteur(Etier V[], Etier l, Etier W[m]) Etieri := 1, j := 1 ; tat que j m faire tat que i l+ j 1 et V[i] > W[ j] faire i := i = 1; DécallageVecteur(V, i) ; V[i] := W[ j] ; i := i+1 ; j := j + 1 ; Algorithme 20 : Ue solutio au problème de fusio des vecteurs triés, utilisat u décallage das le vecteur. Comme pour chaque isertio des m élémets de W, il est écessaire d effectuer das V u décallage e O(l), la complexité de cette solutio est O(m l). Comme o le voit, cette solutio fait régulièremet appel à DécallageVecteur, qui est assez lourde. Das ue liste, ce décallage e serait pas écessaire puisque l isertio peut être effectuée e temps costat. O peut obteir u algorithme plus efficace (voir Algorithme 21) e ajoutat à V u secod vecteur N et ue variable L qui le trasformet e liste. Le vecteur N sera iitialisé de telle faço que, pour tout 1 j < l, N[ j] = j + 1 (iitialemet, chaque case j a pour suivate la case j + 1), et N[l] = 1 (la case l est la derière à cosidérer). L sera itialisée à 1 (la première case du vecteur est égalemet la première de la liste). O viedra esuite isérer chque case du vecteur W das la liste costituée de V, N et L. Ces isertios e demaderot pas d opératio

69 4.6. VUE RÉCURSIVE 69 de déplacemet, puisque seuls les «poiteurs» (c est-à-dire les valeurs de N) serot modifiés. À la de l opératio, il suffira de recopier les m + l élémets de la liste formée par V, N et L das u vecteur temporaire, puis de remettre le coteu de ce vecteur das V. E pratique, l isertio est réalisée à l aide de deux idices i et k. Ue boucle tat que passe tous les élémets de la liste coteue das V qui sot plus petit que W[ j]. L idice k poite toujours vers l élémet qui précède logiquemet i. Dès que la boucle tat que (i 1 et I[i] < W[ j]) s arrête, il faut réalier l isertio etre l élémet k et l élémet i. Ceci peut doer lieu à ue isertio e tête das le cas où W[ j] est plus petit que tous les élémets de V. Das ce cas, o etre pas das la boucle tat que, ce qu o peut aisémet détecter e iitialisat k à 1 avat la boucle et e vérifiat la valeur de k après la boucle : si k = 1, o isère e tête, sio, o isère après k. Cette solutio peut paraître plus lourde à la lecture, mais elle est plus efficace que la précédete (du mois e temps, état doé que les vecteurs supplémetaires occupet de la place e mémoire). E effet, chaque isertio s effectue maiteat e temps costat. Comme il y a lieu d isérer m élémets, et comme o effectue u seul parcours de V, la complexité des isertios est e O(m + l). C est égalemet la complexité des deux opératios de recopiage qui sot effectuées séquetiellemet. Au total, la complexité de cette foctio est doc O(m + l). 4.6 Vue récursive Tous les algorithmes étudiés das ce chapitre sot des algorithmes de type itératif. Néamois, o peut trouver ue versio récursive pour la plupart d etre eux. Pour ce faire, il faut d abord trouver ue déitio récursive de la otio de liste. La voici : Déitio 2 Ue liste est : 1. Soit la liste vide NIL ; 2. Soit u élémet (la tête) suivi d ue liste. Aisi, ue liste coteat u seul élémet est vue comme u élémet suivi de la liste vide. Ue liste de k élémets est u élémet suivi d ue liste de k 1 élémets, etc Algorithmes Il est maiteat aisé de doer des algorithmes récursifs sur les listes. À titre d exemple, ous cosidéros la recherche d ue valeur i et l isertio e k e positio. Ces algorithmes sot présetés à l Algorithme 22. La recherche d ue valeur i La foctio Recherche reçoit ue liste L et ue valeur i, et revoie u poiteur vers la première occurrece d u élémet coteat i, ou NIL s il existe pas de tel élémet. Das le cas où la liste L est la liste vide, la foctio peut directemet revoyer NIL. Sio, la liste est composée d ue tête, et d ue liste dot la tête est L.ext. Das ce cas, deux possibilités se présetet. Soit la tête cotiet i, auquel cas la foctio revoie L. Soit la tête e cotiet pas i, et la foctio effectue u appel récursif pour obteir u poiteur vers u élémet coteat i das la liste dot la tête est L.ext.

70 70 CHAPITRE 4. LES LISTES FusioVecteurListe(Etier V[], Etier l, Etier W[m]) Etier tmp[], N[], L, i, j, k ; i := 1 ; tat que i l 1 faire N[i] := i+1 ; N[l] := 1 ; i := 1 ; j := 1 ; k := 1 ; tat que j m faire V[l+ j] := W[j] ; tat que i 1 et V[i] < W[ j] faire k := i ; i := N[i] ; si k = 1 alors N[ j +l] := L ; L := j +l ; sio N[k] := j +l ; N[ j +l] := i ; j := j + 1 ; i := 1 ; j := 1 ; tat que i 1 faire tmp[i] := V[ j] ; i := i+1 ; j := N[ j] ; i := 1 ; tat que i l+m faire V[i] := tmp[i] ; i := i+1 ; Algorithme 21 : Ue solutio au problème de fusio des vecteurs triés, versio «listes».

71 4.6. VUE RÉCURSIVE 71 L isertio d u élémet à la k e positio La foctio IsèreKPos reçoit ue liste L, u etier k et u etier i, et isère u ouvel élémet d iformatio i à la k e positio das L (ou affiche u message d erreur si cela est pas possible). Das le cas où la liste est vide, l isertio se fait e tête, et est possible que si k = 1. Das le cas où la liste est pas vide, o a deux possibilités. Soit k = 1, et o effectue l isertio e tête. Soit k 1, et o effectue u appel récursif pour isérer l élémet das liste dot la tête est L.ext. Attetio, das ce cas, la positio d isertio chage : elle deviet k 1, puisque la liste cosidérée pour l appel récursif possède u élémet de mois e tête. Elem * Recherche(Elem * L, Etier i) si L = NIL ou L.ifo = i alors retourer L ; sio retourer Recherche(L.ext, i) ; IsèreKPos(Elem * &L, Etier k, Etier i) Elem * p ; si k = 1 alors p :=ew Elem ; p.ifo := i ; p.ext := L ; L := p ; sio si L NIL alors IsèreKPos(L.ext, k 1, i) ; sio Afficher «Erreur : isertio impossible.» Algorithme 22 : Deux algorithmes récursifs sur les listes.

72 72 CHAPITRE 4. LES LISTES

73 Chapitre 5 Les piles et les files Das ce chapitre, ous allos étudier deux ouvelles structures de doées très courammet utilisées : les files et les piles. Les oms de ces structures évoquet clairemet leur foctioemet respectif. Ue file (ou queue e aglais) cotiedra des iformatios ordoées de faço liéaire (comme das ue liste). Comme das ue file d attete das u commerce, il e sera possible d ajouter de l iformatio qu à la de la file, et de e prélever qu au. Ue pile (ou stack e aglais), au cotraire, se comportera comme ue pile d assiettes : o aura accès qu à l iformatio se trouvat au sommet de la pile, que ce soit lors de l ajout ou lors de la lecture. Les files et les piles ot éormémet d applicatios e iformatique. Elles sot présetes das de ombreux composats d u système d exploitatio. Elles sot égalemet écessaires pour déir de faço simple et élégate certais algorithmes, comme ous les verros à la de ce chapitre, et das le chapitre suivat. État doé que les iformatios stockées das ue file ou das ue pile le sot de faço liéaire, o aura souvet recours soit aux listes, soit aux tableaux pour implémeter ces structures. 5.1 Les piles Ue pile est u type de doées formé d ue séquece d élémets a 1,a 2,...,a. Les opératios autorisées sur la pile sot des maipulatios de l extrémité de la séquece, que l o appelle le sommet de la pile. E effet, o représete ue pile comme u empilemet d élémets, l élémet a 1 état das le fod de la pile, avec l élémet a 2 au-dessus de lui, etc, jusqu à avoir a au sommet. Cette représetatio ituitive est motrée à la Fig Les opératios autorisées sur la pile sot les suivates : PileVide Cette opératio crée ue ouvelle pile, vide. O représetera souvet la pile vide par ε (c est-à-dire la séquece vide). Push Cette opératio reçoit e paramètre ue pile (vide ou o) et u élémet. Elle ajoute l élémet au sommet de la pile. Plus précisémet, si la pile cotiet la séquece a 1,a 2,...,a, et que l élémet à ajouter est x, la pile résultate sera a 1,a 2,...,a,x. Si la pile reçue est vide, la pile résultate sera simplemet x. Pop Cette opératio est symétrique de Push. Elle reçoit ue pile, et supprime l élémet au sommet de la pile, s il existe. Plus formellemet, si la pile reçue est 73

74 74 CHAPITRE 5. LES PILES ET LES FILES FIG. 5.1 U exemple de pile coteat (de bas e haut) les valeurs 2, 3, 4 et 5. a 1,...,a, avec 2, la pile résultate est a 1,...,a 1. Si la pile reçue est a 1, la pile résultate est ε. O e peut pas faire de Pop sur ue pile vide. Top Cette opératio permet de cosulter l iformatio stockée das la pile. Suivat la politique de la pile, qui e doe accès qu à so sommet, o e peut cosulter que l iformatio stockée au sommet de la pile. Top reçoit doc ue pile a 1,...a, et revoie a. Top est pas déie quad la pile est vide. EstVide Cette opératio reçoit ue pile et dit si la pile est vide ou o. Elle revoie doc vrai si et seulemet si la pile reçue est ε. Exemple 16 Cosidéros ue pile iitialemet vide ε. Si ous effectuos le Push de trois valeurs 5, 7 et 9 (successivemet), ous obteos la pile 5,7,9 (le fod est bie e de séquece). L opératio EstVide retoure alors faux. E faisat u Pop, o obtiet la pile 5,7. L opératio Top revoie alors 7. Avec deux ouveaux Pop, o obtiet la pile vide ε. Il est plus possible de faire de Pop ou de Top. O voit doc que la politique d accès à la pile e permet de cosulter que l élémet le plus récemmet iséré das la pile, car c est celui qui est préset au sommet. Autremet dit, le premier élémet qu o pourra supprimer d ue pile est celui qui a été iséré e derier. Cette costatatio, qui résume bie les opératios propres à la pile, est exprimée e aglais par last i, first out, abrégé e LIFO Implémetatio das ue liste Comme ous l avos dit das l itroductio de ce chapitre, la structure d ue pile est la même que celle d ue liste. La différece tiet das les maipulatios qui sot autorisées (des opératios comme la suppressio du k e élémet, par exemple, e serot pas autorisées). O peut doc tout aturellemet implémeter ue pile das ue liste. Pour faciliter les opératios, il est plus commode de stocker le sommet de la pile e tête de liste, état

75 L 5.1. LES PILES N I L FIG. 5.2 La pile de la Fig. 5.1 implémetée das ue liste. doé que c est la seule partie de la pile que ous devros maipuler directemet. Les élémets sot doc stockés das la liste de haut e bas. La Fig. 5.2 illustre cela. Aisi, il est facile d implémeter les opératios sur la pile à l aide des opératios sur la liste : PileVide Créer ue pile vide reviet à créer ue liste vide, grâce à ListeVide. Push Le Push reviet à effectuer ue isertio e tête das la liste, ce qui peut se faire à l aide d IsèreTête. Pop Le Pop reviet à faire ue suppressio e tête, à l aide de SuppressioPremier. Top Le Top reviet à cosulter l iformatio stockée das le premier élémet, auquel o accède à l aide de la foctio PremierElem. EstVide La pile est vide si et seulemet si la liste est vide. O fait doc appel à EstVide. Remarquos que toutes ces foctios sot correctes idépedemmet du type de liste (simplemet ou doublemet liée, avec ou sas élémet pré-tête) choisi. Comme ue pile est ue liste, o déira le type Pile comme ue structure coteat simplemet u poiteur vers la tête de la liste. Aisi, o cache les détails d implémetatio, et les sigatures des foctios serot les mêmes si o choisit d implémeter la pile autremet (voir sectio suivate) : struct Pile Elem * som ; À titre d exemple, l Algorithme 23 doe le code de ces ciq primitives das le cas d ue pile d etiers Implémetatio das u vecteur Naturellemet, il est égalemet possible d implémeter ue pile das u vecteur. L idée cosiste à stocker les élémets de bas e haut, c est-à-dire e mettat l élémet au fod de la pile das la première case du vecteur, etc. Cette dispositio est aturelle car la pile e peut croître que par so sommet. Si celui-ci était stocké au du vecteur, o serait obligé de recourir à des tassemets et des déplacemets du vecteur à chaque Push ou Pop, pour garder le sommet das la première case et e pas perdre d iformatio. A de pouvoir réaliser les opératios sur le sommet, il est écessaire de reteir où celle-ci se situe das le vecteur. Cela peut se faire à l aide d ue variable etière, qui idique l idice de la case coteat le sommet. Das le cas où la pile est vide, o predra ue valeur covetioelle (0 par exemple).

76 76 CHAPITRE 5. LES PILES ET LES FILES PileVide(Pile & P) ListeVide(P.som) ; Push(Pile &P, Etier i) IsèreTête(P.som, i) ; Pop(Pile &P, Etier i) SuppressioPremier(P.som) ; Etier Top(Pile P) Elem * p :=PremierElem(P.som) ; retourer p.ifo ; Boolée EstVide(Pile P) retourer EstVide(P.som) ; Algorithme 23 : L implémetatio d ue pile d etiers das ue liste.

77 5.2. LES FILES 77 O implémetera doc la pile à l aide d u vecteur V et d ue variable etière som, telles que V[som] cotiet l iformatio au sommet de la pile. Das le cas préset, ue pile sera doc plutôt u eregistremet du type : struct Pile Etier V[] ; Etier som ; Les opératios sot alors faciles à implémeter : PileVide Cette opératio cosiste simplemet à iitialiser la variable som à 0 pour idiquer que le vecteur e cotiet pas d élémets de la pile. Push La ouvelle iformatio peut être stockée e V[som + 1], et som doit être icrémetée. Cette opératio suppose que le vecteur V est de taille suffisate pour accueillir le ouvel élémet. Pop Le Pop cosiste simplemet à décrémeter la variable som. Remarquos que cette décrémetatio est bie cohérete avec otre choix de mettre P.som à 0 quad la pile est vide. Top Il suffit de revoyer l iformatio stockée au sommet, c est-à-dire das V[som]. EstVide La pile est vide si et seulemet si la variable som vaut 0. Ces opératios sot détaillées à l Algorithme Les files Ue file est égalemet ue séquece a 1,a 2,...,a d élémets, mais les opératios applicables diffèret par rapport à la pile. Das ue file, l écriture et la lecture e se fot pas «au même edroit» : o peut ajouter ue iformatio e de file, mais o a le droit d écrire qu à la de la file. Plus formellemet, si la file cotiet la séquece a 1,a 2,...,a, o appellera a 1 le de la file, et a la de la file. L écriture d ue iformatio x se fait à la et doe lieu à la file a 1,a 2,...a,x. La lecture se fait au et doe lieu à la file a 2,...,a. Les opératios autorisées sur file sot les suivates : FileVide Cette opératio crée ue file vide (déotée par ε). Equeue Cette opératio reçoit ue file et u élémet x e paramètre, et ajoute x das la file. Si la file est costituée de la séquece a 1,a 2,...,a, o obtiet la file coteat la séquece a 1,a 2,...,a,x. Si la file est vide, o obtiet la file coteat la séquece x. Dequeue Cette opératio reçoit ue file et supprime l élémet e de file. Si la file reçue est a 1,...,a, avec 2, la file résultate est a 2,...,a. Si la file reçue est a 1, la file résultate est la file vide ε. Naturellemet, la suppressio est pas autorisée sur ue file vide. First Cette opératio reçoit ue file et revoie l élémet e de file. Cette opératio est pas autorisée sur ue file vide. Par cotre, si la file reçue est a 1,...,a, le résultat est a 1. EstVide Cette opératio reçoit ue file et revoie vrai si et seulemet si la file est vide. Exemple 17 Cosidéros la file vide ε. Effectuos trois Equeue successifs des valeurs 5, 7 et 9. O obtiet alors la file 5,7,9 (c est-à-dire la même séquece que das

78 78 CHAPITRE 5. LES PILES ET LES FILES PileVide(Pile & P) P.som := 0 ; Push(Pile & P, Etier i) P.som := P.som+ 1 ; P.V[P.som] := i ; Pop(Pile & P) P.som := P.som 1; Etier Top(Pile & P) retourer P.V[P.som] ; Boolée EstVide(Pile & P) si P.som = 0 alors retourer vrai ; sio retourer faux ; Algorithme 24 : L implémetatio d ue pile d etiers das u vecteur.

79 5.2. LES FILES 79 le cas de la pile). U Dequeue doe la file 7,9. Appliquées à cette file, l opératio First revoie 7, et l opératio EstVide revoie faux. E faisat deux Dequeue supplémetaires, o ré-obtiet la file vide, sur laquelle i Dequeue i First e peuvet être appliqués Implémetatio das ue liste Il est aisé d implémeter ue file das ue liste. O choisira de mettre le de la file e tête de liste, et la de la file e de liste. Le type File sera alors : struct File Elem * deb ; Cette covetio état fixée, il est facile de traduire les opératios sur ue file e terme d opératios sur ue liste : FileVide reviet à créer ue liste vide. Equeue reviet à ajouter u élémet e de liste. Dequeue reviet à effectuer ue suppressio e tête. First reviet à revoyer l iformatio stockée das l élémet de tête. EstVide reviet à tester si la liste est vide. L Algorithme 25 détaille ces opératios. FileVide(File & F) ListeVide(F.deb) ; Equeue(File & F, Etier i) IsèreFi(F.deb, i) ; Dequeue(File & F) SuppressioPremier(F.deb) ; Etier First(File F) Elem * p := PremierElem(F.deb) ; retourer p.ifo ; Boolée EstVide(File & F) retourer EstVideF.deb ; Algorithme 25 : L implémetatio d u file das ue liste, avec u seul poiteur.

80 80 CHAPITRE 5. LES PILES ET LES FILES Remarquos que toutes ces opératios s effectue e temps costat, sauf l opératio Equeue, qui demade de parcourir toute la liste pour isérer e, ce qui est e O(). Cette complexité peut être rameée à O(1) si o garde e permaece u poiteur vers le derier élémet de la liste (e plus du poiteur vers la tête). O cosidère alors u type File déi comme suit : struct File Elem * deb ; Elem * ; O peut alors adapter les algorithmes maipulat les files pour teir compte de cette ouvelle structure. Ceux-ci sot doés à l Algorithme 26. Remarquos que, comme ous utilisos ue structure quelque peu différete des listes chaîées simples, ous sommes obligés d écrire des algorithmes ad hoc, ce qui est quelque peu mois élégat que la solutio présetée à l Algorithme 25. Voici le détail de ces foctios : FileVide Il faut predre garde à mettre la valeur NIL tat das le poiteur de que das le poiteur de. Equeue L accès à la de la liste est maiteat simplifié grâce au poiteur de. Il faut d abord créer l élémet à ajouter, avec l iformatio i, et le champ ext à NIL (puisque cet élémet deviedra le derier de la liste). Esuite, o ajoute le ouvel élémet à la suite de celui poité par F., à coditio que ce derier poiteur e soit pas ul. Das le cas cotraire, la file est e fait vide, et il suffit de faire poiter à la fois F.deb et F. sur le ouvel élémet. Dequeue La suppressio e tête se fait de la même maière que das ue liste simple, e utilisat F.deb comme poiteur tête. Il faut predre garde à stocker NIL das F. si cette suppressio doe lieu à ue file vide (c est-à-dire si la file e coteait qu u seul élémet avat la suppressio). First Cette opératio reviet à revoyer l iformatio stockée das l élémet de tête. EstVide Cette opératio reviet à tester si la liste est vide, ce qui peut se vérifier e testat u des deux poiteurs Implémetatio das u vecteur Comme das le cas des piles, il est possible d implémeter ue file das u vecteur. La questio de l ordre de stockage se pose à ouveau. Néamois, cotrairemet au cas de la file, il y a pas d ordre meilleur qu u autre. E effet, tat le que la de la file peuvet évoluer, alors que das le cas de la pile, seul le sommet pouvait être modifié. O devra doc repérer das le vecteur V (qui cotiet les élémet de la file), deux positios deb et f i. O adoptera doc le type suivat : struct File Etier V[] ; Etier deb ; Etier ; O stockera les élémets de la file etre les cases deb et 1 (comprises), du à la de la file. Iitialemet, ous auros deb = = 1, ce qui produit bie ue file vide (il y a pas de cases etre les idices 1 et 0). O stockera les ouvelles

81 5.2. LES FILES 81 FileVide(File & F) F.deb := NIL ; F. := NIL ; Equeue(File & F, Etier i) Elem * p :=ew Elem ; p.ifo := i ; p.ext := NIL ; si FileVide(F) alors F.deb := p ; F. := p ; sio F..ext := p ; F. := p ; Dequeue(File & F) Elem * p := F.deb ; F.deb := F.deb.ext ; delete p ; si F.deb = NIL alors F. := NIL ; Etier First(File F) retourer F.deb.ifo ; Boolée EstVide(File & F) si F.deb = NIL alors retourer vrai ; sio retourer faux ; Algorithme 26 : L implémetatio d u file das ue liste, avec deux poiteurs.

82 82 CHAPITRE 5. LES PILES ET LES FILES valeurs das la case f i, que l o icrémetera alors. Symétriquemet, u Dequeue s obtiedra simplemet e icrémetat deb. Malheureusemet, cette simple politique de gestio du vecteur e saurait être satisfaisate. Observos l exemple de la Fig O y a représeté différetes étapes de maipulatio d u vecteur coteat ue file, et la file correspodate. Iitialemet, la file est vide. O effectue esuite 4 Equeue, ce qui fait croître la valeur de. Puis, o effectue deux Dequeue. Comme o le voit sur la figure, les cases 1 et 2 devieet alors iutilisables, car les élémets qui serot esuite ajoutés apparaîtrot à droite de la case d idice. Lorsque cet idice atteidra la derière case du vecteur, il e sera plus possible de faire de ouveaux Equeue. Aisi, chaque Dequeue dimiue la taille potetielle de la file. O peut palier ce problème e cosidérat que le vecteur est circulaire, tel qu illustré à la Fig Cela sigifie qu o cosidère qu il existe ue case «à droite» de la case d idice, qui est la case d idice 1. Aisi, quad o icrémete ou deb, et que la valeur d u des deux dépasse, il coviet de la remettre à 1. Ceci peut aisémet s obteir à l aide de l opérateur modulo. Das le cadre de ce cours, ous avos adopté la covetio de uméroter les cases du vecteur de 1 à. Aisi, l opératio d icrémetatio «circulaire» d u idice i parcourat le tableau est i := (i mod )+1. Das le cas où les cases sot umérotées de 0 à 1 (comme das le lagage C ou C++, par exemple), l opératio deviet i := (i+1)mod. Avec cette politique de gestio du vecteur, si la file est stockée das u vecteur de taille, il est à tout momet possible d y maiteir au plus élémets, et ce, quelque soiet les opératios qui ot déjà été effectuées. Les foctios qu o obtiet alors sot doées à l Algorithme 27. Voici leurs descriptios : FileVide Il suffit de stocker 1 das F.deb et F.. Equeue La ouvelle valeur doit être stockée das la case d idice F. (pour rappel, cet idice idique la première case libre, et o pas la derière case occupée). O doit esuite icrémeter F., e teat compte du caractère circulaire du vecteur. Dequeue Cette opératio cosiste simplemet à icrémeter F.deb, de faço circulaire. Les iformatios supprimées restet das le vecteur, mais sot igorées. First La case coteat le de la file est celle d idice F.deb. O revoie simplemet so coteu. EstVide La file est vide si et seulemet si les idices de de sot égaux. Attetio, ils e sot pas forcémet égaux à 1 (ils peuvet avoir avacé au fur et à mesure des Equeue et Dequeue). 5.3 Applicatios Termios ce chapitre e présetat deux applicatios des piles (ous verros d autres applicatios des piles et des files das le chapitre suivat). Outre ces applicatios que ous doos à titre d exemple, rappelos tout de même que les files et les piles ot de ombreuses applicatios das les systèmes d exploitatio et les compilateurs. La partie de la mémoire qui retiet le cotexte d u processus lorsque celui-ci est swappé out est gérée comme ue pile (il s agit du stack système).

83 d d 5.3. APPLICATIONS 83 e b fi????? d e b fi ? d e b fi ? fi e b FIG. 5.3 U exemple de maipulatio de file das u vecteur. Les cases grisées sot celles qui fot partie de la file.

84 84 CHAPITRE 5. LES PILES ET LES FILES FIG. 5.4 Le vecteur implémetat la file vu comme u vecteur circulaire. Les cases grisées sot celles qui fot partie de la file.

85 5.3. APPLICATIONS 85 FileVide(File F) F.deb := 1 ; F. := 1 ; Equeue(File F, Etier i) F.V[F.] := i ; F. := (F.mod )+1 ; Etier Dequeue(File F, Etier i) Etier R := F.V[F.deb] ; F.deb := (F.debmod )+1 ; retourer R ; Boolée EstVide(File F) si F.deb = F. alors retourer vrai ; sio retourer faux ; Algorithme 27 : L implémetatio d u file das ue vecteur (circulaire).

86 86 CHAPITRE 5. LES PILES ET LES FILES U compilateur gère les cotextes des foctios à l aide d ue pile égalemet : la foctio courate a so cotexte stocké au sommet de la pile, et les foctios appelates ot leurs cotextes respectifs stockés das la pile, selo l ordre des appels. Aisi, u appel de foctio correspod à u Push, et u retour à u Pop. E, les files trouvet ue applicatio aturelle chaque fois qu ue file d attete est écessaire, comme, par exemple, das u spooler d impressio, ou das u serveur web Vérificatio des parethèses La première applicatio cosiste à écrire u algorithme qui vérifie si ue expressio est bie parethésée. Nous cosidéreros des expressios arithmétiques, formées de ombres etiers et des quatre opérateurs. Ces expressios pourrot être parethésées à l aide de deux types de parethèses différetes : () et []. Ue expressio est dite est bie parethésée si : 1. Pour toute parethèse fermate d u certai type, il existe ue parethèse ouvrate du même type qui la précède, et qui a pas ecore été fermée. 2. Toute parethèse ouvrate d u certai type est fermée par ue parethèse fermate du même type. Exemple 18 Les expressios suivates sot bie parethésées : ([3+5] (2 9)) 1+4 ([(2)]) Les expressios suivates e sot pas bie parethésées : (3 + 5] : les types de parethèses e correspodet pas. ((3) : ue des deux parethèses a pas été fermée. (4)) : o ferme ue parethèse qui a pas été ouverte. L algorithme que ous proposos reçoit ue expressio S, telle que décrite cidessus, et accède à chacu des élémets qui la composet séquetiellemet, et que ous déotos par S 1,S 2,...,S. Par exemple, das (13+2), ous avos S 1 =), S 2 = 13, S 3 = +, etc. Cet algorithme cosidère chaque élémet S i l u après l autre (i = 1,...). À tout momet, il doit savoir quelles sot les parethèses qui sot ecore ouvertes, et il doit égalemet savoir das quelle ordre ces parethèses ot été ouvertes. Aisi, quad il recotre ue parethèse fermate, il doit simplemet comparer cette parethèse fermate à la derière parethèse ouvrate qui a pas ecore été fermée, et vérifier que les types correspodet. O voit doc qu il est écessaire de pouvoir stocker toutes les parethèses ouvrates, das l ordre où elles ot été recotrées, tout e e devat maiteir u accès direct qu à la derière parethèse ouverte qui a pas ecore été fermée. Ceci peut aisémet être obteu à l aide d ue pile : À chaque parethèse ouvrate recotrée, o effectue u Push. À chaque parethèse fermate recotrée, o vérifie que la pile est pas vide à l aide de EstVide. Si la pile est vide, o a trouvé ue parethèse fermate qui a pas été ouverte. Sio, o vérifie à l aide de Top que la parethèse fermate correspod bie à la derière parethèse ouvrate, et o effectue ue Pop. O igore les autres caractères.

87 5.3. APPLICATIONS 87 À la du parcours de l expressio, la pile doit être vide, car, das le cas cotraire, cela sigifie qu ue parethèse ouvrate a pas été fermée. L Algorithme 28 présete cette solutio. Boolée VérifierParethèses(Expressio S, Etier ) Etier i = 1 ; Pile P ; PileVide(P) ; tat que i faire si S i = ( ou S i = [ alors Push(P, S i ) ; sio si S i =) alors si EstVide(P) ou Top(P) ( alors retourer faux ; sio Pop(P) ; sio si S i =] alors si EstVide(P) ou Top(P) [ alors retourer faux ; sio Pop(P) ; i := i+1 ; si EstVide(P) alors retourer vrai ; sio retourer faux ; Algorithme 28 : U algorithme pour vérifier qu ue expressio est bie parethésée Évaluatio d ue expressio e otatio postfixée La secode applicatio cosiste à doer ue algorithme qui évalue ue expressio arithmétique e otatio postfixée. Ces expressios sot quelque peu différetes des expressios «classiques», e ce ses que les opérateurs arithmétiques sot placés après les deux opérades, et o pas etre les deux opérades. Exemple 19 Par exemple, l expressio 3+2 s écrit e otatio postfixée. L expressio (3 + 2) 5 est le produit de l expressio et de l expressio 5. La première se ote e otatio postfixée, et la secode reste 5. Le produit des deux se ote doc Comme o le voit, l avatage de cette otatio est qu elle permet de se passer des parethèses, la priorité état implicite. Pour évaluer 1 ue expressio S e otatio postfixée, o procède comme suit. O ispecte chaque élémet S i de l expressio l u après l autre. Si ous recotros u 1 Ce problème est pas puremet théorique : de ombreux compilateurs covertisset les expressios arithmétiques e expressios postfixées, et les évaluet, ou géèret le code pour les évaluer selo u algorithme similaire à celui que ous allos préseter.

88 88 CHAPITRE 5. LES PILES ET LES FILES etier, ous devos le reteir jusqu à ce que ous trouvios l opérateur qui va lui être appliqué (et qui le suit forcémet). Chaque fois que ous recotros u opérateur, ous savos qu il s applique aux deux derières valeurs calculées. Nous devos doc reteir toutes les valeurs qui ot été lues, et qui ot pas ecore servi das ue opératio. Ces valeurs doivet être reteues das l ordre où elles ot été lues. Après avoir effectué le calcul, ous devos égalemet reteir le résultat, puisqu il pourrait lui aussi être l opérade d u autre opérateur (par exemple, das , il faut reteir le résultat de 3 2 +, puisqu il devra être multiplié par 5). À ouveau, ous voyos que la mémoire dot ous avos besoi suit ue politique de pile : à tout momet, ous devos reteir toutes les derières valeurs lues ou calculées, et ce, das l ordre où elles l ot été. Mais pour appliquer u opérateur, ous avos besoi que des deux derières valeurs. Notre algorithme parcourra doc l expressio depuis S i jusqu à S, et foctioera aisi : Chaque valeur etière recotrée est stockée sur la pile grâce à Push. À chaque opérateur, o Pop les deux derières valeurs de la pile, o effectue l opératio et o Push le résultat. À la, la valeur de l expressio se trouve au sommet de la pile. L Algorithme 29 présete cette procédure.

89 5.3. APPLICATIONS 89 Etier ÉvaluatioPostFix(Expressio S, Etier ) Etier i := 1, x 1, x 2 ; Pile P ; PileVide(P) ; tat que i faire si S i = + alors x 1 := Top(P) ; Pop(P) ; x 2 := Top(P) ; Pop(P) ; Push(P,x 2 + x 1 ) ; sio si S i = alors x 1 := Top(P) ; Pop(P) ; x 2 := Top(P) ; Pop(P) ; Push(P,x 2 x 1 ) ; sio si S i = alors x 1 := Top(P) ; Pop(P) ; x 2 := Top(P) ; Pop(P) ; Push(P,x 2 x 1 ) ; sio si S i = / alors x 1 := Top(P) ; Pop(P) ; x 2 := Top(P) ; Pop(P) ; Push(P,x 2 /x 1 ) ; sio Push(P,S i ) ; i := i+1 ; retourer Top(P) ; Algorithme 29 : U algorithme pour évaluer ue expressio postfixeé.

90 90 CHAPITRE 5. LES PILES ET LES FILES

91 Chapitre 6 Les arbres 6.1 Itroductio Les structures que ous avos cosidérées jusqu à préset sot uiquemet des structures liéaires, das le ses où : 1. chaque élémet de la structure possède au plus u prédécesseur direct, et 2. chaque élémet de la structure possède au plus u successeur direct. E effet, das u tableau de taille, chaque case i (pour 1 < i < ) possède comme uique prédécesseur la case i 1, et comme uique successeur la case i+1. La case 0 a pas de prédécesseur, mais la case 1 est so uique successeur. La case a elle pas de successeur, mais bie u prédécesseur : la case 1. Das les listes, chaque élémet possède u seul et uique champ ext, qui référece u successeur uique, ou qui cotiet u valeur covetioelle pour idiquer qu il y a pas de successeur. Par ailleurs, la tête a pas de prédécesseur, et, pour tous les autre élémets e, il existe qu u seul autre élémet e dot le champ ext référece e. E, les piles et files sot essetiellemet des listes. Nous allos cosidérer, das ce chapitre, ue gééralisatio de ces structures liéaires e levat la restrictio uméro 2 : chaque élémet aura au plus u seul prédécesseur, mais sera autorisé à avoir plusieurs successeurs 1. O a dès lors affaire à ue structure qui se ramifie, puisque, lors d u parcours de cette structure, o a, à chaque élémet, plusieurs choix possibles pour «cotiuer le parcours». C est pour cette raiso que ce type de structures est appelé u arbre 2. L importace des arbres e iformatique est cosidérable. D ue part, les structures de type arborescet se recotret aturellemet das plusieurs cas pratiques de la vie quotidiee que l o désire modéliser et maipuler à l aide d algorithmes. Par exemple l orgaisatio hiérarchique d ue etreprise est u arbre. La Fig. 6.1 e doe u exemple. D autre part, les arbres jouet u rôle très importat das de ombreux algorithmes, et ils sot la clef de voûte idispesable pour redre ces algorithmes efficaces. Sas arbre, pas de base de doées, pas de système de fichiers, pas de compressio MP3, etc. 1 Nous supposeros égalemet qu il y a pas de cycle das la structure. 2 Remarquos que si ous relâchos les deux hypothèses ci-dessus, à savoir qu o autorise égalemet chaque élémet à avoir plusieurs prédécesseurs, o obtiet u graphe. Nous aborderos pas les graphes das ce cours. 91

92 92 CHAPITRE 6. LES ARBRES D é p a r t e m e t " c o m p o s i t i o " J Ṡ. B a c h D i v i s i o r o m a t i q u e S c h u b e r t D i v i s i o b a r o q u e T e l e m a S e r v i c e S y m p h o i e B e e t h o v e S e r v i c e L i e d e r S c h u m a S e r v i c e O r c h e s t r e H ä d e l S e r v i c e O r gu e B r ü h s FIG. 6.1 U exemple d arbre, qui représete l orgaisatio hiérarchique d ue etreprise (u peu fataisiste).

93 6.1. INTRODUCTION Déitios Il est possible de doer deux types de déitios des arbres : ue déitio «classique», e termes d esembles ; ou bie ue déitio récursive. Suivat la déitio qu o adopte, o pourra formuler les algorithmes de faço itérative ou récursive. Voici d abord la déitio esembliste : Déitio 3 U arbre est ue structure de doées composée d u esemble N de œuds. Chaque œud est composé d ue iformatio Λ() et d u esemble Succ() de œuds successeurs. Par ailleurs, u et u seul œud de N est appelé la racie, déoté r. Ces élémets respectet les coditios suivates : 1. r a pas de prédécesseur : pour tout œud N, r Succ(). 2. Chaque œud a pas plus d u prédécesseur : pour tout œud N, il existe pas de paire de œuds 1 et 2 tels que 1 2, Succ( 1 ) et Succ( 2 ). 3. O peut accéder à chaque œud depuis la racie : pour tout œud, il existe ue séquece 1 2,..., k de œuds telle que : 1 = r, k = et, pour tout 1 i k 1 : i+1 Succ( i ). Remarquos que les poits 2 et 3 de cette déitio obliget chaque œud (à part la racie) à posséder exactemet u prédécesseur. E effet, le poit 2 idique que le ombre de prédécesseur de chaque œud est 1, et le poit 3 implique que chaque œud (à part la racie) doit posséder u ombre de prédécesseurs 1. Illustros cette déitio à l aide d u exemple : Exemple 20 La Fig. 6.2 présete u exemple d arbre à 7 œuds. La relatio «a pour successeur» est représetée par ue flèche. Nous avos doc N = { 1, 2,..., 7 }. La racie est le œud r = 1 : elle est bie dépourvue de prédécesseur. Elle possède 3 successeurs : Succ( 1 ) = { 2, 3, 4 }. Certais œuds ot pas de successeur, comme par exemple : 3 ou 9. Tous les œuds ot au plus 1 prédécesseur, et sot accessibles à partir de la racie. Par exemple, o accède à 7, via la séquece Comme o le voit, la déitio d u arbre est plus complexe que celle d ue liste ou d ue autre séquece liéaire. O peut éamois obteir ue déitio relativemet simple si o admet ue déitio récursive : Déitio 4 U arbre est : 1. soit l arbre vide 2. soit u œud appelé racie et u esemble (potetiellemet vide) {A 1,A 2,...,A } d arbres o-vides appelés sous-arbres. À chaque œud est associée ue iformatio Λ(). Illustros cette déitio : Exemple 21 Repreos l arbre de la Fig Nous avos illustré la vue récursive de cette arbre à la Fig Cet arbre est maiteat vu de la faço suivate : il est composé du œud 1 (qui costitue sa racie) et de trois sous-arbres A, B et C, représetés e grisé sur la figure. A est u arbre dot la racie est 2, et dot les sous-arbres sot D et E. C est u arbre dot la racie est 4 et dot le sous-arbre est F. B, D, E et F sot des arbres composés de leur seule racie (respectivemet 3, 5, 6, 7 ).

94 94 CHAPITRE 6. LES ARBRES FIG. 6.2 U exemple d arbre. Les iformatios associées aux œuds e sot pas représetées. 1 A B C D E F FIG. 6.3 La vue récursive de l arbre de la Fig. 6.2.

95 6.1. INTRODUCTION 95 Il est pas difficile de se covaicre que les deux déitios sot équivaletes. E effet, l arbre vide de la Déitio 4 correspod à u arbre dot l esemble des œuds est vide. U œud de la Déitio 3 correspod à u œud das la Déitio 4, tel que Λ( ) = Λ(), et tels que les successeurs de sot des arbres A 1,A 2,...,A k dot les racies r 1,r 2,...r k costituet l esemble Succ() Vocabulaire U certai vocabulaire covetioel est associé aux arbres. Il permet e gééral de simplifier l exposé des algorithmes sur les arbres. Nous présetos ce vocabulaire das les cadre de la déitio esembliste, mais il peut aisémet être trasposé das le cadre de la vue récursive. Toutes ces déitios sot illustrées par des exemples ci-dessous. Fils : Les œuds de l esemble Succ() sot appelés les fils de. Père : Le père d u œud est l uique œud dot est le fils. Remarquos que la racie a pas de père. Feuille : Ue feuille est u œud qui a pas de fils. Nœud itere : U œud est u œud itere si et seulemet si il est pas ue feuille. Chemi : U chemi das u arbre est ue séquece 1 2 k de œuds de l arbre telle que, pour tout 1 i < k : i+1 Succ( i ). O dit que ce chemi va de 1 à k. La logueur d u chemi 1 2 k est le ombre k de œuds qui le composet. Remarquos que, d après les déitios d u arbre, il y a qu u seul chemi allat de la racie à u œud doé. Accessible : U œud est accessible à partir d u œud s il existe u chemi allat de à das l arbre. Descedat : U œud est u descedat d u œud si et seulemet si est accessible à partir de. Hauteur : La hauteur d u arbre est la logueur du plus log chemi partat de la racie de l arbre. Das la suite, la hauteur d u arbre A est otée hauteur(a). Profodeur : La profodeur d u œud de l arbre est la logueur du chemi allat de la racie à. Exemple 22 La Fig. 6.4 illustre ce vocabulaire. Elle présete u arbre formé de 12 œuds, et de hauteur 4, comme e témoige le chemi e gris : U autre chemi das l arbre est (flèches e poitillés). Les fils de 4 sot 7, 8 et 9 (et 4 est doc le père de ces trois œuds). Les descedats de 4 sot ses fils, plus 12. La profodeur de 5 et 6 par exemple est 3. Celle de 10 est 4, etc. Les œuds 4 et 1, par exemple, sot des œuds iteres, alors que 11 est ue feuille Cas particuliers E pratique, les arbres que l o utilise, ou qui redet efficaces les algorithmes proposés, sot des cas particuliers de la déitio géérale doée ci-dessus. Das cette sectio, ous détaillos trois restrictios supplémetaires qui serot souvet utilisées par la suite.

96 96 CHAPITRE 6. LES ARBRES P r o f o d e u r d e s o e u d s h a u t e u r = F i l s d e C h e m i ( d o e l a h a u t e u r ) D e s c e d a t s d e 4 A u t r e c h e m i FIG. 6.4 Quelques illustratios du vocabulaire sur les arbres.

97 6.1. INTRODUCTION FIG. 6.5 U exemple d arbre biaire équilibré. Arbres ordoés Das les déitios doées au de ce chapitre, ous avos toujours cosidéré qu u œud possédait u esemble de fils, ce qui sigifie qu il existe pas d ordre sur ces fils. E pratique, o fixera souvet u ordre, et o parlera alors du premier fils, du secod fils, du derier fils, etc. Arbres -aires Pour différetes raisos, il sera e gééral pratique de limiter le ombre de fils qu u œud peut posséder. O parle alors d arbre -aire : Déitio 5 U arbre -aire est u arbre dot chaque œud possède au plus fils. Le cas le plus utilisé e pratique (et das la suite de ce cours), et l arbre biaire, où chaque œud possède au plus = 2 fils. Das la suite, ous supposeros implicitemet qu u arbre biaire est ordoé, et ous appelleros respectivemet fils gauche et fils droit le premier et le secod fils d u œud. Das les cas des arbres biaires (ordoés) ous autoriseros u œud à posséder u fils droit mais pas de fils gauche. (ce qui reviet à supposer que le fils gauche est vide). Exemple 23 La Fig. 6.5 présete u exemple d arbre biaire. E effet, les œuds 1 et 2 ot deux fils ; le œuds 3 a u fils ; et les œuds 4, 5 et 6 ot pas de fils. 2 est le fils gauche de 1 et 3 est le fils droit de 1. Arbres équilibrés Comme ous le verros das la suite, la complexité de plusieurs algorithmes sur les arbres déped de la hauteur des arbres auxquels ils sot appliqués. Das ce cotexte, les arbres dot les œuds sot repartis etre les différets sous-arbres de «faço équitable» serot les plus favorables (du poit de vue du temps d exécutio).

98 98 CHAPITRE 6. LES ARBRES La déitio d arbre équilibré (balaced tree) capture cette otio de «répartitio équitable des œuds das les sous-arbres». Ituitivemet, pour qu u arbre composé d u œud et de sous-arbres A 1,A 2,...,A k soit équilibré, il faut qu il respecte deux critères. Tout d abord, il faut que chacu de ses sous-arbres soit équilibré. Esuite, il faut que les hauteurs des sous-arbres soit à peu près équivaletes. Plus rigoureusemet, ous demaderos que les hauteurs de deux sous-arbres A 1 et A 2, quels qu ils soiet, différet au plus de 1. E effet, ous e pouvos pas imposer que tous les sous-arbres aiet la même hauteur, car il se pourrait qu il y ait pas assez de œuds que pour satisfaire ce critère. Par exemple, u arbre biaire à deux œuds 1 et 2, tel que 1 est la racie, et 2 le fils gauche de 1 doit être cosidéré comme équilibré, même si le fils gauche de 1 cotiet plus de œuds (il e cotiet 1) que so fils droit (qui e cotiet pas). Autremet, il e serait pas possible de costruire d arbre biaire équilibré avec deux œuds (i avec 4, 5, 6,... œuds). Nous pouvos maiteat doer la déitio d arbre équilibré. Elle est formulée de faço récursive : Déitio 6 U arbre A est équilibré si et seulemet si : 1. chacu de ses sous-arbre est équilibré et 2. pour toute paire A 1, A 2 de sous-arbres de A, hauteur(a 1 ) hauteur(a 2 ) 1 Exemple 24 L arbre de la Fig. 6.5 est u arbre biaire équilibré. Propriété des arbres biaires équilibrés Motros maiteat que la déitio d arbre équilibré que ous veos de doer satisfait bie otre critère de «hauteur miimale». Pour ce faire, ous allos prouver qu u arbre équilibré coteat œuds a ue hauteur h = O(log()), ce qui, ituitivemet, sigifie que la hauteur est «petite» par rapport au ombre de œuds. Cette preuve requiert quelques pré-requis mathématiques que ous allos maiteat exposer. Tout d abord, ous devos déir les ombres de Fiboacci 3. Il s agit d ue séquece iie de ombres appelés F 1,F 2,F 3,..., telle que chaque ombre est égal à la somme des deux précédets (e commeçat avec F 1 = 1 et F 2 = 1). Voici la déitio (iductive) formelle : Déitio 7 La séquece F 1,F 2,F 3,... des ombres de Fiboacci est ue séquece de ombre etiers déie iductivemet comme suit : F 1 = 1 ; F 2 = 1 ; pour tout i 3 : F i = F i 1 + F i 2. Cette séquece est doc : 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,... 3 D après le om du mathématicie italie Leoardo FIBONACCI (c c. 1250). So Liber Abaci cotribua à itroduire les chiffres arabes e occidet. C est das ce livre qu o trouve u exercice cosistat à calculer la séquece qui porte so om. Néamois, cette séquece était déjà coue des mathématicies idies, bie avat lui.

99 6.1. INTRODUCTION 99 Il a été établi que cette suite a plusieurs coexios avec le ombre d or 4 ϕ qui vaut : ϕ = , Plus précisémet, o sait que : i 1 : F i ϕi 5 1 (6.1) Tous ces résultats peuvet être trouvés das des ouvrages classiques de mathématiques discrètes, comme [5]. Nous pouvos maiteat prouver otre théorème : Théorème 5 Soit A u arbre biaire équilibré composé de œuds, et de hauteur h. Alors, h = O(log()). Preuve. Nous allos tout d abord prouver que si A est u arbre de œuds et de hauteur h, alors F h, c est-à-dire qu u tel arbre cotiet écessairemet u ombre de œuds qui est supérieur au h e ombre de Fiboacci. Nous allos établir ce résultat par iductio sur h. Cas de base h = 1 ou h = 2. Das le cas où h = 1, l arbre possède exactemet = 1 œud. Nous avos bie F 1 = 1. Das le cas où h = 2, l arbre possède au mois 2 œuds. Nous avos doc 2. Or 2 F 2 = 1. Cas iductif h = l > 2. L hypothèse d iductio est : tout arbre biaire équilibré de hauteur h l 1 possède au mois F h œuds. D après la déitio d u arbre équilibré, les deux sous-arbres de la racie sot équilibrés. D après cette déitio toujours, ous avos deux possibilités. Soit les deux fils sot de hauteur l 1. Soit l u des deux est de hauteur l 1 et l autre de hauteur l 2. Cosidéros d abord le secod cas. Le fils qui est de hauteur l 1 (et est aussi équilibré) possède, par hypothèse d iductio, au mois 1 F l 1 œuds. L autre fils, possède, pour la même raiso, au mois 2 F l 2 œuds. Or, l arbre de hauteur l que ous cosidéros possède œuds. Doc : Nous avos doc bie F h. = > F l 1 + F l 2 = F l = F h Das le cas où chaque fils est de hauteur l 1, il est facile de voir que l arbre résultat cotiedra au mois autat de œuds que das le cas où l u des fils est de hauteur l 1 et l autre de hauteur l 2. Nous avos doc aussi F h. Nous savos doc maiteat que pour tout arbre biaire équilibré possédat 4 Le ombre d or est ue valeur qui était régulièremet utilisée das les mesures des statues ou des temples grecs. Cette proportio était cosidérée par les Grecs comme particulièremet harmoieuse. Le om ϕ est choisi e hommage au sculpteur (Phidias).

100 100 CHAPITRE 6. LES ARBRES œuds et de hauteur h : F h. Or, grâce à l équatio (6.1), ous obteos : F h ϕh 5 1 ϕh 5 1 5(+1) ϕ h log ϕ ( 5(+1) ) h log ϕ ( 5 )+log ϕ (+1) h ( 5 Nous voyos doc que log ϕ )+log ϕ (+1) est ue bore supérieure de la hauteur h. Nous pouvos doc utiliser la otatio O, das laquelle log ϕ disparaît, ( 5 ) ( ) puisqu il s agit d ue costate, et ous obteos : h = O log ϕ (+1), ce qui est e O(log()) Implémetatio Nous pouvos maiteat ous tourer vers des cosidératios plus pratiques, à savoir l implémetatio de la structure d arbre. L implémetatio que ous allos préseter ici utilise des poiteurs et est complètemet dyamique. Remarquos qu il est égalemet possible d implémeter u arbre das u tableau, mais ous e discuteros pas cette possibilité ici. De maière géérale, u arbre est composé de œuds qui possèdet chacu u certai ombre de successeurs, que ous avos appelés fils. La structure de base sera doc celle qui permet d implémeter u œud, et u arbre sera essetiellemet u poiteur vers le œud racie (ou bie NIL si l arbre est vide). Comme, de maière géérale, le ombre de fils d u œud est pas boré, il faut prévoir, das la structure qui représete u œud, ue liste coteat les adresses de tous les fils du œud. O obtiet alors les déclaratios suivates. Tout d abord, les élémets de la liste de successeurs : struct ElemArbre Nœud * ifo ; ElemArbre * ext ; Puis, les œuds à propremet parler : struct Nœud Etier ifo ; ElemArbre * succ ; E pratique, la gestio d ue liste pour stocker les adresses des fils d u œud est souvet cosidérée comme lourde, surtout si o a affaire à u arbre ordoé et que l o désire pouvoir accéder immédiatemet au k e fils d u œud. C est pourquoi o adopte souvet l hypothèse simplificatrice qui cosiste à cosidérer qu o e maipule que des arbres N-aires, pour u N «suffisammet grad». O peut dès lors stocker les adresses des fils das u tableau de successeurs, les cases iutilisées état iitialisées à NIL : struct Nœud Etier ifo ; Nœud * succ[n] ;

101 6.1. INTRODUCTION 101 Fialemet, das le cas des arbres biaires de loi les arbres les plus courats o peut explicitemet différecier fils gauche et fils droit das deux champs du œud : struct Nœud Etier ifo ; Nœud * fg ; Nœud * fd ; À titre d exemple, ous présetos maiteat quelques foctios qui maipulet la structure d arbre biaire. Elles sot doées à l Algorithme 30 et à l Algorithme 31, et commetées ci-dessous : ArbreVide Cette foctio costruit u arbre vide e mettat le poiteur racie à NIL. CréerRacie Cette foctio reçoit u arbre (vide) et u etier i, et crée ue racie coteat l iformatio i. IsèreGauche et IsèreDroite Ces deux foctios isèret respectivemet u ouveau œud portat l iformatio i comme fils gauche (droit) de l arbre A. O suppose doc que l arbre A a pas ecore de fils gauche (droit). EstVide Cette foctio revoie vrai si et seulemet si l arbre A est vide (c est-à-dire ssi so poiteur racie est égal à NIL). EstFeuille Cette foctio revoie vrai si et seulemet si l arbre passé est ue feuille (c est-à-dire ssi ses deux fils sot NIL). FilsGauche et FilsDroit Ces foctios revoiet respectivemet u poiteur vers le fils gauche (droit) de l arbre A. IfoRacie Cette foctio permet de cosulter l iformatio stockée das la racie de l arbre. Comme o peut le voir, les foctios d isertios doées e foctioet que das le cas où l o isère ue ouvelle feuille. De plus, ous avos pas doé de foctio de suppressio. Ces restrictios sot justifiées par le fait qu il existe plusieurs maières d isérer ou de supprimer das u arbre biaire, qui dépedet de l iformatio stockée das l arbre, et de la faço dot cette iformatio est stockée. Nous étudieros, das le chapitre suivat, u cas particulier, appelé arbre biaire de recherche, pour lequel ous fouriros les foctios d isertio et de suppressio adaptées Applicatio : les arbres d expressios Ue applicatio classique des arbres biaires cosiste à représeter et maipuler des expressios arithmétiques. Das cette sectio, ous cosidéreros des expressios formées : de ombres etiers d opérateurs +,, ou / de parethèses Comme les opérateurs cosidérés sot tous biaires, la structure d arbre biaire coviet particulièremet bie à leur représetatio. E effet, ue expressio comme 3+5, par exemple, cosiste à appliquer l opérateur + sur les valeurs 3 et 5, ce qui peut se représeter par u arbre dot la racie est étiquetée par +, et les fils gauche et droit par 3 et 5 respectivemet. Si ous cosidéros maiteat l expressio (3 + 5) 2, elle cosiste e la multiplicatio de l expressio par l expressio 2. Nous pouvos doc costruire ue arbre dot la racie est étiquetée par, dot le fils gauche est

102 102 CHAPITRE 6. LES ARBRES ArbreVide(Nœud * & A) A := NIL ; CréerRacie(Nœud * &A, Etier i) A := ew Nœud ; A.ifo := i ; A.fg := NIL ; A.fd := NIL ; IsèreGauche(Nœud * A, Etier i) A.fg := ew Nœud ; A.fg.ifo := i; A.fg.fg := NIL; A.fg.fd := NIL; IsèreDroite(Nœud * A, Etier i) A.fd := ew Nœud ; A.fd.ifo := i; A.fd.fg := NIL; A.fd.fd := NIL; Algorithme 30 : Quelques foctios de base pour maipuler u arbre biaire stockat des etiers.

103 6.1. INTRODUCTION 103 Boolée EstVide(Nœud * A) si A = NIL alors retourer vrai ; sio retourer faux ; Boolée EstFeuille(Nœud * A) si EstVide(FilsGauche(A)) et EstVide(FilsDroit(A)) alors retourer vrai ; sio retourer faux ; Nœud * FilsGauche(Nœud * A) retourer A.fg ; Nœud * FilsDroit(Nœud * A) retourer A.fd ; Etier IfoRacie(Nœud * A) retourer A.ifo ; Algorithme 31 : Quelques foctios de base pour maipuler u arbre biaire stockat des etiers (suite)

104 104 CHAPITRE 6. LES ARBRES FIG. 6.6 U exemple d arbre d expressio qui représete (3 + 5) 2. l arbre correspodat à 3 + 5, et le fils droit est étiqueté par 2. Ceci est illustré à la Fig Comme o le voit, la priorité fixée par les parethèses est implicite das l arbre : a de pouvoir évaluer le, o devra d abord évaluer le +, puisque celui-ci est so fils gauche. Nous pouvos maiteat déir u arbre d expressio : Déitio 8 U arbre d expressio est u arbre biaire, tel que : Chaque feuille est étiquetée par u ombre etier i, et représete l expressio i ; Chaque œud itere : est étiqueté par u opérateur op ; possède u fils gauche f g et u fils droit f d ; représete l expressio E 1 op E 2, où E 1 est l expressio représetée par f g, et E 2 est l expressio représetée par f d. Nous verros, das la sectio suivate, que les algorithmes gééraux de parcours permettet de maipuler de faço très élégate ces arbres d expressio. 6.2 Parcours des arbres biaires Supposos que ous désirios appliquer u certai traitemet à chaque œud d u arbre biaire A (par exemple : afficher l iformatio coteue das la racie). Pour ce faire, il ous faudra certaiemet : traiter la racie de l arbre, traiter le sous-arbre gauche et traiter le sous-arbre droit. S il est raisoable de dire que le sous-arbre gauche doit être traité avat le sous-arbre droit (sio, pourquoi aurait-o choisi cet ordre?), il est plus difficile de décider à quel momet il y a lieu de traiter la racie. Est-ce avat d avoir traité les deux fils? après les avoir traités? etre les deux traitemets? Cotrairemet à ue liste, u arbre e possède pas u seul ordre aturel sur ses élémets, mais bie plusieurs. Ces différets ordres sot formalisés par la otio de

105 6.2. PARCOURS DES ARBRES BINAIRES 105 parcours, c est-à-dire de procédure traversat tous les œuds de l arbre et les traitat chacu ue et ue seule fois à u momet précis. L ordre das lequel les œuds sot traités fixe l ordre sur les œuds. Das cette sectio, ous étudios quatre parcours. Les trois premiers suivet le caevas que ous veos d exposer (traitemet de la racie, du fils gauche et du fils droit), e faisat varier le momet auquel la racie est traitée. Ces parcours sot très faciles à exprimer de faço récursive, mais ous e étudieros égalemet des versios itératives, qui utiliset ue pile. Nous étudieros esuite le parcours par iveaux, qui fait appel à la structure de file du Chapitre 5. Ces parcours sot illustrés à la Fig. 6.7 et sot doés aux Algorithmes 32 à 37. ParcoursPréfixé(Nœud * A) si EstVide(A) alors Traiter A ; ParcoursPréfixé(FilsGauche(A)) ; ParcoursPréfixé(FilsDroit(A)) ; ParcoursIfixe(Nœud * A) si EstVide(A) alors ParcoursIfixe(FilsGauche(A)) ; Traiter A ; ParcoursIfixe(FilsDroit(A)) ; ParcoursPostfixé(Nœud * A) si EstVide(A) alors ParcoursPostfixé(FilsGauche(A)) ; ParcoursPostfixé(FilsDroit(A)) ; Traiter A ; Algorithme 32 : Le trois parcours «de base» exprimés de faço récursive Parcours préfixé ou parcours e profodeur Comme so om le suggère, le parcours préfixé cosiste à traiter la racie de l arbre avat de traiter le fils gauche et le fils droit. Ce traitemet a pas lieu si l arbre passé à la foctio est vide. La formulatio récursive de ce parcours est doc extrêmemet simple, et est doée à l Algorithme 32. Itéressos-ous maiteat à ue implémetatio itérative de ce parcours. Pour ce faire, ous devos d abord mieux compredre commet il foctioe. Cosidéros l exemple de la Fig Sur cet arbre, le parcours préfixé traite les œuds das l ordre suivat : 1, 2, 4, 5, 3, 6. Iitialemet, l appel récursif est effectué sur 1 : 1 est traité, puis o effectue l appel récursif sur 2. À ce momet, l appel récursif sur 3 est pas ecore exécuté, et o peut doc cosidérer qu il est «e attete». L appel

106 106 CHAPITRE 6. LES ARBRES P a r c o u r s p r é fi x é P a r c o u r s ifi x e P a r c o u r s p o s t fi x é P a r c o u r s p a r iv e a u x FIG. 6.7 Les quatre parcours d arbre classiques. La flèche e potillé idique l ordre des appels. U poit à proximité d u œud idique à quel momet le œud sera effectivemet traité lors du parcours.

107 6.2. PARCOURS DES ARBRES BINAIRES 107 ParcoursPréfixé(Nœud * A) Pile P ; PileVide(P) ; Push(P, (A,d)) ; tat que EstVide(P) faire (A,actio) := Top(P) ; Pop(P) ; si EstVide(A) alors si actio =d alors Push(P, (FilsDroit(A),d)) ; Push(P, (FilsGauche(A),d)) ; Push(P, (A,t)) ; sio Traiter A ; Algorithme 33 : Le parcours préfixé exprimé de faço itérative. ParcoursIfixe(Nœud * A) Pile P ; PileVide(P) ; Push(P, (A,d)) ; tat que EstVide(P) faire (A,actio) := Top(P) ; Pop(P) ; si EstVide(A) alors si actio =d alors Push(P, (FilsDroit(A),d)) ; Push(P, (A,t)) ; Push(P, (FilsGauche(A),d)) ; sio Traiter A ; Algorithme 34 : Le parcours ifixe exprimé de faço itérative.

108 108 CHAPITRE 6. LES ARBRES ParcoursPostfixé(Nœud * A) Pile P ; PileVide(P) ; Push(P, (A,d)) ; tat que EstVide(P) faire (A,actio) := Top(P) ; Pop(P) ; si EstVide(A) alors si actio =d alors Push(P, (A,t)) ; Push(P, (FilsDroit(A),d)) ; Push(P, (FilsGauche(A),d)) ; sio Traiter A ; Algorithme 35 : Le parcours ifixe exprimé de faço itérative. récursif sur 2 effectue le traitemet de 2, aisi qu u ouvel appel sur 4, ce qui met l appel récursif sur 5 «e attete», mais avat l appel sur 3 lui aussi «e attete». Ue faço de résumer cette explicatio, cosiste à exprimer le travail effectué par l algorithme sous forme d ue séquece d actios, qui peuvet être de deux types : 1. soit l algorithme doit effectuer l appel récursif sur u œud, ce que ous appelleros développer le œud. L actio cosistat à développer l arbre dot la racie est sera idiquée das la séquece par (,d). 2. soit l algorithme doit traiter le œud. L actio cosistat à traiter l arbre dot la racie est sera idiquée das la séquece par (,t). Les actios présetes das la séquece sot exécutées l ue après l autre par l algorithme : la première est doc l actio courate et les suivates sot e attete. Exécuter l actio cosiste parfois à remplacer cette actio par plusieurs autres actios das la séquece : das le cas du développemet de A, o doit isérer les actios qui idiquet qu il faut traiter A et développer ses deux fils. Iitialemet, la seule actio qui doit être effectuée est le développemet de 1, ce que ous oteros par la séquece suivate : ( 1,d). Développer 1 cosiste tout d abord à traiter 1, puis à développer le fils gauche de 1, puis à développer le fils droit de 1. Nous pouvos doc remplacer cette séquece par ( 1 t),( 2,d),( 3,d). L algorithme doit doc maiteat traiter 1, comme idiqué par le premier élémet de la séquece. Ue fois que cela est fait, ous pouvos supprimer ( 1 t) de la séquece des actios à effectuer, et ous voyos qu il ous reste à effectuer ( 2,d),( 3,d). Développer 2 reviet à traiter 2, puis développer 4 et 5. Nous obteos doc la séquece ( 2,t),( 4,d),( 5,d),( 3,d). O voit que le développemet de 3 reste «e attete», et que ce développemet aura lieu avat les développemets de 5 et 3. L algorithme

109 6.2. PARCOURS DES ARBRES BINAIRES 109 cotiue aisi et s arrête lorsque la séquece est vide : ( 1,d) ( 1,t),( 2,d),( 3,d) ( 2,d),( 3,d) ( 2,t),( 4,d),( 5,d),( 3,d) ( 4,d),( 5,d),( 3,d) ( 4,t),(NIL,d),(NIL,d),( 5,d),( 3,d) ( 5,d),( 3,d) ( 5,t),(NIL,d),(NIL,d),( 3,d) ( 3,d) ( 3,t),( 6,d),(NIL,d) ( 6,d),(NIL,d) ( 6,t),(NIL,d),(NIL,d) ε Il est facile de voir que les maipulatios effectuée sur la séquece suivet ue politique de pile, dot le sommet est le de la séquece. O obtiet aisi u algorithme itératif qui effectue le parcours préfixé d u arbre A. Cet algorithme maitiet, à tout momet, la séquece décrite ci-dessus das ue pile, avec le de la séquece au sommet. Iitialemet, la pile cotiet (A, d). Esuite, tat que la pile est pas vide, l algorithme effectue les actios suivates. Il commece par elever u couple (A, act) du sommet de la pile, idiquat que l actio act doit être appliquée à l arbre A : 1. si l arbre A est vide, rie est effectué ; 2. si l actio est Ø, l algorithme traite A ; 3. si l actio est, l algorithme effectue le Push de : (FilsDroit(A),d), puis de (FilsGauche(A), d) et e de (A, t). Remarquos que l ordre est «iversé» par rapport à la spécificatio aturelle du parcours préfixé. C est dû au fait qu o utilise ue pile, et que la prochaie actio effectuée sera dès lors la derière isérée das la pile. Cet Algorithme est doé à l Algorithme 33. L algorithme que ous veos de préseter a l avatage d être aisé à expliquer, et d offrir ue caevas gééral d algorithme de parcours, comme ous le verros cidessous. Néamois, il est possible d e obteir ue versio plus simple, grâce aux deux costatatios suivates : 1. Le développemet d u arbre A cosiste à effectuer les Push successifs de ses sous-arbres droits et gauche (avec l actio ), puis de lui-même, accompagé de l actio Ø. Or, comme (A, t) est la derière iformatio mise sur la pile, c est aussi la première qui e sortira. Autremet, chaque fois que l o met (A,t), o a la garatie que la prochaie chose à effectuer sera de traiter A. Das ce cas, il est pas écessaire de mettre (A,t) sur la pile : il suffit de traiter A avat de stocker ses deux fils. Comme o e met désormais plus d élémet de la forme (A,t), il est plus écessaire de spécifier l actio pour ceux qu o y stocke. 2. Nous pouvos à ouveau appliquer le même raisoemet. Après avoir traité A, ous stockos FilsGauche(A) et FilsDroit(A) sur la pile. Cela sigifie que la prochaie actio à effectuer cosiste à développer le fils gauche, c est-à-dire, stocker FilsGauche(FilsGauche(A)) et FilsDroit(FilsGauche(A)) sur la pile, etc. O voit qu il est pas écessaire de faire trasiter le fils gauche sur la pile si c est pour l e retirer immédiatemet après.

110 110 CHAPITRE 6. LES ARBRES Au al, l algorithme foctioe comme suit. Recevat u arbre A, il traite sa racie, Push so sous-arbre droit sur la pile, et «desced» das so fils gauche grâce à A := FilsGauche(A). Ce traitemet est recommecé jusqu à ce qu il y ait plus de fils gauche. À ce momet, o Pop le derier fils droit e attete de la pile, et o recommece le même traitemet. O s arrête dès que la pile est vide. L Algorithme 36 présete cette solutio. ParcoursPréfixé(Nœud * A) Pile P ; PileVide(P) ; répéter Traiter A ; Push(P, FilsDroit(A)) ; A := FilsGauche(A) ; si EstVide(A) et EstVide(P) alors A := Top(P) ; Pop(P) ; jusqu à EstVide(P) ; Algorithme 36 : Ue versio simplifiée du parcours préfixé Parcours ifixe Das le parcours ifixe, o traite la racie après avoir traité le fils gauche, mais avat d avoir traité le fils droit. La versio récursive est doée à l Algorithme 32. Il est facile de voir comme idiqué sur la Fig. 6.7 que l ordre des appels récursifs est le même das le cas du parcours ifixe que das le cas du parcours préfixé. La seule différece tiet das le fait que le traitemet est effectué etre les appels, et o pas avat eux. Sur base de cette observatio, o adapte aisémet l algorithme itératif doé pour le parcours postfixé, a d obteir u algorithme pour le parcours ifixe. L adaptatio cosiste à chager le traitemet à effectuer quad o recotre u couple du type (A, d) au sommet de la pile : il faut maiteat pusher successivemet (FilsDroit(A), d), (A, t) et (FilsGauche(A), d), a que la racie soit traitée après le développemet de FilsGauche(A), mais avat le développemet de FilsDroit(A). L Algorithme 34 présete cette solutio Parcours postfixé Le parcours postfixé viet compléter les deux précédets : o y traite la racie après avoir traité successivemet les deux fils. La versio récursive est doée à l Algorithme 32. La versio itérative est, elle aussi, ue modificatio des parcours préfixé et ifixe, das laquelle o Push successivemet (A, t), (FilsDroit(A), d) et (FilsGauche(A), d). Elle est doée à l Algorithme 35.

111 6.2. PARCOURS DES ARBRES BINAIRES Le parcours par iveaux ou parcours e largeur Le parcours par iveaux (parfois appelé parcours e largeur) se différecie des trois parcours précédets car il a pas de formulatio récursive immédiate. Par cotre, sa formulatio itérative ressemble aux parcours précédets. Commeços par expliquer ituitivemet ce que ous etedos par parcours par iveaux. Comme o le voit sur la Fig. 6.7, il s agit de parcourir d abord tous les œuds de profodeur 1, puis ceux de profodeur 2, puis ceux de profodeur 3, etc, et ce de gauche à droite (suivat l ordre imposé aturellemet par les poiteurs). Si ous cosidéros l arbre biaire de la Fig. 6.5, le parcours par iveaux se déroule comme suit. O traite d abord le œud 1. Ce faisat, o recotre ses deux fils 2 et 3, que l o met e attete. Esuite, o traite 2. O recotre alors ses deux fils 4 et 5 qui doivet, eux aussi être mis e attete. Néamois, cotrairemet à ce qui se passait avec la pile utilisée das les parcours préfixé, ifixe ou postfixé, les fils 4 et 5 devrot être traité après qu o a traité 3. E effet, il faut avoir traité tous les œuds de même profodeur avat de passer au «iveau» suivat. Or, 3 est de profodeur 2, alors que 4 et 5 sot de profodeur 3. Ce sot doc les œuds qui ot été mis e attete e premier qui devrot être traités d abord. O a affaire à ue politique de type FIFO, caractéristique des files. Ceci ous fourit u algorithme pour le parcours e largeur. Celui-ci maitiet e permaece ue file d élémet à traiter, qui cotiet iitialemet l arbre A à parcourir. Tat que la file est pas vide, l algorithme prélève l arbre qui se trouve e de file, traite sa racie, et isère, successivemet le sous-arbre gauche et le sous-arbre droit de A das la file. ParcoursLargeur(Nœud * A) File F ; FileVide(F) ; Equeue(F, A) ; tat que EstVide(F) faire A := First(F) ; Dequeue(F) ; si EstVide(A) alors Traiter A ; Equeue(F, FilsGauche(A)) ; Equeue(F, FilsDroit(A)) ; Algorithme 37 : Le parcours par iveaux d u arbre biaire. Exemple 25 La Fig. 6.8 illustre l exécutio du parcours e largeur sur l arbre de la Fig À chaque étape, o a représeté la file correspodate Applicatios des parcours Le calcul de la hauteur d u arbre biaire A d obteir ue algorithme récursif calculat la hauteur d u arbre, il faut d abord e doer ue déitio récursive. Naturellemet, la hauteur de l arbre vide est 0. Si ous voyos u arbre comme ue

112 112 CHAPITRE 6. LES ARBRES FIG. 6.8 Ue illustratio du parcours e largeur. Les œuds grisés ot été traités. Le coteu de la file à chaque étape est représeté sous l arbre.

113 6.2. PARCOURS DES ARBRES BINAIRES 113 racie flaquée de deux sous-arbres, il est clair que la hauteur de l arbre dépedra des hauteurs des sous-arbre, auxquelles il faudra ajouter 1 pour la racie. Comme la hauteur d u arbre est déie par rapport à so plus log chemi, il coviet de garder la hauteur du plus haut des deux sous-arbre : Déitio 9 La hauteur hauteur(a) d u arbre A est : 0 si l arbre est vide 1 + max{hauteur((filsgauche(a)), hauteur((filsdroit(a))}, sio O voit qu il faut doc calculer la hauteur des deux fils avat de pouvoir calculer la hauteur de l arbre. Il s agit d u parcours postfixé, comme le motre l Algorithme 38. Etier Hauteur(Nœud * A) si EstVide(A) alors retourer 0 ; sio Etier hg, hd ; hg := Hauteur(FilsGauche(A)) ; hd := Hauteur(FilsDroit(A)) ; retourer 1+max{hg,hd} ; Algorithme 38 : U algorithme récursif pour calculer la hauteur d u arbre biaire. L évaluatio d ue expressio Cosidéros à ouveau u arbre d expressio, et écrivos u algorithme qui calcule la valeur de l expressio représetée par l arbre. Si ous regardos l exemple 6.6, ous costatos qu il e ous est pas possible d évaluer immédiatemet la valeur de la multiplicatio représetée das la racie. E effet, il faut d abord coaître les valeurs des expressios stockées das les fils gauche et droit. De même, pour évaluer la valeur de l additio stockée das le fils gauche de la racie, il faut d abord coaître les valeurs des deux feuilles 3 et 5. Par cotre, la valeur d ue feuille est directemet stockée das so étiquette. O obtiet aisi u algorithme récursif pour évaluer u arbre d expressio : 1. Si l arbre est vide, la valeur est 0 ; 2. Si l arbre est ue feuille, la valeur est Λ() ; 3. Sio, la racie de l arbre possède deux fils f g et f d, et la valeur de l expressio est f g Λ() f d (où Λ() est l opérateur stocké das la racie). Il s agit à ouveau d u parcours postfixé, puisqu il faut évaluer les fils avat de pouvoir évaluer la racie. Cet algorithme est doé e détail à l Algorithme 39 L affichage d ue expressio Regardos maiteat commet ous pouvos afficher (e otatio covetioelle) ue expressio stockée das u arbre (e isérat des parethèses a de garatir que la priorité exprimée par l arbre est respectée). À ouveau, ous allos aalyser le problème sous l agle récursif. Il est clair que l affichage de l arbre vide, e produit rie, et que l affichage d ue feuille reviet à afficher so étiquette. Si, par cotre, ous avos affaire à u arbre dot la racie possède des fils, il coviet d afficher d abord l expressio correspodat au fils gauche, puis l opérateur stocké das la racie, et e l expressio que représete le fils droit. Il

114 114 CHAPITRE 6. LES ARBRES Etier ÉvaluatioExpressio(Nœud * A) si EstVide(A) alors retourer 0 ; sio si EstFeuille(A) alors retourer IfoRacie(A) ; sio Etier vg, vd ; vg := ÉvaluatioExpressio(FilsGauche(A)) ; vd := ÉvaluatioExpressio(FilsDroit(A)) ; si IfoRacie(A) = + alors retourer vg+vd ; sio si IfoRacie(A) = alors retourer vg vd ; sio si IfoRacie(A) = alors retourer vg vd ; sio retourer vg/vd ; Algorithme 39 : U algorithme récursif pour évaluer u arbre d expressio. faut predre garde à etourer cet affichage de parethèses ouvrates et fermates, a de s assurer que la priorité est respectée. E effet, sas cela, l algorithme afficherait quad il est exécuté sur l arbre de la Fig. 6.6, ce qui est pas correct. Avec les parethèses, o affiche ((5 + 3) 2). Nous obteos doc ue variatio du parcours ifixe, puisque le coteu de la racie est affiché, etre les deux appels récursifs qui traitet les fils gauche et droit. l Algorithme 40 présete cette solutio. Etier AffichageExpressio(Nœud * A) si EstVide(A) alors si EstFeuille(A) alors Afficher Ifo(A) ; sio Afficher ( ; AffichageExpressio(FilsGauche(A)) ; Afficher Ifo(A) ; AffichageExpressio(FilsGauche(D)) ; Afficher ) ; Algorithme 40 : U algorithme récursif pour afficher ue expressio stockée das u arbre

115 Chapitre 7 Algorithmes de recherche 7.1 Itroductio L objet premier de l iformatique est, comme sot om le suggère, le traitemet de l iformatio. Les ordiateurs sot de plus e plus utilisés pour stocker et maipuler des quatités gigatesques de doées, auquel o souhaite u accès rapide et fiable. Das ce cotexte, les algorithmes de recherche, qui ot pour but de rechercher ue iformatio précise das ue masse d iformatios doée, sot d ue importace capitale. Il doit être possible de stocker les iformatios e mémoire de telle maière que ces algorithmes de recherche soiet les plus efficaces possible. Naturellemet, l efficacité de ces algorithme dépedra de la maière dot les iformatios e questio sot structurées. Das ce cours, ous avos étudié plusieurs structures de doées : les vecteurs, les listes, les files, les piles et les arbres. Il est clair que les files et les piles e covieet pas à la recherche d iformatios, car elles e permettet d accéder qu à u seul des élémets qu elles cotieet à la fois (celui au sommet, das le cas des piles, et celui au, das le cas des files). Par cotre, les vecteurs, les listes et les arbres semblet coveir au stockage et à la recherche d iformatio. Il est doc aturel de se demader quels sot les algorithmes utilisables sur ces structures et quel sot leurs efficacités respectives. A de pouvoir effectuer ue comparaiso correcte etre ces différetes structures, ous allos cosidérer le problème suivat. Nous allos supposer que ous avos à otre dispositio ue certaie séquece de valeurs etières 1 V 1,V 2,...V. E pratique, ces iformatios peuvet être lues sur iput, sur u fichier, etc., Nous allos regarder commet stocker ces iformatios das chacue des trois structures cosidérées de maière à ce que les algorithmes de recherche soiet esuite aussi efficace que possible. Das tous les cas, ous allos évaluer le coût de la costructio de la structure, aisi que le coût de chaque recherche. 1 Cette hypothèse ous permettra de supposer qu il existe u ordre sur les valeurs (c est-à-dire que cellesci peuvet être triées). E pratique, o peut e gééral trouver u tel ordre même si les valeurs e sot pas des etiers. Il existe égalemet bie des cas où ue clef primaire etière est attachée à chaque doée. Cette hypothèse est doc tout à fait réaliste. 115

116 116 CHAPITRE 7. ALGORITHMES DE RECHERCHE 7.2 Doées stockées das des vecteurs Comme les valeurs cosidérées sot etières, ous pouvos choisir de les stocker de maière triée ou das l ordre où elles ous sot fouries. Cela ifluera aturellemet sur le temps écessaire pour costruire la structure ou pour la cosulter Recherche liéaire simple Le cas le plus simple est celui où les k valeurs sot stockées das u tableau T de telle maière que, pour tout 1 i, T[i] = V i. Das ce cas, la costructio du vecteur est simple das la mesure où il suffit d isérer chaque valeur das la prochaie case libre. Cette costructio est doc e O(). La recherche s effectue, elle aussi e O(), puisqu il faut parcourir tout le vecteur au pire cas. CostruireVec(Etier T[]) Etier i := 1 ; tat que i faire T[i] := V i ; i := i+1 ; Boolée RechercheLiéaireVec(Etier T[], Etier k) Etier i := 1 ; tat que i et T[i] k faire i := i+1 ; si T[i] = +1 alors retourer faux ; sio retourer vrai ; Algorithme 41 : La costructio et la recherche das u vecteur o trié La correctio de l algorithme de recherche peut être établie grâce à l ivariat suivat : i +1 1 j < i : T[i] k qui idique que toutes les cases cosidérées (jusqu à la case i 1) e cotieet pas la valeur k recherchée. Autremet dit, la boucle de la foctio RechercheLiéaireVec parcourt le vecteur case par case e élimiat celles qui e cotieet pas k. À la de la boucle, o doc la garatie : 1. Soit que toutes les cases ot été passées e revue, et doc que la valeur k est pas présete das le vecteur ; 2. Soit qu o a trouvé la valeur e s arrêtat «au milieu» du vecteur. Plus formellemet, à la de la boucle, o sait que : i +1 T[i] = k

117 7.2. DONNÉES STOCKÉES DANS DES VECTEURS 117 E associat ce résultat à l ivariat o obtiet : ce qui est équivalet à : i i +1 1 j < i : T[i] k T[i] = k i +1 1 j < i : T[i] k i = +1 1 j < +1 : T[i] k T[i] = k i +1 1 j < i : T[i] k La première partie de cette disjoctio idique que la valeur k est pas das le vecteur (et que i = +1). La secode partie idique qu o a trouvé ue occurece de k das la case T[i]. Autremet dit, si e de boucle i = +1, o sait que la valeur est pas présete. Sio, o a trouvé la valeur k à la positio i Recherche liéaire das u vecteur trié Si les valeurs sot stockées das le tableau de faço triée, il est possible d améliorer u peu la recherche, comme ous l avos vu das le cas des listes triées à la Sectio du Chapitre 4. E effet, dès qu o recotre das le tableau ue valeur T[j] telle que T[ j] > k (où k est l iformatio recherchée), o peut arrêter la recherche, car o sait que toutes les case T[i] avec i > j cotieet elles aussi des iformatios > k. O obtiet alors l Algorithme 42 pour la recherche. Malheureusemet celui-ci reste e O() au pire cas. Il ous reste à voir commet obteir u vecteur trié, état doé que ous avos pas la garatie que les iformatios V 1,V 2,...,V sot doées das cet ordre. Pour ce faire, o peut utiliser la foctio CostruireVec de l Algorithme 41, puis trier le vecteur. Il existe de bos tris e O( log()) (comme HeapSort, voir, par exemple [3]). La costructio du vecteur trié est doc e O( + log()) = O( log()). Boolée RechercheTriéeVec(Etier T[], Etier k) Etier i := 1 ; tat que i et T[i] < k faire i := i+1 ; si i et T[i] = k alors retourer vrai ; sio retourer faux ; Algorithme 42 : La costructio et la recherche das u vecteur o trié Das ce cas, l ivariat Iv de la boucle de recherche est : i +1 1 j < i : T[i] < k Cette boucle élimie doc toutes les valeurs < k (et o pas k). La égatio de la coditio B de la boucle est, cette fois-ci : i +1 T[i] k

118 118 CHAPITRE 7. ALGORITHMES DE RECHERCHE Pour des raisos de facilité, ous réécrivos cette assertio e : i +1 T[i] = k T[i] > k E de boucle, ous avos doc ( B Iv) : Ce qui est équivalet à : i +1 i +1 1 j < i : T[i] < k T[i] = k i +1 1 j < i : T[i] < k T[i] > k i +1 1 j < i : T[i] < k i = +1 1 j < +1 : T[i] < k T[i] = k i +1 1 j < i : T[i] < k T[i] > k i +1 1 j < i : T[i] < k Autremet dit, trois possibilités s offret à ous : 1. Soit i = + 1, et toutes les valeurs du tableau sot < k. Clairemet, das ce cas, la valeur est pas trouvée. 2. Soit i s est arrêté sur ue case T[i] qui cotiet k. 3. Soit i s est arrêté sur ue case T[i] qui cotiet > k, et toutes les cases avat i sot < k. Ceci implique que k est pas das le vecteur. E effet, le fait que T[i] cotiee ue valeur > k et le fait que le vecteur soit trié impliquet que toutes les cases T[i + 1]...T[] cotieet des valeurs > k. Doc, toutes les cases T[1]...T[i 1] cotieet des valeurs < k ; T[i] cotiet ue valeur > k ; et toutes les cases T[i+1]...T[] cotieet des valeurs > k. Il coviet de doc de s assurer que i et que T[i] = k e de boucle pour retourer vrai Recherche dichotomique das u vecteur trié Néamois, das le cas où le vecteur est trié, o peut utiliser u algorithme de recherche plus efficace que la recherche liéaire de l Algorithme 42. Il s agit de la recherche dichotomique. Celle-ci foctioe de faço similaire à ce que l o fait si o recherche u om das u auaire téléphoique 2. La techique habituelle cosiste à ouvrir l auaire au milieu. Si la page cotiet, par chace, le om de otre correspodat, ous avos trouvé l iformatio désirée. Das le cas cotraire, il faut regarder l iitiale des oms sur la page à laquelle o a ouvert l auaire, et comparer cette iitiale à celle de otre correspodat pour savoir das quelle directio il faut cotiuer la recherche. Par exemple, si ous avos ouvert l auaire à la page des L et que le om de otre correspodat commece par M, ous devros chercher das la partie de l auaire qui se trouve après la page des L, ce qui ous permet d élimier immédiatemet la moitié de l auaire costituée des pages avat L. Nous pouvos alors recommecer le même traitemet 2 Illo tempore, les auaires e papier étaiet ecore répadus...

119 7.2. DONNÉES STOCKÉES DANS DES VECTEURS 119 das la partie restate : ous ouvros l auaire au milieu de sa secode moitié (soit à ses trois quarts), et ous comparos l iitiale de la page, et aisi de suite. Cette méthode est très rapide e pratique car, à chaque étape, ous séparos la partie iexplorée de l auaire e deux parties (approximativemet) égales, et ous élimios l ue des deux. Après la première étape, ous avos élimié la moitié de l auaire, après la secode, les trois quarts, après la troisième, les 7/8, etc. O peut trasposer cette idée sous la forme d u algorithme récursif qui foctioe sur u vecteur trié. Celui-ci reçoit u vecteur T, ue valeur k et deux bores bi et bs. Il doit retourer vrai ssi la valeur k est présete das ue des cases T[i] telle que bi i bs. Pour ce faire, il commece par repérer le «milieu» de la partie à traiter. Cette partie est logueur bs bi+1, et so milieu est doc à la case 3 bs bi+1 m = bi+ 2 L algorithme compare alors k à T[m]. Trois cas peuvet se préseter : 1. Si T[m] = k, l iformatio est trouvée, et l algorithme retoure vrai. 2. Si T[m] < k, k e peut se trouver qu à droite de T[m]. O doit doc effectuer ue recherche das la portio comprise etre les case m + 1 et bs du vecteur. 3. Si T[m] > k, k e peut se trouver qu à gauche de T[m]. O doit doc effectuer ue recherche das la portio comprise etre les case bi et m 1 du vecteur. Les deux deriers cas sot traités à l aide d u appel récursif, et l algorithme doit doc revoyer la valeur obteue à l aide de l appel récursif. Si l iformatio à chercher est pas das le vecteur, la récursivité s arrête dès que la portio du vecteur à traiter est vide, c est-à-dire ssi bs < bi. Das ce cas, o retoure faux. Cet algorithme est doé à l Algorithme 43 et illustré par l exemple ci-dessous. Exemple 26 Cosidéros le tableau doé à la Fig. 7.1, et cherchos y la valeur k = 53 de maière dichotomique. Le tableau comporte 14 valeurs. À la première itératio, ous avos doc bi = 1, bs = 14 et m = bi+ (bs bi+1)/2 = 1+(14 1+1/2)= 8. Comme la valeur recherchée 53 est > T[8] = 45, o obtiet bi = m + 1 = 9 et bs reste ichagée. O cotiue aisi jusqu à avoir trouvé 53, ce qui arrive au bout de 4 itératios. Complexité de la recherche dichotomique Évaluos maiteat la complexité de cette procédure, a de ous assurer qu elle est effectivemet plus efficace que la recherche liéaire. Il est clair que les traitemets effectués à l itérieur de chacu des appels récursif sot e O(1). La complexité de la recherche dichotomique e dépedra doc que de la profodeur des appels récursifs. Le pire cas est obteu quad la valeur k est pas présete das le vecteur, ce que l o détecte e effectuat e appel récursif sur ue portio vide du vecteur. Il ous faut doc trouver ue bore supérieure sur le ombre d appels écessaires pour avoir la garatie que le vecteur soit vide. Pour ce faire, ous allos d abord prouver le résultat suivat, qui lie la profodeur des appels récursifs et la taille de la portio du vecteur à explorer. Nous predros comme covetio que l appel pricipal est de profodeur 0, que le premier appel récursif est de profodeur 1, etc. 3 Le placher peut être supprimé à coditio d effectuer ue divisio etière.

120 m m m m 120 CHAPITRE 7. ALGORITHMES DE RECHERCHE k = FIG. 7.1 Ue illustratio de la recherche dichotomique. Les cases grisées délimitet l itervalle de recherche RechercheDichotomique(Etier T[], Etier bi, Etier bs, Etier k) si bs < bi alors retourer faux ; sio Etier m := bi+ bs bi+1 2 ; si T[m] = k alors retourer vrai ; sio si T[m] < k alors retourer RechercheDichotomique(T, m + 1, bs, k) ; sio retourer RechercheDichotomique(T, bi, m 1, k) ; Algorithme 43 : La recherche dichotomique das u vecteur trié.

121 7.2. DONNÉES STOCKÉES DANS DES VECTEURS 121 Propositio 1 Das la recherche dichotomique, lors du p e appel récursif, ous avos : bs bi+1 2 p où est la taille de la portio du vecteur passé à la foctio lors du premier appel. Preuve. La preuve est par iductio sur la profodeur p des appels : Cas de base p = 0 Das ce cas, ous avos bs bi+1 =, et doc : est bie vérifié. = bs bi = Cas iductif p = l L hypothèse d iductio suppose qu o a passé u vecteur de taille au plus /2 l 1 lors du l 1 e appel. Autremet dit, lors du l 1 e appel, ous avos : bs bi+1 2 l 1. Lors du l e appel, o calcule m = bi + bs bi+1 2. Das le cas où T[m] < k, o effectue u appel récursif sur ue portio du vecteur de taille bs (m+1)+1 = bs m. E remplaçat m par sa valeur o obtiet ue taille de : bs bi+1 bs bi 2 Établissos maiteat que cette taille est bie iférieure à /2 l : bs bi bs bi+1 2 (bs bi+1) bs bi+1 (bs bi+1) bs bi+1 2 = bs bi Par HI 2 l 1 = 2 l La taille du vecteur passé au l e appel est doc bie de 2 l au maximum. Das le cas où T[m] > k, il est facile de voir que la taille du vecteur passé sera la même. Nous possédos doc maiteat ue bore supérieur sur la taille du vecteur passé à chaque appel récursif, et ous voyos que le ombre d élémets à cosidérer à chaque étape décroît expoetiellemet. Ceci ous permet de coclure que : Propositio 2 Appelée sur u tableau de, la recherche dichotomique effectue au plus log 2 ()+1 appels récursifs. Preuve. Comme la récursivité s arrête lorsque la taille du vecteur passé à la foctio est ulle, ous avos la garatie que la récursivité s arrêtera dès que la valeur /(2 k ) deviet < 1 (car la taille est écessairemet u etier). Cela arrive dès 2 k >. Le ombre maximum d appels récursifs est doc la plus petite valeur k telle que 2 k >. Il s agit doc de la plus petite valeur k telle que k > log 2 (). Le ombre d appels récursifs est doc au plus de log 2 ()+1. Ceci ous permet dès lors de coclure que :

122 122 CHAPITRE 7. ALGORITHMES DE RECHERCHE Théorème 6 La complexité de la recherche dichotomique est O(log()), où = bs bi + 1 est la taille du tableau T. Preuve. Par la Propositio 2, o sait qu au maximum log 2 () + 1 appels récursifs sot effectués. E comptat l appel «pricipal» (e d autres termes, l appel 0), il y a au maximum log 2 ()+2 exécutios de la foctio. Les traitemets propres à chaque appel sot e O(1). La complexité totale est doc e O(log 2 ()+2) = O(log()). Exemple 27 Sur l exemple de la Fig. 7.1, la valeur recherchée 53 est présete das le tableau. Quad la valeur est effectivemet présete das le tableau, le cas illustré est le plus défavorable, puisqu o est obligé de réduire l itervalle de recherche à ue seule case. De maière géérale, le pire cas se produit quad la valeur est pas présete : si o avait recherché 61, par exemple, ue itératio supplémetaire aurait été écessaire pour redre l itervalle de recherche vide. Sur cet exemple, le ombre d appels cofirme bie la théorie. E effet, log 2 (14)+ 2 5, 81, et le ombre d appels effectué est bie toujours 5, quelque soit la valeur k recherchée Tables de hachage Das les deux méthodes que ous avos présetées das les sectios précédetes, les valeurs V 1,...V de l esemble à représeter étaiet stockées das différetes cases d u tableau de taille. Par coséquet, chaque case du tableau coteait ue valeur, et il y avait doc pas de case iutilisée (pas de «trou» etre les cases). Cette méthode est clairemet la plus écoomique e mémoire. Néamois, si ous disposos de suffisammet de mémoire, ue méthode beaucoup plus simple cosiste à : 1. Calculer la valeur Max, qui est le maximum de V 1,...,V (autremet dit, Max est la valeur maximale que ous sommes susceptible de devoir stocker das la structure). 2. Déclarer u tableau H de boolées de taille Max, iitialisé de telle maière que toutes ses cases cotieet faux. 3. Mettre à vrai toutes les cases H[V i ] (pour tout 1 i ). O obtiet doc u tableau H tel que H[ j] est à vrai si et seulemet si la valeur j est présete das {V 1,...,V }. La costructio d ue telle table est e O(Max), mais la cosultatio se fait très facilemet e O(1), puisqu il suffit de tester si V[k] vaut vrai pour savoir si k est présete. Cette méthode semble doc très itéressate sur le pla du coût de la recherche. Malheureusemet elle est souvet iutilisable e pratique, e raiso de la taille de la table H. E effet, supposos que les valeurs à stocker sot des uméros de cartes d idetité belges. Ces uméros comportet 12 chiffres, ce qui peut être cosidéré comme petit. La valeur maximale est doc de l ordre de E supposat qu o utilise 1 bit par case de la table, o a besoi de plus octets pour stocker la table, soit plus de 2Go, et ce, quelque soit le ombre d iformatios stockée das la table... O voit doc que pour pouvoir utiliser cette idée e pratique, et cotiuer à exploiter le fait qu o peut accéder e O(1) à ue case d u tableau, il faut dimiuer la taille de la table. Supposos que ous admettios ue table H de taille N Max. Cette suppositio a deux implicatios :

123 7.2. DONNÉES STOCKÉES DANS DES VECTEURS O e peut plus faire correspodre chaque valeur V i à la case H[V i ]. Il faudra doc trouver ue foctio f : {V 1,...,V } {1,...,N} qui, pour chaque valeur V i idique la case de H à utiliser. Ue telle foctio sera appelée foctio de hachage. 2. Comme il y a mois de cases que de valeurs possibles, il sera parfois écessaire d associer plusieurs valeurs à ue même case. Autremet dit, comme Max N, il existera certaiemet des paires de valeurs différetes V i,v j telles que f(v i ) = f(v j ). Ce phéomèe est appelé collisio. Il faudra doc trouver ue maière de gérer ces collisios. Choix d ue foctio de hachage Le choix d ue foctio de hachage est u problème qui a été éormémet étudié, et la littérature sur le sujet est abodate. Nous allos ous coteter de doer ici quelques idées de base. Commeços par doer quelques propriétés qu ue boe foctio de hachage devrait satisfaire : 1. La foctio doit miimiser les collisios. E effet, la foctio qui evoie toute valeur sur 1 est ue foctio de hachage. Néamois, elle e permet pas ue boe répartitio des valeurs à stocker das la table, puisqu elles serot toutes associées à la première case. 2. La foctio doit être facile à calculer. Das le cas cotraire, o perdrait tout le bééfice de l accès direct des tableaux. De toute maière, la complexité de cette foctio doit être idépedate de la taille des doées (doc e O(1)). Par ailleurs, remarquos que toute foctio (au ses mathématique du terme) est détermiiste das le ses où, si f(v i ) f(v j ), alors V i V j. La clef de hachage est doc suffisate pour faire la différece etre deux valeurs. Nous avos déjà vu que l implicatio iverse est pas vrai : deux valeurs V i et V j peuvet doer lieu à la même valeur f(v i ) = f(v j ). E pratique, le choix d ue foctio de hachage déped grademet du type de doées à traiter. Das le cadre de ce cours, ous avos fait l hypothèse que les doées sot etières. Néamois, il peut s agir d autre type de doées, comme des chaîes de caractères. Voici deux exemples simples qui illustret la otio de foctio de hachage. Ue foctio de hachage pour les etiers positifs des etiers 0, la foctio : Si les valeurs cosidérées sot garatit ue valeur comprise etre 1 et N. f(x) = (x mod N)+1 Ue foctio de hachage pour les chaîes de caractères Écartos ous quelque peu des hypothèses du chapitre et cosidéros que les valeurs à traiter sot des chaîes de caractères de la forme S = α 1 α 2 α, où les α i sot les caractères de la chaîe. A de déir ue foctio de hachage pour ces doées, il est écessaire de covertir les chaîes e ombres etiers. Il faut doc associer à chaque caractère u ombre. Nous supposeros doc que ous disposos d ue foctio v qui reçoit u

124 124 CHAPITRE 7. ALGORITHMES DE RECHERCHE caractère et qui revoie le ombre associé à ce paramètre (e pratique, o peut simplemet predre le code ASCII, par exemple). Nous supposeros que la foctio revoie toujours des valeurs das l itervalle [0,...B 1], où B sera choisi suffisammet grad e foctio du ombre de caractères (par exemple 256 pour le code ASCII) Das ce cas, ue foctio de hachage pour les chaîes des caractères peut être : ) f(α 1 α 2 α ) = (( i=1v(α i+1 )B i 1 ) mod N ce qui reviet à voir la chaîe α 1 α 2 α comme le ombre v(α 1 )v(α 2 ) v(α ) e base B. Ce ombre est esuite coverti e base 10 (grâce à la somme), puis pris modulo N (o ajoute 1 puisqu o a supposé que les cases sot umérotées à partir de 1). Exemple 28 Cosidéros la chaîe Ð Ó. Les codes ASCII des différets caractères sot les suivats : 65 Ð Ó 111 O voit doc la chaîe comme le ombre e base 256 : = soit e base 10. Si ous supposos ue taille N = 101, ous obteos la positio das la table : f(algo) = ( mod 101)+1 = 50 Cette déitio pose malheureusemet des problèmes pratiques. Le premier est illustré par l exemple ci-dessus : pour la chaîe Ð Ó qui e fait que 4 lettres, la valeur i=1 v(α i+1)b i 1 est déjà très importate. Si o ajoute u à cette chaîe, o obtiet la valeur > Autat dire qu o dépasse rapidemet les valeurs maximales qu o peut stocker das ue variable etière e C ou C++... E pratique, o calcule la foctio de hachage de faço itérative, comme illustré à l Algorithme 44. O peut motrer (ce que ous e feros pas ici) que cette foctio calcule bie la déitio doée ci-dessus. Cette implémetatio a l avatage de e jamais stocker das r des valeurs plus grades que N, car o pred le modulo à chaque tour de boucle. Le secod problème potetiel proviet de la relatio qu il peut exister etre la valeur de N et la valeur de B. Supposos par exemple que N = B. Das cas, ous avos : ( i=1v(α i+1 )B i 1 ) mod N = v(α ) E effet, si u ombre est exprimé das ue base B, le reste de la divisio de ce ombre par B est simplemet so derier chiffre. Ue telle foctio de hachage est sûremet pas satisfaisate, puisqu elle e pred e compte que le derier caractère de la chaîe. Remarquos que des phéomèes similaires se produiset si N est ue puissace de B : si N = B l, ce sot les l deriers caractères de la chaîe seulemet qui sot pris e compte. Il faut doc veiller à ce que N et B soiet mutuellemet premiers etre eux (ce qui sigifie qu ils ot pas de diviseur commu, à part 1). E pratique, choisir u ombre premier pour la valeur de N est ue boe idée (comme 101 das l Exemple 28)

125 DONNÉES STOCKÉES DANS DES VECTEURS 125 Etier f (Chaie α 1 α 2 α ) Etier i = 1 ; Etier r = 0 ; tat que i faire r := ((r B)+α i ) mod N ; retourer r+1 ; Algorithme 44 : Le calcul efficace de la foctio de hachage sur les chaîes de caractères FIG. 7.2 Ue illustratio du hachage avec chaîage. Gestio des collisios Comme ous l avos vu, il arrive que deux valeurs à stocker soiet evoyées das le même élémet de la table. Nous devos doc trouver ue techique pour reteir, pour chaque élémet de la table, quelles sot les valeurs qui y ot été isérées. Ceci peut se faire aisémet e stockat das chaque élémet H[i] de la table la tête d ue liste costituée d élémets das lesquels o stocke les valeurs isérées à la positio i. Ces élémets serot doc de la forme : struct Elem Etier ifo ; Elem * ext ; Cette politique de gestio des collisio est appelée le hachage avec chaîage par référece aux listes chaîées qui y sot exploitées. Elle est illustrée à la Fig Fialemet, la table de hachage sera doc u vecteur Elem * H[N] de poiteurs iitialisé à NIL (iitialemet toutes les listes sot vides). O obtiet les foctios do-

126 126 CHAPITRE 7. ALGORITHMES DE RECHERCHE ées à l Algorithme 45 pour maipuler les tables de hachage das le cas où les doées sot des etiers. Ces foctios sot aisémet trasposables das les autres cas, comme les chaîes de caractères. Elles sot détaillées ci-dessous : IitHachage Cette foctio iitialise la table de hachage e créat des listes vides das toutes ses cases. Cette foctio est e O(N). IsertioHachage Cette foctio repère la positio p das la table correspodat à la clef j à l aide de la foctio de hachage f, et isère cette clef e tête de la liste dot la tête est e H[p]. Elle est doc e O(1) (e supposat que la foctio f est elle-même e O(1)). RechercheHachage Cette foctio booléee idique si la clef k est présete das la table H. Pour ce faire, elle doit simplemet rechercher la valeur j das la liste dot la tête est e H[ f(j)]. La complexité de cette foctio déped doc de la logueur de la liste à parcourir. Au pire cas, et si la foctio de hachage est de mauvaise qualité, toutes les iformatios sot stockées das la même case. Cette foctio est doc e O(). Néamois, si la foctio de hachage est «bie choisie», cette foctio est, e moyee, e O(1). Nous revoyos le lecteur à des ouvrages plus approfodis [4] pour les détails. IitHachage(Elem * H[N]) Etier i := 1 ; tat que i N faire ListeVide(H[i]) ; IsertioHachage(Elem * H[N], Etier j) Etier p := f(j) ; IsèreTête(H[p], j) ; Boolée RechercheHachage(Elem * H[N], Etier k) Etier p := f(k) ; Elem * q := Recherche(H[p], k) ; si q NIL alors retourer vrai ; sio retourer faux ; Algorithme 45 : La costructio et le recherche das ue table de hachage avec chaîage. E pratique, les tables de hachage sot extrêmemet efficaces, car la valeur (moyee) O(1) pour la recherche est tout à fait réaliste. Naturellemet, ue table de hachage reste u tableau, et est doc de taille fixée. Au fur et à mesure que la table se remplit, les performaces se dégradet, car les listes qui résolvet les collisios s alloget. Par ailleurs, redimesioer ue table de hachage est ue opératio coûteuse. Nous verros plus loi que les arbres biaires de recherche balacés offret l avatage d opé-

127 7.3. DONNÉES STOCKÉES DANS DES LISTES 127 ratios assez efficaces (e O(log()), où est le ombre de valeurs stockées), das ue structure dyamique. 7.3 Doées stockées das des listes Les foctios de recherche das ue liste, qu elle soit triée ou o, ot déjà été couvertes das le chapitre sur les listes. Nous revoyos doc le lecteur au Chapitre 4, et plus particulièremet aux Sectios et Cotetos ous de résumer ici les complexités obteues : 1. Das le cas des listes o triées : l isertio peut se faire e tête et est doc e O(1) par valeur isérée. La recherche est e O() au pire cas. 2. Das le cas des listes triées : l isertio triée est e O() par élémet iséré. O peut doc isérer les valeurs e O( 2 ) au pire cas, à l aide de la foctio IsertioTriée. O peut égalemet réaliser isertios e tête et effectuer esuite u tri e O(log()), ce qui fait O(log) au total. La recherche est égalemet e O() (bie qu elle soit e pratique u peu plus efficace que si la liste est pas triée). 7.4 Doées stockées das des arbres Cosidéros maiteat le cas où les doées à traiter sot stockées das u arbre. Nous allos cosidérer deux cas : le cas le plus gééral, où les doées étiquettet simplemet les œuds de l arbre, sas autre hypothèse ; et le cas où o a réparti les doées de maière à obteir u arbre biaire de recherche Parcours simple Supposos que ous ayos à otre dispositio u arbre A dot l esemble des œuds est N, et tel que {Λ() N} = {V 1,V 2,...,V } (c est-à-dire que les étiquettes des œuds sot exactemet les doées V 1,V 2,...V ). Das ce cas, ous avos pas d autre choix que de parcourir tout l arbre pour rechercher ue certaie iformatio k. Ce cas est doc similaire à celui recotré quad o maipulait u tableau ou ue liste o trié, et la structure d arbre apporte rie ici. Au pire cas, la complexité est doc e O(). Le choix du parcours peut quelque peu améliorer l efficacité e pratique. E effet, il vaut mieux arrêter la recherche dès que l iformatio est trouvée, ce qui sigifie que l iformatio stockée das u œuds doit être comparée à k dès que ce œud est recotré. O a doc itérêt à opter pour le parcours préfixé. L Algorithme 46 présete cette solutio. Nous abordos pas e détail la costructio d u tel arbre. Les foctios d isertio présetées à la Sectio peuvet être exploitées à cette. Remarquos que la forme de l arbre importe peu, puisqu o le parcourt toujours etièremet au pire cas (das le cas où l iformatio est pas présete). O peut doc très bie opter pour ue costructio où les ouveaux œuds sot toujours isérés à gauche du œud le plus profod. Das ce cas, o obtiet e fait ue liste (comme l arbre illustré à la Fig. 7.8).

128 128 CHAPITRE 7. ALGORITHMES DE RECHERCHE RechercheArbre(Nœud * A) si EstVide(A) alors retourer faux ; sio si A.ifo = k alors retourer vrai; sio si RechercheArbre(FilsGauche(A)) alors retourer vrai ; sio si RechercheArbre(FilsDroit(A)) alors retourer vrai ; Algorithme 46 : La recherche d ue iformatio k das u arbre Arbres biaires de recherche Il est possible d obteir des algorithmes de recherche plus efficaces das les arbres à coditio d ordoer les œuds de faço itelligete. Si ous examios à ouveau l Algorithme 46, ous costatos qu u certai gai pourrait être obteu s il était pas écessaire d effectuer u appel récursif sur les deux fils, mais seulemet sur u des deux (das le cas où l ifo est pas das la racie). Das ce cas, o pourrait espérer élimier à chaque étape la moitié de l arbre ecore iexplorée, e e passat e revue que l autre moitié (e faisat l hypothèse que les œuds sot répartis de faço équitable etre le sous-arbre gauche et le sous-arbre droit). Cela peut se faire à coditio qu il existe ue relatio etre, d ue part, l iformatio stockée das la racie d u arbre, et, d autres parts, les iformatios stockées das les œuds de ses fils. Pour ce faire, ous allos réutiliser l idée pricipale de la recherche dichotomique. Pour rappel, das cet algorithme, ous sélectioios à chaque étape ue case T[m] du vecteur (trié), et trois possibilités s offraiet à ous : 1. Soit T[m] = k ; 2. Soit T[m] > k, et la recherche devait cotiuer à gauche de T[m] ; 3. Soit T[m] < k, et la recherche devait cotiuer à droite de T[m]. L aalogie etre les arbres biaires et la recherche dichotomique devrait maiteat être claire : le premier cas correspod au cas où l iformatio stockée das la racie est l iformatio recherchée ; le secod correspod au cas où l o e cotiue la recherche que das le fils gauche ; et le troisième correspod au cas où l o e cotiue la recherche que das le fils droit. Naturellemet, pour que cet algorithme soit correct, il est écessaire que la recherche das u seul des deux fils ous garatisse de trouver l iformatio si elle est das l arbre. Das le cas de la recherche dichotomique, o pouvait certaiemet élimier ue partie du vecteur car toutes les cases à gauche de T[m] coteaiet des iformatios < T[m], et toutes celles à droites des iformatios > T[m]. Cette coditio doit doc être trasposée das le cadre des arbres biaires. O obtiet alors la déitio d arbre biaire de recherche (biary search trees e aglais abrégé e BST) : Déitio 10 L arbre vide est u arbre biaire de recherche. Si A est u arbre dot la racie est r, et dot les sous-arbres gauche et droit sot respectivemet A g et A d alors A est u arbre biaire de recherche ssi les quatre coditios suivates sot remplies :

129 DONNÉES STOCKÉES DANS DES ARBRES FIG. 7.3 U exemple d arbre biaire de recherche (équilibré). E poitillés, le chemi parcouru pour accéder à l iformatio Tout œud de A g est tel que Λ() Λ(r). 2. Tout œud de A d est tel que Λ() > Λ(r). 3. A g est u arbre biaire de recherche. 4. A d est u arbre biaire de recherche. Das la suite, ous abrégeros souvet arbre biaire de recherche e ABR. Exemple 29 U exemple d ABR est doé à la Fig Opératios sur les arbres biaires de recherche Maiteat que ous avos déi les ABR, ous pouvos passer e revue certaies opératios sur cette structure. Iformatios das l ordre croissat Regardos d abord commet ous pouvos extraire toutes les iformatios de l arbre das l ordre croissat. E effet, puisque l arbre a été costruit selo cet ordre, il doit être possible, état doé u arbre, de recostituer ue séquece V 1,V 2,...,V, qui est ue permutatio croissate (autremet dit «u tri») de V 1,V 2,...V. État doée la déitio d u ABR, il est clair que tous les œuds qui apparaisset das le sous arbre gauche d u arbre doé apparaîtrot das la séquece avat la racie de l arbre, qui apparaîtra elle-même avat les œuds du sous-arbre droit. Ceci ous suggère doc u algorithme récursif pour recostituer la séquece triée : 1. Si l arbre est vide, revoyer la séquece vide.

130 130 CHAPITRE 7. ALGORITHMES DE RECHERCHE FIG. 7.4 L ordre sur les œuds iduit par u arbre biaire de recherche (il s agit de l ordre du parcours ifixe). 2. Sio, costruire la séquece qui correspod au sous-arbre gauche, ajouter à sa l étiquette de la racie de l arbre, puis la séquece qui correspod au sousarbre droit. O voit doc que l ordre adéquat est e fait l ordre ifixe (voir les Algorithmes 32 et 34). Ceci est illustré par la Fig Recherche La recherche das u ABR suit directemet ce que ous avos préseté ci-dessus. État doé u arbre A, il y a quatre possibilités : 1. Soit l arbre A est vide, et l iformatio est pas présete. 2. Soit l arbre A est pas vide, et l iformatio est das sa racie. 3. Soit l arbre A est pas vide et l iformatio recherchée est plus petite que sa racie. Il faut alors effectuer la recherche das le sous-arbre gauche. 4. Soit l arbre A est pas vide et l iformatio recherchée est plus grade que sa racie. Il faut alors effectuer la recherche das le sous-arbre droit. Cet algorithme est correct par la déitio d u ABR. Nous avos égalemet la garatie qu il termie car o effectue toujours u appel récursif sur u arbre de hauteur plus petite. Il est doé à l Algorithme 47.

131 7.4. DONNÉES STOCKÉES DANS DES ARBRES 131 Boolée RechercheABR(Nœud * A), Etier k si EstVide(A) alors retourer faux ; sio si IfoRacie(A) = k alors retourer vrai ; sio si IfoRacie(A) > k alors retourer RechercheABR(FilsGauche(A), k) ; sio retourer RechercheABR(FilsDroit(A), k) ; Algorithme 47 : La recherche das u ABR : versio récursive. Il est facile de voir que cet algorithme e réalise pas u parcours de tout l arbre, mais costruit u chemi das l arbre, partat de la racie, et arrivat das le œud recherché (s il existe). Le chemi e questio est la séquece des œuds sur lesquels les appels récursifs successifs sot effectués. La Fig. 7.3 illustre cela : o appelle la foctio sur la racie, ce qui doe lieu à u appel récursif sur 22, puis sur 25, et e 23, auquel cas o retoure vrai. Cette costatatio ous permet d obteir aisémet u algorithme itératif qui réalise la recherche (voir Algorithme 48). Celui-ci maitiet, à tout momet, u poiteur p vers u œud de l arbre. Iitialemet p poite vers la racie. p est esuite déplacé vers le œud qui est à la racie de l arbre sur lequel l appel récursif aurait été effectué das la versio récursive de l algorithme. O déplace doc p sur le fils gauche si la racie cotiet ue iformatio plus grade que l iformatio k recherchée, et sur le fils droit das le cas cotraire. Ce déplacemet s arrête dès que p poite vers u œud qui cotiet l iformatio recherchée, ou si p est NIL. Boolée RechercheABR(Nœud * A), Etier k Nœud * p := A ; tat que EstVide(p) et IfoRacie(p) k faire si p.ifo > k alors p := FilsGauche(p) ; sio p := FilsDroit(p) ; si EstVide(p) alors retourer faux ; sio retourer vrai ; Algorithme 48 : La recherche das u ABR : versio itérative. Isertio L isertio das u arbre biaire de recherche suit le même pricipe que la recherche. E effet, le cas de base correspodat à l arbre vide est simple à traiter : o crée tout simplemet u ouveau œud qui fera office de racie et qui reçoit l iformatio à isérer. Les cas récursifs suivet égalemet la logique de l ABR que ous avos déjà recotrée das la recherche : si l iformatio à isérer est à la racie, o doit

132 CHAPITRE 7. ALGORITHMES DE RECHERCHE C h e m i s u i v i p o u r l ' i s e r t i o d e 1 1 C h e m i s u i v i p o u r l ' i s e r t i o d e 7 FIG. 7.5 Deux isertios das u ABR. Les chemis suivis sot idiqués e poitillés. Les comparaisos réalisées sot idiquées le log des chemis, à côté des œuds cocerés. réaliser l isertio das le sous-arbre gauche. Sio, o doit réaliser l isertio das le sous-arbre droit. Il faut simplemet predre garde à ce que l isertio das u sous-arbre peut modifier la racie de ce sous-arbre, au cas où celui-ci est vide. O peut gérer cela aisémet e passat la racie par référece. Cette procédure est doée à l Algorithme 49 et illustré à la Fig E observat attetivemet la Fig. 7.5, o costate deux choses : 1. Comme la recherche, cet algorithme costruit u chemi das l arbre, partat de la racie, et arrivat das ue feuille. 2. L isertio cosiste toujours à ajouter u ouveau fils à u œud. L isertio cosiste doc toujours à créer ue ouvelle feuille. Ces observatios ous amèet tout aturellemet à ue versio itérative de l algorithme d isertio. Celui-ci procède de faço similaire à l Algorithme 48 : il maitiet u poiteur qui doit repérer le œud auquel o viedra ajouter u fils coteat l iformatio à isérer. Pour ce faire, il parcourt u chemi das l arbre partat de la racie.

133 7.4. DONNÉES STOCKÉES DANS DES ARBRES 133 IsertioABR(Nœud * & A, Etier k) si EstVide(A) alors CréerRacie(A, k) ; sio si IfoRacie(A) k alors IsertioABR(A.fg, k) ; sio IsertioABR(A.fd, k) ; Algorithme 49 : L isertio das u ABR : versio récursive. Das le cas où le œud vers lequel p poite a ue étiquette à l iformatio à isérer, o a deux possibilités : 1. Soit possède u fils gauche, et il faut alors faire poiter p vers ce fils gauche. 2. Soit e possède pas de fils gauche, et o peut alors créer u fils gauche coteat l iformatio à isérer. Das le cas où a ue étiquette < à l iformatio à isérer, o procède de faço similaire das le fils droit. IsertioABR(Nœud * & A, Etier k) Nœud * p ; Boolée ; si EstVide(A) alors CréerRacie(A, k) ; sio p := A ; := faux ; tat que faire si IfoRacie(p) k alors si EstVide(FilsGauche(p)) alors IsèreGauche(p, k) ; := vrai ; sio p := FilsGauche(p) ; sio si EstVide(FilsDroit(p)) alors IsèreDroite(p, k) ; := vrai ; sio p := FilsDroit(p) ; Algorithme 50 : L isertio das u ABR : versio itérative. Suppressio L opératio de suppressio d ue iformatio das u ABR est u peu particulière, et mérite qu o s y attarde quelques istats. État doé ue iformatio

134 134 CHAPITRE 7. ALGORITHMES DE RECHERCHE k à supprimer de l arbre, il faut d abord repérer le œud qui cotiet cette iformatio 4. Cela peut se faire de maière similaire à la recherche, e parcourat u chemi das l ABR. Esuite, il faut effacer le œud aisi trouvé, ce qui sépare l arbre e trois parties : le sous-arbre gauche de ; so sous-arbre droit et le reste de l arbre. Il faut doc «recoller les morceaux», et c est là toute la difficulté de la suppressio. Commeços par les cas les plus simples : 1. Si est ue feuille, a pas de sous-arbres gauche ou droit, et la suppressio est doc termié dès que a été effacé. Cette situatio est représetée à la Fig. 7.6 (a). 2. Si e possède qu u seul sous-arbre, il suffit de remplacer par la racie de ce sous-arbre. Cette situatio est représetée à la Fig. 7.6 (b). Le cas le plus délicat est celui où possède deux sous-arbres o-vides. Quel œud va-t-o choisir pour remplacer? La répose ous est doée e cosidérat l ordre aturellemet iduit par l arbre sur ses œuds, qui correspod à l ordre ifixe (cfr. Fig. 7.4) : il faut sélectioer u œud qui permet de coserver cet ordre. Ceci correspod sélectioer u œud qu o va prélever soit das le sous-arbre gauche, soit das le sous-arbre droit de ; et dot l étiquette est à la fois plus grade que ou égale à toutes les étiquettes des œuds du sous-arbre gauche, et plus petite que toutes les étiquettes des œuds du sous-arbre droit. Deux œuds répodet à cette propriété : soit le œud qui précède directemet das l ordre ifixe (c est-à-dire le plus grad œud du sous-arbre gauche de ) ; soit le œud qui suit directemet das l ordre ifixe (c est-à-dire le plus petit œud du sous-arbre droit de ). Le choix est idifféret. Exemple 30 Sur l arbre de la Fig. 7.6 (c), l ordre ifixe est : H, D, K, I, B, E, J, A, F, C, G. Si o supprime B, o aimerait doc obteir u arbre représetat l ordre H, D, K, I, E, J, A, F, C, G. O peut cosidérer que cela reviet à supprimer B et à le remplacer soit par I (le maximum du sous-arbre gauche de B), soit par E (le miimum du sous-arbre droit de B) L avatage de cette procédure est que le maximum du sous-arbre gauche (le miimum du sous-arbre droit) d u œud est aisé à obteir : il s agit du œud le plus à droite (à gauche) das so sous-arbre gauche (droit). Das l agorithme de suppressio que ous allos préseter, ous choisiros de remplacer u œud par le plus grad œud de so sous-arbre gauche. Nous allos doc commecer par doer la foctio ExtraireMaxABR, qui réalise u parcours d u arbre pour repérer le œud qui porte l iformatio maximale das cet arbre. Il détache alors ce œud de l arbre et revoie u poiteur vers ce œud. A de pouvoir détacher u œud, il est écessaire d avoir u poiteur vers le père de ce œud (s il existe). C est le but du poiteur q, utilisé das la boucle de parcours. Ce poiteur respecte à tout momet la propriété suivate (il s agit d u ivariat de la boucle) : q = NIL p est la racie de l arbre q NIL q est le père de p À la de la boucle qui recherche le maximum de l arbre, o a doc la garatie que : 4 Si plusieurs œuds cotieet cette même iformatio k, il coviedra d effectuer plusieurs fois l opératio de suppressio.

135 7.4. DONNÉES STOCKÉES DANS DES ARBRES 135 A B F D E C A B D E C A B F D E C H I G J A B F D E C A B D E F A I F D E C H G J ( a ) ( b ) ( c ) K K FIG. 7.6 Ue illustratio des trois cas de suppressio das u ABR. Le œud à supprimer est idiqué e grisé.

136 CHAPITRE 7. ALGORITHMES DE RECHERCHE FIG. 7.7 Le maximum das u arbre biaire de recherche (idiqué e gris) et l arbre obteu après le détachemet de ce œud (le fils gauche du œud a remoté). 1. p poite vers le maximum de l arbre. 2. Si p est pas la racie, q poite vers le père de p. Autremet, q vaut NIL. 3. Si q est pas NIL, p est le fils droit de q. 4. p a pas de fils droit (sio, il e serait pas le maximum), mais a peut-être u fils gauche. Comme p peut ecore avoir u fils gauche, il suffit maiteat de remplacer, das l arbre, p par so fils gauche. Cela se fait e modifiat, soit le fils droit de q (si celui-ci est pas NIL), soit la racie. Cette procédure est illustré à la Fig Nœud * ExtraireMaxABR(Nœud * & A) Nœud * p := A, q := NIL ; tat que FilsDroit(p) NIL faire q := p ; p := FilsDroit(p) ; si q = NIL alors A := FilsGauche(p) ; sio q.fd := FilsGauche(p) ; p.fg := NIL ; p.fd := NIL ; retourer p ; Algorithme 51 : U algorithme pour extraire le maximum d u arbre. Il reçoit u arbre o-vide et revoie u poiteur vers le œud coteat l iformatio maximale. Ce œud est détaché de l arbre. Nous pouvos maiteat doer l algorithme de suppresio (cfr. Algorithme 52). Il cosiste e les étapes suivates :

CHAPITRE IV. Rappels et compléments sur les suites

CHAPITRE IV. Rappels et compléments sur les suites CHPITRE IV Rappels et complémets sur les suites SUITES NUMÉRIQUES 1 Sommaire I Notio de suite...................................... 30 Exemples.......................................... 30 B Défiitio..........................................

Plus en détail

Chapitre 3: La démonstration par récurrence

Chapitre 3: La démonstration par récurrence CHAPITRE 3 DEMONSTRATION PAR RECURRENCE 33 Chapitre 3: La démostratio par récurrece 3. U exemple pour compredre le pricipe Itroductio : Pour découvrir ue formule doat la somme des premiers ombres impairs,

Plus en détail

Algo 2 Exercice corrigé. Complexité en moyenne du MergeSort et du QuickSort

Algo 2 Exercice corrigé. Complexité en moyenne du MergeSort et du QuickSort Exercice corrigé Complexité e moyee du MergeSort et du QuickSort Exercice 1. O rappelle que les complexités e pire cas de l algorithme de tri-fusio ( MergeSort, J. vo Neuma 1945) et de l algorithme de

Plus en détail

Chapitre 2 : Raisonnement par récurrence, manipulation de sommes.

Chapitre 2 : Raisonnement par récurrence, manipulation de sommes. ECS1B Carot Chapitre 013/014 Chapitre : Raisoemet par récurrece, maipulatio de sommes Objectifs : Écrire propremet u raisoemet par récurrece (simple, double Maipuler les symboles Σ et sas erreur ceci viedra

Plus en détail

question-type-bac.fr

question-type-bac.fr BAC S 4 Mathématiques - Frace métropole Eseigemet spécifique et de spécialité Ce documet est bie plus qu u simple corrigé de sujet de baccalauréat. Grâce aux solutios claires et détaillées, aux démarches

Plus en détail

Dénombrement. Chapitre 1. Objectifs du chapitre. 1.1 Entiers naturels et raisonnement par récurrence

Dénombrement. Chapitre 1. Objectifs du chapitre. 1.1 Entiers naturels et raisonnement par récurrence Chapitre 1 Déombremet Objectifs du chapitre 1. A travers l axiomatisatio de Peao de N, rappeller les pricipes de récurrece forte et faible. 2. Défiir la otio de cardial et les opératios sur les cardiaux.

Plus en détail

TD d algorithmique avancée Corrigé du TD 2 : récursivité

TD d algorithmique avancée Corrigé du TD 2 : récursivité TD d algorithmique avacée Corrigé du TD : récursivité Jea-Michel Dischler et Frédéric Vivie Suite de Fiboacci La suite de Fiboacci est défiie comme suit : 1 si = 0 Fib() = 1 si = 1 Fib( 1) + Fib( ) sio.

Plus en détail

I) Suites arithmétiques

I) Suites arithmétiques CHAPITRE 9 Suites arithmétiques et géométriques Capacités au programme : Modéliser et étudier ue situatio à l aide des suites. Mettre e œuvre des algorithmes permettat : d obteir ue liste de termes d ue

Plus en détail

TS Exercices sur les limites de suites (1)

TS Exercices sur les limites de suites (1) TS Exercices sur les limites de suites () Soit u ue suite géométrique de premier terme u 0 et de raiso q. Das chacu des cas suivats, doer la limite de la suite u. ) u0 ; q ) u 0 ; q ) 0 4 ) u0 6 ; q )

Plus en détail

Fiche 8 : Fonctions II. Limites

Fiche 8 : Fonctions II. Limites Uiversité Paris-Est Val-de-Mare Créteil DAEU-B Fiche 8 : Foctios II. Limites Das la fiche 7 "Foctios I", o a vu la défiitio d ue foctio et différetes otios afféretes. E particulier, o a travaillé sur le

Plus en détail

ESD 20163c_04 : Différents types de raisonnement

ESD 20163c_04 : Différents types de raisonnement ESD 2013c_04 : Différets types de raisoemet 1. Le sujet A. L exercice proposé au cadidat O cosidère la suite défiie pour tout apparteat à N par : u = 4u 3 avec u + 1 + 1. Dire si les affirmatios suivates

Plus en détail

Auteur : Simplice TANKOUA Activités de mise en place de la leçon.

Auteur : Simplice TANKOUA Activités de mise en place de la leçon. Auteur : Simplice TANKOUA (stakoua@yahoofr) Cours SUITES NUMÉRIQUES Leço : GÉNÉRALITÉS SUR LES SUITES Activités de mise e place de la leço Activité : (formule explicite) Exercice O cosidère la liste ordoée

Plus en détail

TD1. Dénombrements, opérations sur les ensembles.

TD1. Dénombrements, opérations sur les ensembles. Uiversité Pierre & Marie Curie Licece de Mathématiques L3 UE LM345 Probabilités élémetaires Aée 2014 15 TD1. Déombremets, opératios sur les esembles. 1. Combie de faços y a-t-il de classer 10 persoes à

Plus en détail

SUITES et SERIES DE FONCTIONS

SUITES et SERIES DE FONCTIONS UE7 - MA5 : Aalyse SUITES et SERIES DE FONCTIONS I Suites de foctios à valeurs das È ou  Etat doé u esemble E, ue suite de foctios umériques défiies sur E est la doée, pour tout etier, d'ue applicatio

Plus en détail

L2PC et Cycles. Mathématiques: SERIES et INTEGRALES Cours Elisabeth REMM

L2PC et Cycles. Mathématiques: SERIES et INTEGRALES Cours Elisabeth REMM FACULTE DES SCIENCES ET TECHNIQUES. UHA MULHOUSE L2PC et Cycles. Mathématiques: SERIES et INTEGRALES Cours Elisabeth REMM Chapitre 2 Séries etières Cotets. Gééralités sur les séries etières 2.. Défiitio

Plus en détail

Chapitre 4: Croissance, divergence et convergence des suites

Chapitre 4: Croissance, divergence et convergence des suites CHAPITRE 4 CROISSANCE ET CONVERGENCE 43 Chapitre 4: Croissace, divergece et covergece des suites 4.1 Quelques défiitios Défiitios : Ue suite est croissate si chaque terme est supérieur ou égal à so précédet

Plus en détail

LES SUITES. u n = 1 n, pour n 1. u n = n 3

LES SUITES. u n = 1 n, pour n 1. u n = n 3 LES SUITES. Défiitio.. Défiitio Ue suite umérique est ue foctio de das, défiie à partir d'u certai rag 0. La otatio (u ) désige la suite e tat qu'objet mathématique et u désige l'image de l'etier (appelé

Plus en détail

Chapitre 2. Rappels sur les suites arithmétiques et les suites géométriques

Chapitre 2. Rappels sur les suites arithmétiques et les suites géométriques Chapitre Rappels sur les suites arithmétiques et les suites géométriques Nous allos ici rappeler les différets résultats sur les suites de ombres réels qui sot des suites arithmétiques ou des suites géométriques

Plus en détail

Fiche 2 : Les fonctions

Fiche 2 : Les fonctions Nº : 300 Fiche : Les foctios Calculer des limites O commece par aalyser f (). Peut o directemet appliquer l u des théorèmes du cours (limites et opératios, théorèmes de comparaiso)? Das la égative, il

Plus en détail

Leçon 9 Les suites réelles

Leçon 9 Les suites réelles Leço 9 Les suites réelles C est ue leço importate qui se prologera e termiale et souvet, il y a u exercice à faire au BAC sur les suites. Il est très importat de bie compredre au début les otatios., 5,8

Plus en détail

La plage. Par Arnauld HECQUET, Raphaël SIMONET DAVIN, Maxime LOUIS. Élèves de Seconde au Lycée MONTAIGNE de BORDEAUX. Année 2008.

La plage. Par Arnauld HECQUET, Raphaël SIMONET DAVIN, Maxime LOUIS. Élèves de Seconde au Lycée MONTAIGNE de BORDEAUX. Année 2008. La plage Par Arauld HECQUET, Raphaël SIMONET DAVIN, Maime LOUIS. Élèves de Secode au Lycée MONTAIGNE de BORDEAUX. Itro : présetatio du sujet Partie I : la pièce Techique de comptage Aée 2008 Le ombre total

Plus en détail

Raisonnements Mathématiques

Raisonnements Mathématiques Chapitre 1 Raisoemets Mathématiques Le mathématicie italie Giuseppe Peao était très soucieux d exposer les mathématiques das u cadre précis et rigoureux. Das so Formulaire mathématique publié e 1895, il

Plus en détail

CONVERGENCE ET APPROXIMATION

CONVERGENCE ET APPROXIMATION 11-2- 2010 J.F.C. Cov. p. 1 CONVERGENCE ET APPROXIMATION I CONVERGENCE EN PROBABILITÉ 1. Défiitio 2. Ue coditio suffisate de covergece e probabilité 3. La loi faible des grads ombres 4. Ue coséquece de

Plus en détail

Probabilités, MATH 424 Feuille de travaux dirigés 2. Solutions.

Probabilités, MATH 424 Feuille de travaux dirigés 2. Solutions. Probabilités, MATH 44 Feuille de travaux dirigés. Solutios. 1 Exercices Exercice 1. O jette trois dés o pipés. 1. Calculer la probabilité d obteir au mois u 1.. Que vaut la probabilité d obteir au mois

Plus en détail

Questions de cours. tend vers 0, alors que la série harmonique 1. v n = ln n La série u n est convergente, et la série [ ( )]

Questions de cours. tend vers 0, alors que la série harmonique 1. v n = ln n La série u n est convergente, et la série [ ( )] PC - DS N 6 - U corrigé Questios de cours QC..a L assertio a. est fausse. Par exemple, la suite + ted vers 0, alors que la série harmoique + est divergete. QC..b L assertio b. est vraie. Supposos que la

Plus en détail

Chapitre 1 METHODES SUR LES SUITES

Chapitre 1 METHODES SUR LES SUITES Chapitre 1 METHODES SUR LES SUITES Nous allos voir commet : 1) Cojecturer le comportemet d ue suite ) Raisoer par récurrece 3) Utiliser les suites arithmétiques et géométriques 4) Étudier le comportemet

Plus en détail

Raisonnements mathématiques

Raisonnements mathématiques Chapitre 1 Raisoemets mathématiques Le mathématicie italie Giuseppe Peao était très soucieux d exposer les mathématiques das u cadre précis et rigoureux Das so Formulaire mathématique publié e 1895, il

Plus en détail

Séries entières. Plan de cours

Séries entières. Plan de cours 5 Séries etières «U mathématicie qui est pas aussi quelque peu poète e sera jamais u mathématicie complet.» Extrait d ue lettre de Karl Weierstrass à Sophie Kowalevski (883) Pla de cours I Rayo de covergece

Plus en détail

Loi binomiale. Loi de Bernoulli

Loi binomiale. Loi de Bernoulli Loi biomiale Loi de Beroulli O s itéresse ici à la réalisatio ou o d u évéemet. Autremet dit, o étudie les expérieces aléatoires qui ot que deux issues possibles : Obteir Pile ou Face Doer aissace à u

Plus en détail

Opérations sur les variables aléatoires Lois limites

Opérations sur les variables aléatoires Lois limites Opératios sur les variables aléatoires Lois limites A. Idépedace de deux variables aléatoires. Exemple 1. Pour améliorer le stockage d u produit u supermarché fait ue étude sur la vete de packs de 6 bouteilles

Plus en détail

Équirépartition presque sûre pour f (x) = 2x modulo 1 Jean-Baptiste Bardet 26 mai 2005

Équirépartition presque sûre pour f (x) = 2x modulo 1 Jean-Baptiste Bardet 26 mai 2005 Équirépartitio presque sûre pour f (x) = x modulo 1 Jea-Baptiste Bardet 6 mai 005 O étudie le comportemet des suites défiies par récurrece x = f (x 1 ) = f (x), où x 0 = x [0;1) et f (x) = x mod 1, et

Plus en détail

P(n) : quelque soit n entier naturel : n 3 = ( n) 2. P(n 0 ) est vraie (initialisation).

P(n) : quelque soit n entier naturel : n 3 = ( n) 2. P(n 0 ) est vraie (initialisation). T ale S Chapitre. Résumé page 3.. Pricipe de récurrece. a. Exemple. 3 + 3 = + 8 = 9 = ( + ) 3 + 3 + 3 3 = + 8 + 7 = 36 = ( + + 3) O voudrait démotrer la propriété géérale : P() : quelque soit etier aturel

Plus en détail

Numéro de la dernière page : 10 Titre : Problèmes de Poids

Numéro de la dernière page : 10 Titre : Problèmes de Poids page Numéro de la derière page : 10 Titre : Degrés : 1e - 4e du Collège PR, 1e - 3e de l ECG Durée : 45 miutes Résumé : Cette activité aborde la comparaiso d objets sas passer par leur mesure. Il s agit,

Plus en détail

Chapitre 8 : Séries. Introduction. 1 Dénitions. ECE3 Lycée Carnot. 2 décembre 2010

Chapitre 8 : Séries. Introduction. 1 Dénitions. ECE3 Lycée Carnot. 2 décembre 2010 Chapitre 8 : Séries ECE3 Lycée Carot 2 décembre 200 Itroductio Reveos pour itroduire ce chapitre quelques siècles e arrière, au temps de Zéo d'élée, philosophe grec du ciquième siècle avat J-C. Celui-ci

Plus en détail

FRLT Page 1 15/08/2014

FRLT Page 1 15/08/2014 Algorithmes à aalyser O cosidère l algorithme : - u est du type ombre - q est du type ombre - p est du type ombre - S est du type ombre - Lire u - Lire q - Lire p - S pred la valeur de u - Tat que (u >

Plus en détail

1 ère S Exercices sur le schéma de Bernoulli (1)

1 ère S Exercices sur le schéma de Bernoulli (1) ère Exercices sur le schéma de Beroulli () 8 Le chevalier de Méré, philosophe et homme de lettres, pose le problème suivat au mathématicie Blaise ascal : «Qu est-ce qui est le plus probable : obteir au

Plus en détail

2. Correction : Limites, continuité, dérivabilité

2. Correction : Limites, continuité, dérivabilité Correctio : Limites, cotiuité, dérivabilité Exercices de base U algorithme a est la valeur de la variable x pour laquelle o cherche ( x ), p est la précisio utilisée das le calcul : plus o avace das la

Plus en détail

Exercice 1-5 points - Pour tous les élèves Une nouvelle attraction est ouverte dans un grand parc. Pour tout entier non nul n, on note p

Exercice 1-5 points - Pour tous les élèves Une nouvelle attraction est ouverte dans un grand parc. Pour tout entier non nul n, on note p ermiale S - Bac blac de mathématiques Mars 6 Les calculatrices sot autorisées mais celles-ci e doivet être i échagées i prêtées durat l épreuve. Les quatre exercices serot rédigés sur ue feuille double

Plus en détail

Fiche Diagonalisation des Matrices 2x2

Fiche Diagonalisation des Matrices 2x2 Fiche Diagoalisatio des Matrices x MOSE 1003 4 Septembre 014 Table des matières Motivatio, puissaces d ue matrice 1 Diagoalisatio Vérificatio avec Scilab 3 Puissace 4 Motivatio, puissaces d ue matrice

Plus en détail

SUITES NUMERIQUES. q n. pour q. n + Une suite numérique est une fonction associant à tout nombre entier naturel n, un nombre réel u(n) : u :

SUITES NUMERIQUES. q n. pour q. n + Une suite numérique est une fonction associant à tout nombre entier naturel n, un nombre réel u(n) : u : SUITES NUMERIQUES Coteus : Capacités attedues : Commetaires : Suites Limite d ue suite défiie par so terme gééral Notatio lim u Suites géométriques : - somme de termes cosécutifs d ue suite géométrique

Plus en détail

Statistiques à deux variables

Statistiques à deux variables Statistiques à deux variables. Approche des séries statistiques à deux variables.. Nuage de poits Sur ue classe de BTSA, le professeur a relevé les moyees de élèves e mathématiques et e agroomie. Les otes

Plus en détail

SUITES NUMERIQUES. Archimède a défini dans les années 220 avant J.-C. deux suites permettant d'obtenir de très bonnes valeurs approchées de π.

SUITES NUMERIQUES. Archimède a défini dans les années 220 avant J.-C. deux suites permettant d'obtenir de très bonnes valeurs approchées de π. Quelques repères historiques SUITES NUMERIQUES Archimède a défii das les aées 220 avat J.-C. deux suites permettat d'obteir de très boes valeurs approchées de π. Héro d'alexadrie au premier siècle après

Plus en détail

Conservatoire National des Arts et Métiers 292 rue Saint-Martin PARIS Cedex 03. Équipe pédagogique «Statistique et Bioinformatique»

Conservatoire National des Arts et Métiers 292 rue Saint-Martin PARIS Cedex 03. Équipe pédagogique «Statistique et Bioinformatique» Coservatoire Natioal des Arts et Métiers 292 rue Sait-Marti 75141 PARIS Cedex 03 0 Équipe pédagogique «Statistique et Bioiformatique» Corrigé de l exame du 4 février 2016 TITRE DE L ENSEIGNEMENT : Iitiatio

Plus en détail

Solutions de Laurent Chéno (Lycée Dorian, Paris 11 e ), Michel Lafond (Dijon), Jean Lefort (Wintzenheim), Joël Payen (Gagny), Sophie Toursel (Lycée

Solutions de Laurent Chéno (Lycée Dorian, Paris 11 e ), Michel Lafond (Dijon), Jean Lefort (Wintzenheim), Joël Payen (Gagny), Sophie Toursel (Lycée Solutios de Lauret Chéo (Lycée Doria, Paris 11 e ), Michel Lafod (Dijo), Jea Lefort (Witzeheim), Joël Paye (Gagy), Sophie Toursel (Lycée Fourcade, Gardae) Plusieurs lecteurs otet l ambiguïté de la uestio

Plus en détail

Partie A : z x. z =( z ) = 4 = - 4 donc z est aussi solution de (E) Partie C :

Partie A : z x. z =( z ) = 4 = - 4 donc z est aussi solution de (E) Partie C : Corrigé baccalauréat S Polyésie 200 (raiateabac.blogspot.com) EXERCICE (5 poits) Pré-requis : z a + bi et _ z a bi Partie A : a ) E posat z a + bi et z a + b i o obtiet : z x z (a + bi) ( a + b i) aa bb

Plus en détail

Séries numériques. 1 q n+1 1 q. si q 1 ; n + 1 si q = 1. q k = k=0. , posons U n = k. α. k=1

Séries numériques. 1 q n+1 1 q. si q 1 ; n + 1 si q = 1. q k = k=0. , posons U n = k. α. k=1 Séries umériques Défiitios et premières propriétés. Défiitios Défiitio (Série umérique) Soit () N ue suite complexe. Pour tout N o pose : U = ( ème somme partielle). La suite (U ) N est alors appelée la

Plus en détail

APPROXIMATION DES GAMMES MUSICALES

APPROXIMATION DES GAMMES MUSICALES Simo Rousseau APPROXIMATION DES GAMMES MUSICALES SOMMAIRE I. PRÉLIMINAIRES MUSICAUX...3 1. LES INTERVALLES...3. LA CONSONANCE...4 3. LES NOTES...5 II. LA GAMME DE PYTHAGORE...6 1. ALGORITHME DE CONSTRUCTION...6.

Plus en détail

Tests. Chapitre 2. 1 Principe d un test Définitions Méthode générale... 3

Tests. Chapitre 2. 1 Principe d un test Définitions Méthode générale... 3 Tests Chapitre Table des matières 1 Pricipe d u test 1 11 Défiitios 1 Méthode géérale 3 Test de coformité à u paramètre 3 1 Test de coformité à ue moyee 3 Test de coformité à ue proportio 4 3 Test d homogééité

Plus en détail

Chapitre 9 La loi binomiale

Chapitre 9 La loi binomiale A) Variables aléatoires 1) Défiitio Chapitre 9 La loi biomiale O appelle variable aléatoire X ue foctio qui associe à tout résultat (évéemet élémetaire) u ombre réel. Pour ue même expériece aléatoire,

Plus en détail

MVA101 - Analyse et calcul matriciel T. Horsin

MVA101 - Analyse et calcul matriciel T. Horsin MVA101 - Aalyse et calcul matriciel 2012 2013 T. Horsi (thierry.horsi@cam.fr) Attetio: Ce documet est ue base de travail qui peut coteir des coquilles. Les zoes e bleus sot, de loi, hors programme, et

Plus en détail

Chapitre H6 : MESURES ET INCERTITUDES. Thème 1 : HABITAT. Sous-thème : Mesures et incertitudes Compétences attendues

Chapitre H6 : MESURES ET INCERTITUDES. Thème 1 : HABITAT. Sous-thème : Mesures et incertitudes Compétences attendues Thème : HABITAT Sous-thème : Mesures et icertitudes Chapitre H6 : MESURES ET INCERTITUDES. Notios et Coteus Erreurs et otios associées Thème 1 : HABITAT. Sous-thème : Mesures et icertitudes Compéteces

Plus en détail

Partie A Partie entière, partie décimale d un réel

Partie A Partie entière, partie décimale d un réel TS spé Algorithmes liés à la divisibilité et à la divisio euclidiee Partie A Partie etière, partie décimale d u réel I. Partie etière d u réel 1 ) Défiitio Pla du chapitre Partie A : Partie etière, partie

Plus en détail

Laurent Garcin MPSI Lycée Jean-Baptiste Corot. u k

Laurent Garcin MPSI Lycée Jean-Baptiste Corot. u k SÉRIES NUMÉRIQUES K désige le corps R ou C. Gééralités. Défiitios Défiitio. Série Soit (u ) 0 ue suite umérique (i.e. à valeurs das K). O appelle série de terme gééral u la suite (S ) 0 où 0, S = u k Cette

Plus en détail

Suites de variables aléatoires.

Suites de variables aléatoires. Uiversité Pierre et Marie Curie 200-20 Probabilités et statistiques - LM345 Feuille 8 Suites de variables aléatoires.. Soit Ω, F, P u espace de probabilités. Détermier pour chacue des covergeces suivates

Plus en détail

est dite arithmétique lorsqu il existe un nombre réel r (appelé raison) tel que, pour tout n de, on ait : un+ 1 = un

est dite arithmétique lorsqu il existe un nombre réel r (appelé raison) tel que, pour tout n de, on ait : un+ 1 = un LGL Cours de Mathématiques 007 C Suites arithmétiques ) Défiitio Défiitio 3 : Ue suite ( ) u est dite arithmétique lorsqu il existe u ombre réel r (appelé raiso) tel que, pour tout de, o ait : u+ = u +

Plus en détail

Méthode de Schwarz optimisé appliquée au problème de Helmholtz

Méthode de Schwarz optimisé appliquée au problème de Helmholtz DEA de Mathématiques Uiversité Claude Berard de Lyo Aée uiversitaire : 003/004 Méthode de Schwarz optimisé appliquée au problème de Helmholtz Etude de l article de Marti J. Gader, Frédéric Magoulès et

Plus en détail

TP - Introduction de la fonction exponentielle par la méthode d'euler -

TP - Introduction de la fonction exponentielle par la méthode d'euler - TP - Itroductio de la foctio expoetielle par la méthode d'euler - De ombreux phéomèes phsiques, biologiques, écoomiques ou autres sot modélisés par ue foctio ƒ qui est proportioelle à sa dérivée ƒ'. (Par

Plus en détail

Fonction logarithme népérien Corrigés d exercices / Version de décembre 2012

Fonction logarithme népérien Corrigés d exercices / Version de décembre 2012 Corrigés d eercices / Versio de décembre 0 Les eercices du livre corrigés das ce documet sot les suivats : Page 9 : N, 6 Page 9 : N Page 9 : N 7, 9 Page 98 : N 9,,, 6, 7, 9 Page 99 : N 4, 47, 49, Page

Plus en détail

Terminales S Devoir maison n 3 -A faire pour le jeudi 6 novembre 2014

Terminales S Devoir maison n 3 -A faire pour le jeudi 6 novembre 2014 Termiales S Devoir maiso -A faire pour le jeudi 6 ovembre 0 eercice : probabilités coditioelles et suite Alice débute au jeu de fléchettes. Elle effectue des lacers successifs d ue fléchette. Lorsqu elle

Plus en détail

Chapitre 1. Les suites numériques Principe de récurrence Limite d une suite

Chapitre 1. Les suites numériques Principe de récurrence Limite d une suite Eseigemet spécifique Chapitre 1. Les suites umériques Pricipe de récurrece Limite d ue suite I. Rappels sur les suites umériques 1. géérale Ue suite umérique est ue foctio défiie de N vers R, elle peut

Plus en détail

Séries à termes positifs

Séries à termes positifs Séries à termes positifs Das toute la suite N désigera les etiers aturels positifs 0,,,..., Z tous les etiers aturels...,,, 0,,, 3,... et Q les ombres ratioels. Efi R désigera les réels, et C les complexes.

Plus en détail

Filière Sciences de Matières Physiques (SMP4) Module Mathématiques : Analyse (S4) Cours d Analyse

Filière Sciences de Matières Physiques (SMP4) Module Mathématiques : Analyse (S4) Cours d Analyse UNIVERSITÉ MOHAMMED V - AGDAL Faculté des Scieces Départemet de Mathématiques Filière Scieces de Matières Physiques (SMP4) Module Mathématiques : Aalyse (S4) Cours d Aalyse Séries umériques Suites et Série

Plus en détail

Le rang d une matrice correspond à la dimension de son image, ce qui est égal à la dimension maximale d une sous-matrice extraite inversible.

Le rang d une matrice correspond à la dimension de son image, ce qui est égal à la dimension maximale d une sous-matrice extraite inversible. Uiversité de Geève Sectio de Mathématiques Algèbre I Corrigé 2 Série 7, ex 3 Toutes les affirmatios sot vraies sauf la derière E effet, pour que deux espaces soiet e somme directe, il faut que leur itersectio

Plus en détail

Vérification graphique d une loi

Vérification graphique d une loi Aexe L1 Vérificatio raphique d ue loi Après l étude de cette aexe, le lecteur pourra détermier si des doées empiriques sot adéquatemet décrites par ue loi théorique déjà coue e trasformat l équatio de

Plus en détail

c. Démontrer par récurrence la conjecture du a)...

c. Démontrer par récurrence la conjecture du a)... Eercice O cosidère l algorithme suivat : Etrée : u etier aturel. Iitialisatio : Doer à u la valeur iitiale. Traitemet : Tat que u > 0 Affecter à u la valeur u 0. Sortie : Afficher u. Quelle est la valeur

Plus en détail

Contrôle du vendredi (30 minutes) 1 ère S Prénom et nom :.. Note :.. / I. (2 points)

Contrôle du vendredi (30 minutes) 1 ère S Prénom et nom :.. Note :.. / I. (2 points) ère S Cotrôle du vedredi 4-4-04 (30 miutes) Préom et om : Note : / 0 I ( poits) O cosidère la figure ci-cotre où ABC est u triagle isocèle e A O ote H le projeté orthogoal du poit C sur la droite (AB)

Plus en détail

Version du 28 novembre 2016 (20h06)

Version du 28 novembre 2016 (20h06) CHAPITRE 3. SYSTÈMES DE RCES......................................... - 3.1-3.1. Vecteurs caractéristiques d u système de forces............................... - 3.1-3.1.1. Défiitio.....................................................

Plus en détail

TS Devoir Commun de Mathématiques N 3 Lundi17/11/2014

TS Devoir Commun de Mathématiques N 3 Lundi17/11/2014 TS Devoir Commu de Mathématiques N Ludi7//04 La présetatio, la rédactio et la rigueur des résultats etrerot pour ue part sigificative das l évaluatio de la copie Le sujet est composé de 4 eercices idépedats

Plus en détail

CH5 Algèbre : Suites numériques

CH5 Algèbre : Suites numériques ème Scieces CH5 Algèbre : Suites umériques Décembre 9 A LAATAOUI I Présetatio des suites umériques : Défiitio d ue suite : Ue suite (u ) est ue foctio défiie sur l'esemble N qui à tout etier aturel associe

Plus en détail

12 Cours - Suites.nb 1/11. Suites

12 Cours - Suites.nb 1/11. Suites 12 Cours - Suites.b 1/11 Suites I) Gééralités 1) Défiitio 2) Notatio 3) Commet peut être défiie ue suite 4) Suites et ordre 5) Propriété vraie à partir d u certai rag 6) Exercice 7) Suites arithmétiques,

Plus en détail

Sommaire. Chapitre 1. Notions de base Chapitre 2. Nombres complexes Polynômes... 33

Sommaire. Chapitre 1. Notions de base Chapitre 2. Nombres complexes Polynômes... 33 Sommaire Chapitre. Notios de base.................... 7 A. Démostratio par récurrece..................... 8 B. Esembles............................. 9 C. Applicatios............................ 2 D. Calcul

Plus en détail

Sup Galilée - Maths pour l Ingénieur Corrigé du Partiel du 19 Novembre 2008

Sup Galilée - Maths pour l Ingénieur Corrigé du Partiel du 19 Novembre 2008 Sup Galilée - Maths pour l Igéieur Corrigé du Partiel du 9 Novembre 008 Étude d ue suite récurrete Soit u 0 ]0, [ O cosidère la suite (u ) défiie par u + u 3 u ) Justifier que la suite u est borée O motre

Plus en détail

ECOLE POLYTECHNIQUE TRAITEMENT STATISTIQUE DES DONNEES GEOLOGIQUES COURS GLQ3402. (Version 2.5; 2000) par Denis Marcotte

ECOLE POLYTECHNIQUE TRAITEMENT STATISTIQUE DES DONNEES GEOLOGIQUES COURS GLQ3402. (Version 2.5; 2000) par Denis Marcotte ECOLE POLYTECHNIQUE TRAITEMENT STATISTIQUE DES DONNEES GEOLOGIQUES COURS GLQ340 (Versio.5; 000) par Deis Marcotte Itroductio 1 1. INTRODUCTION... 1.1 OBJECTIFS DE L'ANALYSE DES DONNÉES... 1. PLACE DU COURS

Plus en détail

Comportement d une suite

Comportement d une suite CHAPITRE 6 Comportemet d ue suite ACTIVITÉS Activité L aire ajoutée (celle d u carré compese exactemet l aire elevée a p 6 ; p 5 ; p 6 6 b La suite (p est géométrique de raiso car la logueur de la lige

Plus en détail

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours Exo7 Valeurs absolues. Partie etière. Iégalités Exercices de Jea-Louis Rouget. Retrouver aussi cette fiche sur www.maths-frace.fr * très facile ** facile *** difficulté moyee **** difficile ***** très

Plus en détail

Suites numériques. Généralités. 5 novembre Introduction. Dénitions. Représentation graphique

Suites numériques. Généralités. 5 novembre Introduction. Dénitions. Représentation graphique Suites umériques 5 ovembre 009 I Gééralités Itroductio Exemple 1. [Si vous travaillez chaque mois, vous recevez u salaire : u ombre.] Juillet oût Septembre Octobre Novembre Décembre Javier Février Mars

Plus en détail

INF582 : Cryptologie Attaque de clés RSA par la méthode de Wiener

INF582 : Cryptologie Attaque de clés RSA par la méthode de Wiener INF58 : Cryptologie Attaque de clés RSA par la méthode de Wieer Nicolas DOUZIECH - Thomas JANNAUD - X005 9 mars 008 Table des matières Quelques rappels sur le cryptosystème RSA Pricipe de l attaque de

Plus en détail

Suites. =3v n pour = 5.

Suites. =3v n pour = 5. Suites 1 Gééralités 11 Défiitio Défiitio : O appelle suite ue foctio sur N ou sur ue partie de N das R Exemples: Les foctios: u : +1 ; v : sot des suites Notatio : Soit u ue suite défiie sur D partie de

Plus en détail

( ) ( ) ( ) ( 4) Terminale S Exercices sur le chapitre «Suites numériques» Page 1. deux nombres réels. Initialisation Récupérer la valeur de M

( ) ( ) ( ) ( 4) Terminale S Exercices sur le chapitre «Suites numériques» Page 1. deux nombres réels. Initialisation Récupérer la valeur de M Termiale S Exercices sur le chapitre «Suites umériques» Page Exercice : O cosidère la suite ( p ) défiie sur N par ) O cosidère l algorithme suivat : Variables u etier aturel et deux ombres réels Iitialisatio

Plus en détail

I. La numération décimale

I. La numération décimale ISN Codage biaire et quatité d iformatios I. La umératio décimale Das le système décimal, o utilise 10 chiffres :..Le système décimal est doc u système de umératio de base 10. Aisi les ombres se décomposet

Plus en détail

Chapitre A1 - Nombres - récurrences - Sommes. Table des matières

Chapitre A1 - Nombres - récurrences - Sommes. Table des matières Chapitre A1 - Nombres - récurreces - Sommes Table des matières 1 Esembles de ombres 2 1.1 Déitios................................................... 2 1.2 Itervalles d'etiers..............................................

Plus en détail

Dimension finie. 1. Famille libre Combinaison linéaire (rappel) 1.2. Définition

Dimension finie. 1. Famille libre Combinaison linéaire (rappel) 1.2. Définition Dimesio fiie Vidéo partie. Famille libre Vidéo partie 2. Famille géératrice Vidéo partie 3. Base Vidéo partie 4. Dimesio d'u espace vectoriel Vidéo partie 5. Dimesio des sous-espaces vectoriels Fiche d'exercices

Plus en détail

Externat Notre Dame Bac Blanc n 1 (Tle S) janvier Proposition de corrigé

Externat Notre Dame Bac Blanc n 1 (Tle S) janvier Proposition de corrigé Exterat Notre Dame Bac Blac Tle S) javier 06 durée : 4 h Propositio de corrigé calculatrice autorisée Das tout ce devoir, la qualité de la rédactio et le soi serot pris e compte das la otatio. Les exercices

Plus en détail

Fiche N 8 : Matrices.

Fiche N 8 : Matrices. Lycée Paul Gaugui CPGE-EC1 Aée 014/015 Fiche N 8 : atrices Gééralités sur les matrices atrices : Défiitios O appelle matrice à liges et p coloes tout tableau rectagulaire de ombres réels à liges et p coloes

Plus en détail

TP 5 : Dérivation numérique

TP 5 : Dérivation numérique I.N.S.S.E.T. U. P. J. V. Licece Mats et SPI 2 ème aée Iitiatio à Matlab M. Marcoux TP 5 : Dérivatio umérique 1. Itroductio Le calcul de la dérivée d ue octio réelle quelcoque peut être très log et très

Plus en détail

Sylvain ETIENNE 2003/2004 PLC1, groupe 1 Exposé 64

Sylvain ETIENNE 2003/2004 PLC1, groupe 1 Exposé 64 Sylvai ETIENNE 3/4 IMAGE D UN INTERVALLE PAR UNE FONCTION CONTINUE, IMAGE D UN SEGMENT. CONTINUITE DE LA FONCTION RECIPROQUE D UNE FONCTION CONTINUE STRICTEMENT MONOTONE SUR UN INTERVALLE. Niveau : Complémetaire.

Plus en détail

sont égales, alors le produit des «extrêmes» a d est égal au produit des «moyens» c d ; et réciproquement ; la preuve est ici 1.

sont égales, alors le produit des «extrêmes» a d est égal au produit des «moyens» c d ; et réciproquement ; la preuve est ici 1. Cours 5 Idépedace 1 Das le cours précédet, ous avos vu que la variable Y était idépedate de la variable X si ses distributios coditioelles e fréquece sot égales ; das ce cas e effet, la mesure de X sur

Plus en détail

Suites. Suites arithmétiques. Suites géométriques

Suites. Suites arithmétiques. Suites géométriques CHAPITRE Suites Suites arithmétiques Suites géométriques ACTIVITÉS Activité a) 8 + 7 coureurs b) x 9 + 0 d où x 78 L équipe a reçu les dossards umérotés de 9 à 78 x + d où x 6 0 0 + aées (page 8) a) itervalles,

Plus en détail

1 Séries numériques. 1.1 Généralités. Dans toute cette section, si cela n est pas précisé, E désignera l espace R m, m 1, et la norme euclidienne.

1 Séries numériques. 1.1 Généralités. Dans toute cette section, si cela n est pas précisé, E désignera l espace R m, m 1, et la norme euclidienne. 1 Séries umériques Das toute cette sectio, si cela est pas précisé, E désigera l espace R m, m 1, et la orme euclidiee. 1.1 Gééralités Défiitio 1.1. Soit (x ) N ue suite de E et pour chaque N, o défiit

Plus en détail

EXERCICES SUR LES SUITES NUMERIQUES

EXERCICES SUR LES SUITES NUMERIQUES EXERCICES SUR LES SUITES NUMERIQUES 1 Etudier la mootoie des suites a ) 0 défiies par : a) a = b) a = + 1) + ) + ) c) a =! d) a = α + 1) α réel positif) Soit a, la suite de terme gééral a = 3 + 1 3 + Trouver

Plus en détail

«J'aimais et j'aime encore les mathématiques pour elles-mêmes comme n'admettant pas l'hypocrisie et le vague, mes deux bêtes d'aversion» (Stendhal)

«J'aimais et j'aime encore les mathématiques pour elles-mêmes comme n'admettant pas l'hypocrisie et le vague, mes deux bêtes d'aversion» (Stendhal) Lycée Stedhal (Greoble) Niveau : Termiale S Titre Cours : Chapitre 0 : Les suites Aée : 204-205 «J'aimais et j'aime ecore les mathématiques pour elles-mêmes comme 'admettat pas l'hypocrisie et le vague,

Plus en détail

TP 5 : La musique - Correction

TP 5 : La musique - Correction TP 5 : La musique - Correctio Objectifs : Réaliser l'aalyse spectrale d'u so musical et l'exploiter pour e caractériser la hauteur et le timbre. I ) Les différets types de so a ) Le so pur : so d'u diapaso

Plus en détail

Annexe : Leçon 10 - Échantillonnage

Annexe : Leçon 10 - Échantillonnage Aexe : Leço 10 - Échatilloage Clémet BOULONNE pour la sessio 01 I Niveau, prérequis, référeces Niveau BTS Prérequis Probabilités, lois discrètes et cotiues Référeces [1,,, 4, 5] II Coteu de la leço 1 Approximatio

Plus en détail

ANOVA avec un facteur aléatoire

ANOVA avec un facteur aléatoire Chapitre 7 ANOVA avec u facteur aléatoire Jusqu à maiteat, o a supposé que les modalités du facteur étudié ot été choisies parce qu elles étaiet itrisèquemet itéressates. Le modèle à effets fixes porte

Plus en détail

SERIES NUMERIQUES réelles ou complexes

SERIES NUMERIQUES réelles ou complexes UE7 - MA5 : Aalyse SERIES NUMERIQUES réelles ou complexes I. Gééralités Défiitio Etat doée ue suite (u ) de ombres réels ou complexes, o appelle série de terme gééral u la suite (S ) défiie par : () S

Plus en détail

Limite d'une suite. soit n > 9

Limite d'une suite. soit n > 9 Limite d'ue suite I) Limite d'ue suite : a) ite ifiie : défiitio : Ue suite (u ) a pour ite + quad ted vers + si tout itervalle de la forme ]A; +[ (A état u réel) cotiet tous les termes u à partir d'u

Plus en détail

Suite des polynômes de Tchebychev. (Exercice N 127 page 87) Corrigé

Suite des polynômes de Tchebychev. (Exercice N 127 page 87) Corrigé Suite des polyômes de Tchebychev (Exercice 7 page 87) a E utilisat la relatio de récurrece avec =, o obtiet : Puis, pour = : Efi, pour = 4 : O a bie : f x x f x f x x x x = = = f x = x f x f x = x x x=

Plus en détail

Chapitre 1. Dénombrement

Chapitre 1. Dénombrement Chapitre Déombremet Itroductio Lorsque l o compte les objets d ue collectio, o attribue à la collectio so cardial, c est à dire le ombre d objets qu elle cotiet. Par exemple u Picasso, u Rembrat et u Degas

Plus en détail

LA LOI DES GRANDS NOMBRES ET LE THÉORÈME DE LA LIMITE CENTRALE

LA LOI DES GRANDS NOMBRES ET LE THÉORÈME DE LA LIMITE CENTRALE LA LOI DES GRANDS NOMBRES ET LE THÉORÈME DE LA LIMITE CENTRALE MATTHIEU KOWALSKI 1. INTRODUCTION La démarche statistique cosiste à observer ue expériece aléatoire das le but de mieux coaître ses caractéristiques.

Plus en détail

1 Éléments de la théorie des probabilités

1 Éléments de la théorie des probabilités 1 Élémets de la théorie des probabilités 1.1 Expériece stochastique, évéemet aléatoire Ue expériece est dite stochastique ou aléatoire s il est impossible de prévoir so résultat. E pricipe, o admet qu

Plus en détail