AVANT-PROPOS
C’est en forgeant qu’on devient forgeron...
Ce vieil adage, dont les hommes ont usé depuis la nuit des temps, est mis dans
cet ouvrage au service des étudiants de licence et de première année de master de
mathématiques et d’informatique, des élèves-ingénieurs et de toute autre personne
souhaitant goûter les joies et maîtriser les dicultés de l’algorithmique.
Au cœur de l’informatique, cette science est celle de la conception de méthodes
ecaces pour résoudre des problèmes à l’aide d’un ordinateur. Elle définit des outils
généraux permettant de répondre aux questions suivantes : Sur quelle propriété ma-
thématique d’un problème peut-on établir une méthode de résolution ? Étant donné
un algorithme, résout-il le problème posé ? Lorsque l’on dispose de deux méthodes
de résolution diérentes, laquelle est préférable ?
L’algorithmique a donné lieu à de nombreux ouvrages remarquables depuis plus
de trente ans, sur lesquels se fondent les enseignements dispensés dans les universités
et écoles d’ingénieurs, et dont nous donnons une liste non exhaustive à la fin de cet
ouvrage. L’expérience des auteurs, enseignants chevronnés dans diérentes universi-
tés, les a depuis longtemps confrontés aux dicultés de leurs étudiants face à cette
matière. Celles-ci semblent de plusieurs ordres :
il est nécessaire de pouvoir expérimenter les algorithmes sur diérents exemples
pour en comprendre intuitivement le fonctionnement ;
apprendre des éléments de cours implique de pouvoir refaire, au besoin, les dé-
monstrations qui y ont été présentées, de les rédiger ;
les algorithmes manipulent des entités qui évoluent dans le temps, et cela ajoute
une dimension inhabituelle aux raisonnements mathématiques nécessaires pour les
prouver et analyser leurs performances ;
l’apprentissage souvent simultané d’un langage de programmation peut parfois
ajouter des dicultés de compréhension dues à la syntaxe propre du langage.
C’est pour répondre à ces dicultés que les auteurs ont formé le projet de cet
ouvrage, à partir d’exercices progressifs conçus lors de leurs années de pratique, et
utilisés dans le cadre de travaux dirigés, d’examens, ou pour des devoirs de plus
grande envergure. L’ouvrage a pour objectif d’aider l’étudiant dans son apprentissage
de la conception et de l’analyse d’algorithmes en insistant sur le raisonnement et sa
rédaction, en vue d’écrire dans le langage de son choix des programmes ecaces.
Si la plupart des ouvrages de cours d’algorithmique contiennent des énoncés
d’exercices, peu sont corrigés. C’est donc l’une des originalités de ce livre que de
©Dunod. La photocopie non autorisée est un délit.
VII
Avant-propos
proposer une correction entièrement rédigée, rigoureuse et complète de chaque ques-
tion.
On y trouvera, pour chaque notion, des exercices visant la compréhension du cours,
qui permettent d’appliquer un algorithme connu à des données numériques, ou de
redémontrer, à partir d’éléments de base dont les définitions sont explicitées, les pro-
priétés de certains algorithmes du cours décomposées en questions progressives. On y
trouvera aussi des exercices qui enrichissent des algorithmes classiques de nouvelles
fonctionnalités ou qui permettent de les intégrer dans des applications originales.
Concernant la programmation, le parti pris de cet ouvrage est d’employer, pour la
rédaction des algorithmes, un pseudo-langage impératif, plutôt qu’un véritable lan-
gage de programmation, afin de se concentrer sur ce qui ressort de la conception de
l’algorithme, et non sur son implémentation. Ce choix devrait toutefois permettre une
implémentation aisée des algorithmes dans des langages comme Pascal, C ou C++,
avec sans doute un eort supplémentaire en ce qui concerne les langages objets. Nous
indiquons plus loin les conventions d’écriture de ce langage, auxquelles le lecteur
pourra se référer pour comprendre, mais aussi pour programmer les algorithmes dans
le langage de son choix.
L’ouvrage aborde un panel assez vaste de domaines d’application de l’algorith-
mique, et devrait couvrir la plupart des cours dispensés actuellement en license et
master de mathématiques et informatique et en écoles d’ingénieurs.
On y développe notamment, après un chapitre méthodologique qui traite de la
preuve et de l’analyse de la complexité d’un algorithme, les types de données abstraits
pour représenter, gérer et manipuler des ensembles dynamiques, et leur implémenta-
tion à l’aide de structures de données linéaires ou arborescentes (piles, les, listes,
arbres binaires de recherche, arbres équilibrés, tas). On aborde ensuite l’étude des
algorithmes de tri. Les chapitres suivants sont consacrés à l’étude de l’algorithmique
de base des graphes valués et non valués : connexité, accessibilité, parcours, arbres
couvrants et chemins de coût minimum, pour ne citer que les principaux problèmes
abordés. Ensuite, deux chapitres consacrés l’un aux algorithmes relatifs à la géomé-
trie plane et l’autre aux algorithmes relatifs aux automates et aux mots achèvent cet
ouvrage.
Dans chaque section, les exercices sont présentés dans un ordre de diculté crois-
sante, sauf nécessité de regroupement thématique, et souvent les questions d’un exer-
cice respectent une certaine progressivité dans la diculté.
D’autres algorithmes auraient mérité de figurer dans ce livre, plus proches de l’al-
gorithmique numérique, ou de la recherche opérationnelle. Avec quelques encoura-
gements, les auteurs pourraient envisager une suite...
VIII
Avant-propos
Prérequis
Le livre nécessite les connaissances de mathématiques du niveau des deux premières
années de licence, en particulier une bonne maîtrise du raisonnement par récurrence,
ainsi que la connaissance de base d’un langage de programmation. Chacun des cha-
pitres demande des prérequis, explicités dans les exercices lorsque cela semble né-
cessaire.
Il est recommandé de traiter les exercices en ayant d’autre part étudié un cours
oral ou un livre de référence. Toutefois, de nombreux exercices peuvent être traités
en se référant uniquement aux définitions et résultats de base rappelés en début de
sous-chapitre. Cet en-tête de chapitre n’a pas pour objectif d’être un abrégé de cours.
Les définitions présentées sont loin d’être exhaustives, mais sont celles jugées indis-
pensables pour traiter les exercices avec le plus d’autonomie possible.
Conventions relatives à la présentation des algorithmes
Les algorithmes se présentent sous la forme de segments de code, de fonctions ou
de procédures. Les types des paramètres, des fonctions et des variables sont toujours
explicités. Par défaut, les passages de paramètres se font par valeur. Un texte accom-
pagne l’algorithme lorsqu’un paramètre est modifié, et que le passage doit se faire
par référence.
Comme dans tous les langages de programmation impératifs, les structures de
contrôle suivantes sont employées :
si condition alors instruction sinon instruction finsi ;
tant que condition faire instruction fintantque ;
répéter instruction jusqu’à condition finrépéter ;
pour variable de valeur initiale àvaleur finale faire instruction finpour ;
pour tout élément d’un ensemble faire instruction finpour.
Les tableaux sont indexés par des entiers, et un élément d’indice id’un tableau
Ts’écrit T[i], de même les éléments d’un tableau Mà deux dimensions se notent
M[i,j].
La principale spécificité du pseudo-langage est le traitement des pointeurs.
D’abord, nous nous aranchissons des problèmes liés à l’allocation dynamique de
mémoire (les objets manipulés sont supposés alloués). Ensuite, pour ne pas alour-
dir la présentation des algorithmes, lorsqu’une variable xdésigne un pointeur sur un
enregistrement à plusieurs champs, par exemple un enregistrement comportant des
champs nommés aet b, alors on notera x.ala variable correspondant au champ ade
l’enregistrement pointé par x. La même notation sera employée lorsque xreprésente
l’enregistrement lui-même. Un pointeur qui ne pointe sur aucun enregistrement a la
valeur nul.
©Dunod. La photocopie non autorisée est un délit.
IX
Avant-propos
Conventions relatives à l’index
Les entrées de l’index font référence à des notions de base traitées dans l’ouvrage.
Lorsqu’une notion fait l’objet d’une définition explicite, ou d’un exercice qui lui est
spécifiquement consacré, le numéro de page référencé apparaît en gras. Lorsqu’il
s’agit d’un algorithme, le numéro de page apparaît en italique.
Remerciements
Les auteurs se souviennent avec tendresse du vide de leurs premiers regards qu’une
explication miraculeuse a un jour allumé d’une petite flamme.
Ils saluent leurs maîtres, qui leur ont inculqué une forme de pensée archaïque
consistant à chercher en toute circonstance la maîtrise absolue de la situation, par
l’intermédiaire d’une preuve au pire longue et laborieuse, au mieux élégante et belle.
Ils arrosent d’une larme émue les bancs des facultés, usés par ceux qui ont, depuis
vingt ans, à leur insu, participé à la conception de cet ouvrage.
Ils remercient chaleureusement les collègues dont ils ont sans vergogne pillé les
archives.
Troisième édition
La troisième édition introduit dans la plupart des chapitres des exercices nouveaux
qui se caractérisent par une plus grande originalité, une plus grande diculté et par
leur intérêt pédagogique pour appréhender en profondeur les fondements théoriques
des concepts algorithmiques présentés dans le chapitre.
X
PREUVE
ET COMPLEXITÉ 1
Un algorithme (O,V,S) est formé d’un ensemble fini Od’opérations liées par une
structure de contrôle Set dont les opérandes portent sur un ensemble fini Vde va-
riables. Un algorithme résout le problème Psi pour tout énoncé Ide P(stocké dans
le sous-ensemble des variables d’entrée de V), d’une part la suite des opérations exé-
cutées est finie (condition de terminaison) et si d’autre part, lors de la terminaison,
le sous-ensemble des variables de sortie de Vcontient le résultat associé à l’énoncé
I(condition de validité). Prouver un algorithme, c’est démontrer mathématiquement
que la propriété précédente est satisfaite. Une mesure de complexité d’un algorithme
est une estimation de son temps de calcul, mémoire utilisée ou de toute autre unité
significative. On s’intéresse le plus souvent à la recherche d’une estimation par excès
à une constante positive multiplicative près du cas le plus défavorable sur le sous-
ensemble des énoncés de taille fixée n(complexité dite « pire-cas »). On obtient ainsi
le taux asymptotique de croissance de la mesure indépendamment de la machine sur
laquelle l’algorithme est exécuté et l’on peut alors comparer les complexités pire-cas
de plusieurs algorithmes résolvant un même problème.
Ce chapitre propose d’exercer cette démarche d’analyse sur des algorithmes de
base, itératifs et récursifs, en demandant le développement détaillé des preuves à
l’aide de questions progressives. Afin de définir rigoureusement la notion de me-
sure de complexité, nous introduisons les trois notations de Landau relatives aux
ensembles de fonctions O(g), Ω(g)etΘ(g), lorsque gest une fonction de IN dans IN.
nition 1.1 Borne supérieure asymptotique
O(g(n)) ={f:ININ |∃k>0etn00 tels que
nn00f(n)kg(n)}
Si une fonction f(n)O(g(n)), on dit que g(n) est une borne supérieure asympto-
tique pour f(n).
On note abusivement : f(n)=O(g(n)).
©Dunod. La photocopie non autorisée est un délit.
1
1 / 17 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !