Algorithmique
L'algorithmique est l'étude et la production de rÚgles et techniques qui sont impliquées dans la définition et la conception d'algorithmes, c'est-à -dire de processus systématiques de résolution d'un problÚme permettant de décrire précisément des étapes pour résoudre un problÚme algorithmique.
Ătymologie
Le mot « algorithme » vient du nom du mathĂ©maticien Al-KhwĂąrizmĂź[1] (latinisĂ© au Moyen Ăge en Algoritmi), qui, au IXe siĂšcle Ă©crivit le premier ouvrage systĂ©matique donnant des solutions aux Ă©quations linĂ©aires et quadratiques. Le h muet, non justifiĂ© par l'Ă©tymologie, vient dâune dĂ©formation par rapprochement avec le grec áŒÏÎčΞΌÏÏ (arithmĂłs)[2]. « Algorithme » a donnĂ© « algorithmique ». Le synonyme « algorithmie », vieux mot utilisĂ© par exemple par Wronski en 1811[3], est encore parfois utilisĂ©[4].
Histoire
Antiquité
Les premiers algorithmes dont on a retrouvé des descriptions datent des Babyloniens, au IIIe millénaire av. J.-C.. Ils décrivent des méthodes de calcul et des résolutions d'équations à l'aide d'exemples[5] - [6].
Un algorithme cĂ©lĂšbre est celui qui se trouve dans le livre 7 des ĂlĂ©ments d'Euclide, et appelĂ© algorithme d'Euclide. Il permet de trouver le plus grand diviseur commun, ou PGCD, de deux nombres. Un point particuliĂšrement remarquable est quâil contient explicitement une itĂ©ration et que les propositions 1 et 2 dĂ©montrent sa correction.
C'est ArchimĂšde qui proposa le premier un algorithme pour le calcul de Ï[7].
Ătude systĂ©matique
Le premier Ă avoir systĂ©matisĂ© des algorithmes est le mathĂ©maticien perse Al-KhwĂąrizmĂź, actif entre 813 et 833. Dans son ouvrage AbrĂ©gĂ© du calcul par la restauration et la comparaison, il Ă©tudie toutes les Ă©quations du second degrĂ© et en donne la rĂ©solution par des algorithmes gĂ©nĂ©raux. Il utilise des mĂ©thodes semblables Ă celles des Babyloniens, mais se diffĂ©rencie par ses explications systĂ©matiques lĂ oĂč les Babyloniens donnaient seulement des exemples.
Le savant andalou AverroĂšs (1126-1198) Ă©voque une mĂ©thode de raisonnement oĂč la thĂšse sâaffine Ă©tape par Ă©tape, itĂ©rativement, jusquâĂ une certaine convergence et ceci conformĂ©ment au dĂ©roulement dâun algorithme. Ă la mĂȘme Ă©poque, au XIIe siĂšcle, le moine Adelard de Bath introduit le terme latin de algorismus, par rĂ©fĂ©rence au nom de Al Khuwarizmi. Ce mot donne algorithme en français en 1554.
Au XVIIe siĂšcle, on pourrait entrevoir une certaine allusion Ă la mĂ©thode algorithmique chez RenĂ© Descartes dans la mĂ©thode gĂ©nĂ©rale proposĂ©e par le Discours de la mĂ©thode (1637), notamment quand, en sa deuxiĂšme partie, le mathĂ©maticien français propose de « diviser chacune des difficultĂ©s que jâexaminerois, en autant de parcelles quâil se pourroit, et quâil seroit requis pour les mieux rĂ©soudre ». Sans Ă©voquer explicitement les concepts de boucle, dâitĂ©ration ou de dichotomie, lâapproche de Descartes prĂ©dispose la logique Ă accueillir le concept de programme, mot qui naĂźt en français en 1677.
En 1843 , la mathématicienne et pionniÚre des sciences informatique Ada Lovelace, fille de Lord Byron et assistante de Charles Babbage réalise la premiÚre implémentation d'un algorithme sous forme de programme (calcul des nombres de Bernoulli)[8].
Le dixiÚme problÚme de Hilbert qui fait partie de la liste des 23 problÚmes posés par David Hilbert en 1900 à Paris est clairement un problÚme algorithmique. En l'occurrence, la réponse est qu'il n'y a pas d'algorithme répondant au problÚme posé.
L'Ă©poque contemporaine
Lâalgorithmique des XXe et XXIe siĂšcles a pour fondement mathĂ©matique des formalismes, par exemple celui des machines de Turing, qui permettent de dĂ©finir prĂ©cisĂ©ment ce qu'on entend par « Ă©tapes », par « prĂ©cis » et par « non ambigu » et qui donnent un cadre scientifique pour Ă©tudier les propriĂ©tĂ©s des algorithmes. Cependant, suivant le formalisme choisi on obtient des approches algorithmiques diffĂ©rentes pour rĂ©soudre un mĂȘme problĂšme. Par exemple l'algorithmique rĂ©cursive, l'algorithmique parallĂšle ou lâinformatique quantique donnent lieu Ă des prĂ©sentations d'algorithmes diffĂ©rentes de celles de l'algorithmique itĂ©rative.
L'algorithmique s'est surtout développée dans la deuxiÚme moitié du XXe siÚcle, comme support conceptuel de la programmation des ordinateurs, dans le cadre du développement de l'informatique pendant cette période. Donald Knuth, auteur du traité The Art of Computer Programming qui décrit de trÚs nombreux algorithmes, a contribué, avec d'autres, à poser les fondements mathématiques de leur analyse.
Vocabulaire
Le substantif algorithmique désigne l'ensemble des méthodes permettant de créer des algorithmes. Le terme est également employé comme adjectif.
Un algorithme Ă©nonce une solution Ă un problĂšme sous la forme dâun enchaĂźnement dâopĂ©rations Ă effectuer.
Les informaticiens utilisent frĂ©quemment lâanglicisme implĂ©mentation pour dĂ©signer la mise en Ćuvre de l'algorithme dans un langage de programmation. Cette implĂ©mentation rĂ©alise la transcription des opĂ©rations constitutives de lâalgorithme et prĂ©cise la façon dont ces opĂ©rations sont invoquĂ©es. Cette Ă©criture en langage informatique, est aussi frĂ©quemment dĂ©signĂ©e par le terme de « codage »[9]. On parle de « code source » pour dĂ©signer le texte, constituant le programme, rĂ©alisant lâalgorithme. Le code est plus ou moins dĂ©taillĂ© selon le niveau dâabstraction du langage utilisĂ©, de mĂȘme qu'une recette de cuisine doit ĂȘtre plus ou moins dĂ©taillĂ©e selon lâexpĂ©rience du cuisinier.
Ătude formelle
De nombreux outils formels ou théoriques ont été développés pour décrire les algorithmes, les étudier, exprimer leurs qualités, pouvoir les comparer :
- ainsi, pour décrire les algorithmes, des structures algorithmiques ont été mises en évidence : structures de contrÎle et structures de données ;
- pour justifier de la qualité des algorithmes, les notions de correction, de complétude et de terminaison ont été mises en place ;
- enfin, pour comparer les algorithmes, une théorie de la complexité des algorithmes a été définie.
Structures algorithmiques
Les concepts en Ćuvre en algorithmique, par exemple selon l'approche de N. Wirth pour les langages les plus rĂ©pandus (Pascal, C, etc.), sont en petit nombre. Ils appartiennent Ă deux classes :
- les structures de contrĂŽle :
- séquences,
- conditionnelles,
- boucles ;
- les structures de données :
- constantes,
- variables,
- tableaux ;
- structures récursives (listes, arbres, graphes).
Ce dĂ©coupage est parfois difficile Ă percevoir pour certains langages (Lisp, PrologâŠ) plus basĂ©s sur la notion de rĂ©cursivitĂ© oĂč certaines structures de contrĂŽle sont implicites et, donc, semblent disparaĂźtre.
Correction, complétude, terminaison
Ces trois notions « correction », « complétude », « terminaison » sont liées, et supposent qu'un algorithme est écrit pour résoudre un problÚme.
La terminaison est l'assurance que l'algorithme terminera en un temps fini. Les preuves de terminaison font habituellement intervenir une fonction entiÚre positive strictement décroissante à chaque « pas » de l'algorithme.
Ătant donnĂ© la garantie qu'un algorithme terminera, la preuve de correction doit apporter l'assurance que si l'algorithme termine en donnant un rĂ©sultat, alors ce rĂ©sultat est effectivement une solution au problĂšme posĂ©. Les preuves de correction font habituellement intervenir une spĂ©cification logique que doivent vĂ©rifier les solutions du problĂšme. La preuve de correction consiste donc Ă montrer que les rĂ©sultats de l'algorithme vĂ©rifient cette spĂ©cification.
La preuve de complétude garantit que, pour un espace de problÚmes donné, l'algorithme, s'il termine, donnera l'ensemble des solutions de l'espace du problÚme. Les preuves de complétude demandent à identifier l'espace du problÚme et l'espace des solutions pour ensuite montrer que l'algorithme produit bien le second à partir du premier.
Complexité algorithmique
Les principales notions mathĂ©matiques dans le calcul du coĂ»t dâun algorithme prĂ©cis sont les notions de domination (notĂ©e O(f(n)), « grand o »), oĂč f est une fonction mathĂ©matique de n, variable dĂ©signant la quantitĂ© dâinformations (en bits, en nombre dâenregistrements, etc.) manipulĂ©e dans lâalgorithme. En algorithmique on trouve souvent des complexitĂ©s du type :
Notation | Type de complexité |
---|---|
complexité constante (indépendante de la taille de la donnée) | |
complexité logarithmique | |
complexité linéaire | |
complexité quasi linéaire | |
complexité quadratique | |
complexité cubique | |
complexité polynomiale | |
complexité quasi polynomiale | |
complexité exponentielle | |
complexité factorielle |
Sans entrer dans les dĂ©tails mathĂ©matiques, le calcul de lâefficacitĂ© dâun algorithme (sa complexitĂ© algorithmique) consiste en la recherche de deux quantitĂ©s importantes. La premiĂšre quantitĂ© est lâĂ©volution du nombre dâinstructions de base en fonction de la quantitĂ© de donnĂ©es Ă traiter (par exemple, pour un algorithme de tri, il s'agit du nombre de donnĂ©es Ă trier), que lâon privilĂ©giera sur le temps d'exĂ©cution mesurĂ© en secondes (car ce dernier dĂ©pend de la machine sur laquelle l'algorithme s'exĂ©cute). La seconde quantitĂ© estimĂ©e est la quantitĂ© de mĂ©moire nĂ©cessaire pour effectuer les calculs. Baser le calcul de la complexitĂ© dâun algorithme sur le temps ou la quantitĂ© effective de mĂ©moire quâun ordinateur particulier prend pour effectuer ledit algorithme ne permet pas de prendre en compte la structure interne de lâalgorithme, ni la particularitĂ© de lâordinateur : selon sa charge de travail, la vitesse de son processeur, la vitesse dâaccĂšs aux donnĂ©es, lâexĂ©cution de lâalgorithme (qui peut faire intervenir le hasard) ou son organisation de la mĂ©moire, le temps dâexĂ©cution et la quantitĂ© de mĂ©moire ne seront pas les mĂȘmes.
Souvent, on examine les performances « au pire », c'est-Ă -dire dans les configurations telles que le temps d'exĂ©cution ou l'espace mĂ©moire est le plus grand. Il existe Ă©galement un autre aspect de l'Ă©valuation de l'efficacitĂ© d'un algorithme : les performances « en moyenne ». Cela suppose d'avoir un modĂšle de la rĂ©partition statistique des donnĂ©es de l'algorithme, tandis que la mise en Ćuvre des techniques d'analyse implique des mĂ©thodes assez fines de combinatoire et d'Ă©valuation asymptotique, utilisant en particulier les sĂ©ries gĂ©nĂ©ratrices et des mĂ©thodes avancĂ©es d'analyse complexe. L'ensemble de ces mĂ©thodes est regroupĂ© sous le nom de combinatoire analytique.
On trouvera dans lâarticle sur la thĂ©orie de la complexitĂ© des algorithmes dâautres Ă©valuations de la complexitĂ© qui vont en gĂ©nĂ©ral au-delĂ des valeurs proposĂ©es ci-dessus et qui classifient les problĂšmes algorithmiques (plutĂŽt que les algorithmes) en classes de complexitĂ©.
Quelques indications sur lâefficacitĂ© des algorithmes et ses biais
L'efficacitĂ© algorithmique nâest souvent connue que de maniĂšre asymptotique, câest-Ă -dire pour de grandes valeurs du paramĂštre n. Lorsque ce paramĂštre est suffisamment petit, un algorithme de complexitĂ© asymptotique plus grande peut en pratique ĂȘtre plus efficace. Ainsi, pour trier un tableau de 30 lignes (câest un paramĂštre de petite taille), il est inutile dâutiliser un algorithme Ă©voluĂ© comme le tri rapide (lâun des algorithmes de tri asymptotiquement les plus efficaces en moyenne) : lâalgorithme de tri le plus simple Ă Ă©crire sera suffisamment efficace.
Entre deux algorithmes informatiques de complexitĂ© identique, on utilisera celui dont lâoccupation mĂ©moire est moindre. Lâanalyse de la complexitĂ© algorithmique peut Ă©galement servir Ă Ă©valuer lâoccupation mĂ©moire dâun algorithme. Enfin, le choix dâun algorithme plutĂŽt quâun autre doit se faire en fonction des donnĂ©es que lâon sâattend Ă lui fournir en entrĂ©e. Ainsi, le tri rapide, lorsque lâon choisit le premier Ă©lĂ©ment comme pivot, se comporte de façon dĂ©sastreuse si on lâapplique Ă une liste de valeurs dĂ©jĂ triĂ©e. Il nâest donc pas judicieux de lâutiliser si on prĂ©voit que le programme recevra en entrĂ©e des listes dĂ©jĂ presque triĂ©es ou alors il faudra choisir le pivot alĂ©atoirement.
D'autres paramĂštres Ă prendre en compte sont notamment :
- les biais intrinsĂšques (acceptĂ©s ou involontaires) de nombreux algorithmes peuvent tromper les utilisateurs ou systĂšmes d'intelligence artificielle, de machine learning, de diagnostic informatique, mĂ©canique, mĂ©dical, de prĂ©vision, de prĂ©vention, de sondages ou d'aide Ă la dĂ©cision (notamment pour les rĂ©seaux sociaux, l'Ă©ducation [ex : parcoursup ], la mĂ©decine, la justice, la police, l'armĂ©e, la politique, l'embaucheâŠ) prenant mal en compte ou pas du tous ces biais[10]. En 2019, des chercheurs de TĂ©lĂ©com ParisTech ont produit un rapport inventoriant les principaux biais connus, et quelques pistes de remĂ©diation[10]
- la localitĂ© de lâalgorithme. Par exemple pour un systĂšme Ă mĂ©moire virtuelle ayant peu de mĂ©moire vive (par rapport au nombre de donnĂ©es Ă traiter), le tri rapide sera normalement plus efficace que le tri par tas car le premier ne passe quâune seule fois sur chaque Ă©lĂ©ment de la mĂ©moire tandis que le second accĂšde Ă la mĂ©moire de maniĂšre discontinue (ce qui augmente le risque de swapping).
- certains algorithmes (ceux dont l'analyse de complexitĂ© est dite amortie), pour certaines exĂ©cutions de lâalgorithme (cas marginaux), prĂ©sentent une complexitĂ© qui sera trĂšs supĂ©rieure au cas moyen, mais ceci sera compensĂ© par des exĂ©cutions rendues efficaces du mĂȘme algorithme dans une suite d'invocations de cet algorithme.
- l'Analyse lisse d'algorithme, qui mesure les performances des algorithmes sur les pires cas, mais avec une légÚre perturbation des instances. Elle explique pourquoi certains algorithmes analysés comme inefficaces autrement, sont en fait efficaces en pratique. L'algorithme du simplexe est un exemple d'un algorithme qui se comporte bien pour l'analyse lisse.
Approches pratiques
L'algorithmique a développé quelques stratégies pour résoudre les problÚmes :
- algorithme glouton : un premier algorithme peut souvent ĂȘtre proposĂ© en Ă©tudiant le problĂšme trĂšs progressivement : on rĂ©sout chaque sous-problĂšme localement en espĂ©rant que l'ensemble de leurs rĂ©sultats composera bien une solution du problĂšme global. On parle alors d'algorithme glouton. L'algorithme glouton n'est souvent qu'une premiĂšre Ă©tape dans la rĂ©daction d'un algorithme plus performant ;
- diviser pour régner : pour améliorer les performances des algorithmes, une technique usuelle consiste à diviser les données d'un problÚme en sous-ensembles de tailles plus petites, jusqu'à obtenir des données que l'algorithme pourra traiter au cas par cas. Une seconde étape dans ces algorithmes consiste à « fusionner » les résultats partiels pour obtenir une solution globale. Ces algorithmes sont souvent associés à la récursivité ;
- recherche exhaustive (ou combinatoire) : une méthode utilisant l'énorme puissance de calcul des ordinateurs consiste à regarder tous les cas possibles. Cela n'est pour autant possible que dans certains cas particuliers (la combinatoire est souvent plus forte que l'énorme puissance des ordinateurs, aussi énorme soit-elle) ;
- décomposition top-down / bottom-up : (décomposition descendante, décomposition remontante) les décompositions top-down consistent à essayer de décomposer le problÚme en sous-problÚmes à résoudre successivement, la décomposition allant jusqu'à des problÚmes triviaux faciles à résoudre. L'algorithme global est alors donné par la composée des algorithmes définis au cours de la décomposition. La démarche bottom-up est la démarche inverse, elle consiste à partir d'algorithmes simples, ne résolvant qu'une étape du problÚme, pour essayer de les composer pour obtenir un algorithme global ;
- pré-traitement / post-traitement : parfois, certains algorithmes comportent une ou deux phases identifiées comme des pré-traitements (à faire avant l'algorithme principal), ou post-traitement (à faire aprÚs l'algorithme principal), pour simplifier l'écriture de l'algorithme général ;
- programmation dynamique : elle s'applique lorsque le problĂšme d'optimisation est composĂ© de plusieurs sous-problĂšmes de mĂȘme nature, et qu'une solution optimale du problĂšme global s'obtient Ă partir de solutions optimales des sous-problĂšmes.
Les heuristiques
Pour certains problĂšmes, les algorithmes ont une complexitĂ© beaucoup trop grande pour obtenir un rĂ©sultat en temps raisonnable, mĂȘme si lâon pouvait utiliser une puissance de calcul phĂ©nomĂ©nale. On est donc amenĂ© Ă rechercher la solution de façon non systĂ©matique (algorithme de Las Vegas) ou de se contenter d'une solution la plus proche possible dâune solution optimale en procĂ©dant par essais successifs (algorithme de Monte-Carlo). Puisque toutes les combinaisons ne peuvent ĂȘtre essayĂ©es, certains choix stratĂ©giques doivent ĂȘtre faits. Ces choix, gĂ©nĂ©ralement trĂšs dĂ©pendants du problĂšme traitĂ©, constituent ce quâon appelle une heuristique. Le but dâune heuristique n'est donc pas d'essayer toutes les combinaisons possibles, mais de trouver une solution en un temps raisonnable et par un autre moyen, par exemple en procĂ©dant Ă des tirages alĂ©atoires. La solution peut ĂȘtre exacte (Las Vegas) ou approchĂ©e (Monte-Carlo). Les algorithmes d'Atlantic City quant Ă eux donnent de façon probablement efficace une rĂ©ponse probablement juste (disons avec une chance sur cent millions de se tromper) Ă la question posĂ©e.
Câest ainsi que les programmes de jeu dâĂ©checs ou de jeu de go (pour ne citer que ceux-lĂ ) font appel de maniĂšre trĂšs frĂ©quente Ă des heuristiques qui modĂ©lisent lâexpĂ©rience dâun joueur. Certains logiciels antivirus se basent Ă©galement sur des heuristiques pour reconnaĂźtre des virus informatiques non rĂ©pertoriĂ©s dans leur base, en sâappuyant sur des ressemblances avec des virus connus, c'est un exemple d'algorithme d'Atlantic City. De mĂȘme le problĂšme SAT qui est l'archĂ©type du problĂšme NP-complet donc trĂšs difficile est rĂ©solu de façon pratique et efficace par la mise au point d'heuristiques[11].
Exemples dâalgorithmes, de problĂšmes, d'applications ou domaines d'application
Il existe un certain nombre dâalgorithmes classiques, utilisĂ©s pour rĂ©soudre des problĂšmes ou plus simplement pour illustrer des mĂ©thodes de programmation. On se rĂ©fĂ©rera aux articles suivants pour de plus amples dĂ©tails (voir aussi liste des algorithmes) :
- algorithmes ou problĂšmes classiques (du plus simple ou plus complexe) :
- échange, ou comment échanger les valeurs de deux variables : problÚme classique illustrant la notion de variable informatique (voir aussi Structure de données),
- algorithmes de recherche, ou comment retrouver une information dans un ensemble structuré ou non (par exemple Recherche dichotomique),
- algorithme de tri, ou comment trier un ensemble de nombres le plus rapidement possible ou en utilisant le moins de ressources possible,
- problĂšme du voyageur de commerce, problĂšme du sac Ă dos, problĂšme SAT et autres algorithmes ou approximations de solutions pour les problĂšmes combinatoires difficiles (dit NP-complets) ;
- algorithmes ou problÚmes illustrant la programmation récursive (voir aussi algorithme récursif) :
- tours de HanoĂŻ,
- huit dames, placer huit dames sur un Ă©chiquier sans quâelles puissent se prendre entre elles,
- suite de Conway,
- algorithme de dessins rĂ©cursifs (fractale) pour le Tapis de SierpiĆski, la Courbe du dragon, le Flocon de Koch⊠;
- algorithmes dans le domaine des mathématiques :
- calcul de la factorielle d'un nombre, de la Fonction d'Ackermann ou de la suite de Fibonacci,
- algorithme du simplexe, qui minimise une fonction linéaire de variables réelles soumises à des contraintes linéaires,
- fraction continue d'un nombre quadratique, permettant d'extraire une racine carrée, cas particulier de la méthode de Newton,
- dans le domaine de l'algÚbre : l'algorithme d'unification, le calcul d'une base de Gröbner d'un idéal de polynÎme et plus généralement presque toutes les méthodes de calcul symbolique,
- en théorie des graphes qui donne lieu à de nombreux algorithmes,
- test de primalité ;
- algorithmes pour et dans le domaine de l'informatique :
- cryptologie et compression de données,
- informatique musicale,
- algorithme génétique en informatique décisionnelle,
- analyse et compilation des langages formels (voir Compilateur et InterprĂšte (informatique)),
- allocation de mémoire (ramasse-miettes).
Annexes
Notes et références
- Phillipe Collard et Philippe Flajolet, « Algorithmique », sur EncyclopÊdia universalis (consulté le ).
- Albert Dauzat, Jean Dubois, Henri Mitterand, Nouveau dictionnaire Ă©tymologique et historique, 1971
- Hoéné de Wronski, Introduction à la philosophie des mathématiques et technie de l'algorithmie, Chez Courcier, imprimeur-libraire pour les mathématiques, (lire en ligne)
- Par exemple, l'UQAM propose un cours intitulé « Algorithmie de base et interactivité », et l'université de Montréal, un cours intitulé « Algorithmie et effets audionumériques ».
- Donald Knuth, « Ancient Babylonian Algorithms », Communications of the ACM, vol. 15, no 7,â , repris dans Donald Knuth, Selected Papers on Computer Science, Addison-Wesley, , p. 185, traduit en français sous le titre Algoritmes babyloniens anciens dans Donald Knuth (trad. P. CĂ©gielski), ĂlĂ©ments pour une histoire de l'informatique, Librairie Eyrolles, .
- Christine Proust, « MathĂ©matiques en MĂ©sopotamie », Images des MathĂ©matiques,â (lire en ligne).
- Le calcul de Ï Â« est caractĂ©ristique des problĂšmes gĂ©nĂ©raux rencontrĂ©s en algorithmique. » Phillipe Collard et Phillipe Flajolet, « Algorithmique : 1. L'exemple du calcul de Ï Â», sur EncyclopĂŠdia universalis (consultĂ© le ).
- Stephen Wolfram (en) « Untangling the Tale of Ada Lovelace », sur blog.stephenwolfram.com
- En cryptographie, le terme codage est utilisé dans un sens différent.
- Hertel & Delattre V (2019) [SEAActu17h-20190302 Les algorithmes sont partout, leurs biais de conception nous trompent] ; le 02.03.2019
- (en) Moshe Vardi, Boolean Satisfiability: Theory and Engineering (Communications of the ACM, Vol. 57 Nos. 3, p. 5).
Bibliographie
- (en) Donald E. Knuth, The Art of Computer Programming, vol. 2 : Seminumerical algorithms, Reading, Mass, Addison-Wesley Pub. Co, , 764 p. (ISBN 978-0-201-89684-8 et 978-0-321-75104-1, OCLC 781024586)
- Michel Quercia, Algorithmique : Cours complet, exercices et problÚmes résolus, travaux pratiques, Vuibert, , 303 p. (ISBN 2-7117-7091-5)
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein (trad. de l'anglais), Algorithmique : Cours avec 957 exercices et 158 problĂšmes, Dunod, [dĂ©tail de lâĂ©dition]
- Patrick Bosc, Marc Guyomard et Laurent Miclet, Conception d'algorithmes : principes et 150 exercices corrigés, Paris, Eyrolles, , 832 p. (ISBN 978-2-212-67728-7, BNF 45663637)
Liens externes
- Notice dans un dictionnaire ou une encyclopédie généraliste :
- Quâest-ce qu'un algorithme ? par Philippe Flajolet et Ătienne Parizot sur la revue en ligne Interstices