En mathématiques et en informatique , un algorithme ( Un algorithme (ⓘ
) est uneséquence finie d'mathématiquement rigoureuses, généralement utilisée pour résoudre une classe deproblèmesou pour effectuer uncalcul. Les algorithmes servent de spécifications pour réaliserdes calculsettraiter des données. Les algorithmes plus avancés peuvent utiliserdes conditionspour orienter l'exécution du code vers différents chemins (on parle alors deprise de décision automatiséedes inférencesvalides(on parle alors deraisonnement automatisé).À l'inverse, une heuristique est une approche de résolution de problèmes sans résultats corrects ou optimaux clairement définis. Par exemple, bien que les systèmes de recommandation sur les réseaux sociaux soient communément appelés « algorithmes », ils reposent en réalité sur des heuristiques, car il n'existe pas de recommandation véritablement « correcte ».
En tant que méthode efficace , un algorithme peut être exprimé dans un espace et un temps finis et dans un langage formel bien défini pour le calcul d'une fonction . À partir d'un état initial et d'une entrée, un calcul est effectué à chaque étape, produisant finalement une sortie et se terminant. La transition entre les états peut être non déterministe ; les algorithmes randomisés intègrent des entrées aléatoires.
Muḥammad ibn Mūsā al-Khwārizmī écrivit le kitāb al-ḥisāb al-hindī (« Livre du calcul indien ») et le kitab al-jam' wa'l-tafriq al-ḥisāb al-hindī (« Addition et soustraction en arithmétique indienne »). Au début du XIIe siècle, des traductions latines de ces textes, traitant du système de numération et de l'arithmétique indo-arabe, apparurent, par exemple le Liber Alghoarismi de practica arismetrice , attribué à Jean de Séville , et le Liber Algoritmi de numero Indorum , attribué à Adélard de Bath . Ici, alghoarismi ou algoritmi est la latinisation du nom d'Al-Khwarizmi ; Le texte commence par la phrase Dixit Algoritmi , ou « Ainsi parla Al-Khwarizmi ».
Le mot « algorism » en anglais en est venu à désigner l’utilisation de la notation positionnelle dans les calculs ; on le trouve dans l’ Ancrene Wisse, datant d’environ 1225. À l’époque où Geoffrey Chaucer écrivait les Contes de Canterbury à la fin du XIVe siècle, il utilisait une variante de ce même mot pour décrire les pierres d’augrym , pierres servant au calcul positionnel. Au XVe siècle, sous l’influence du mot grec ἀριθμός ( arithmos , « nombre » ; cf. « arithmétique »), le mot latin fut transformé en algorithmus . En 1596, cette forme du mot était utilisée en anglais, sous la forme « algorithm » , par Thomas Hood .
Définition
Histoire
Les premières traces d'algorithmes se trouvent dans les mathématiques de la Mésopotamie antique . Une tablette d'argile sumérienne découverte à Shuruppak, près de Bagdad , et datée d'environ 2500 av algorithme de division . Sous la dynastie d'Hammurabi babyloniennes décrivent des algorithmes de calcul. Les algorithmes étaient également utilisés en astronomie babylonienne . Des tablettes d'argile babyloniennes décrivent et mettent en œuvre des procédures algorithmiques pour calculer la date et le lieu d'événements astronomiques importants.
On trouve également des algorithmes arithmétiques dans les mathématiques de l'Égypte antique , notamment dans le papyrus mathématique de Rhind les mathématiques hellénistiques . On peut citer comme exemples le crible d'Ératosthène , décrit dans l' Introduction à l'arithmétique de Nicomaque [ et l' algorithme d'Euclide , présenté pour la première fois dans les Éléments d'Euclide ( Shulba Sutras , l' école du Kerala et le Brāhmasphuṭasiddhānta .
Au IXe siècle, Muḥammad ibn Mūsā al-Khwārizmī révolutionna le domaine en établissant l'algorithme comme une séquence systématique et finie d'étapes logiques permettant de résoudre des problèmes mathématiques. Dans son ouvrage influent, le Livre abrégé du calcul par complétion et équilibrage , il dépassa les solutions numériques spécifiques pour introduire des procédures générales de réduction et d'équilibrage algébriques. Ceci transforma les mathématiques en un processus « mécanique » régi par des règles bien définies – un changement fondamental qui jeta les bases de la théorie algorithmique moderne. La traduction latine de son traité d'arithmétique, intitulé Algoritmi de numero Indorum, donna naissance au terme « algorithme », dérivé de la latinisation de son nom, Algoritmi, pour décrire précisément cette nouvelle approche des mathématiques fondée sur des règles.
Le premier algorithme cryptographique de déchiffrement de code chiffré a été développé par Al-Kindi , un mathématicien arabe du IXe siècle, dans un manuscrit intitulé « Sur le déchiffrement des messages cryptographiques » . Il y donne la première description de la cryptanalyse par analyse fréquentielle , le tout premier algorithme de décryptage.
Ordinateurs
Horloges à poids
Les horloges à poids furent une invention européenne majeure au Moyen Âge , notamment le mécanisme d'échappement à verge produisant le tic-tac des horloges mécaniques. Les machines automatiques précises menèrent aux automates mécaniques au XIIIe siècle et aux machines à calculer – les machines à différences et analytiques de Charles Babbage et Ada Lovelace au milieu du XIXe siècle. Lovelace conçut le premier algorithme destiné à un ordinateur, la machine analytique de Babbage, le premier véritable ordinateur Turing-complet , surpassant les calculatrices mécaniques de l'époque. Bien que la réalisation complète de la seconde machine de Babbage n'ait eu lieu que des décennies après sa mort, Lovelace est considérée comme la première programmeuse de l'histoire.
Relais électromécanique
Le métier à tisser Jacquard , précurseur des cartes perforées , et les centraux téléphoniques ont conduit au développement des premiers ordinateurs. Au milieu du XIXe siècle, le télégraphe était répandu dans le monde entier. À la fin du XIXe siècle, le téléscripteur ( téléscripteur ( le code Baudot sur bande perforée.
Les réseaux de commutation téléphonique à relais électromécaniques ont été inventés en 1835. Ces travaux ont conduit à l'invention de l'additionneur numérique par George Stibitz en 1937. Alors qu'il travaillait aux Laboratoires Bell, il a constaté l'utilisation « lourde » des calculatrices mécaniques à engrenages, ce qui l'a incité à créer un additionneur numérique expérimental chez lui.
Formalisation

En 1928, une formalisation partielle du concept moderne d'algorithmes a débuté avec les tentatives de résolution du problème de décision (Entscheidungsproblem) de David Hilbert . Les formalisations ultérieures ont été conçues comme des tentatives de définition de la « calculabilité effective » ou de la « méthode effective » . Parmi ces formalisations, on peut citer les fonctions récursives de Gödel - Herbrand - Kleene (1930, 1934 et 1935), le lambda-calcul d' Alonzo Church (1936), la Formulation 1 d' Emil Post (1936) et les machines de Turing d' Alan Turing (1936-1937 et 1939).
Algorithmes modernes
Représentations
Les algorithmes peuvent être exprimés de diverses manières, notamment en langage naturel , en pseudocode , sous forme d'organigrammes , de diagrammes de Drakon , de langages de programmation ou de tables de contrôle . Les expressions en langage naturel sont souvent verbeuses et ambiguës, et sont rarement utilisées pour les algorithmes complexes ou techniques. Le pseudocode, les organigrammes, les diagrammes de Drakon et les tables de contrôle sont des représentations structurées des algorithmes qui permettent d'éviter les ambiguïtés courantes du langage naturel. Les langages de programmation servent principalement à exprimer les algorithmes sous une forme exécutable par ordinateur, mais ils sont également utilisés pour définir ou documenter les algorithmes.
Machines de Turing
Il existe de nombreuses représentations possibles, et les programmes de machines de Turing peuvent être exprimés sous forme de séquences de tables de machines (voir machine à états finis , table de transitions et table de contrôle pour plus d'informations), de diagrammes de flux et de diagrammes de Drakon (voir diagramme d'états pour plus d'informations), d'une forme rudimentaire de code machine ou de code assembleur appelée « ensembles de quadruplets », et bien plus encore. Les représentations d'algorithmes peuvent également être classées en trois niveaux de description de machines de Turing : description de haut niveau, description d'implémentation et description formelle. Une description de haut niveau décrit les propriétés de l'algorithme lui-même, sans préciser son implémentation sur la machine de Turing. Une description d'implémentation décrit la manière générale dont la machine déplace sa tête et stocke des données pour exécuter l'algorithme, mais ne donne pas les états exacts. La description formelle, la plus détaillée, fournit la table d'états et la liste des transitions exactes de la machine de Turing.
Représentation par organigramme
Un organigramme est une représentation graphique qui décrit et documente un algorithme. Il comporte quatre symboles principaux : des flèches indiquant le flux du programme, des rectangles (SÉQUENCE, ALLER À), des losanges représentant les décisions et des points (OU). Les sous-structures peuvent être imbriquées dans les rectangles, mais uniquement si la superstructure ne possède qu'une seule sortie.
Analyse algorithmique
Différents algorithmes peuvent accomplir la même tâche avec un ensemble d'instructions différent, en un temps, un espace ou un « effort » inférieur ou supérieur à celui d'autres algorithmes. Par exemple, un algorithme de recherche binaire (de coût ) est plus performant qu'une recherche séquentielle (de coût ) pour la consultation de listes triées.
formel versus empirique
Les tests empiriques sont utiles pour mettre en évidence les interactions inattendues qui affectent les performances. Des benchmarks peuvent être utilisés pour comparer les améliorations potentielles d'un algorithme avant et après optimisation du programme. Les tests empiriques ne peuvent pas remplacer entièrement l'analyse formelle et sont difficiles à réaliser de manière équitable.
Efficacité d'exécution
Meilleur et pire des cas
Programmation structurée
Tout algorithme peut être calculé par n'importe quel modèle Turing-complet . La complétude de Turing ne requiert que quatre types d'instructions : GOTO conditionnel, GOTO inconditionnel, affectation et HALT. Tausworthe enrichit les trois structures canoniques de Böhm-Jacopini : SEQUENCE, IF-THEN-ELSE et WHILE-DO, avec deux autres : DO-WHILE et CASE. Un autre avantage d'un programme structuré est qu'il se prête aux preuves de correction par récurrence .
Statut juridique
Classification
Par mise en œuvre
- Récursivité
- Un algorithme récursif s'exécute de manière répétée jusqu'à ce qu'une condition d'arrêt soit satisfaite ; c'est une technique courante en programmation fonctionnelle . Les algorithmes itératifs utilisent des répétitions, comme des boucles ou des structures de données telles que les piles, pour résoudre des problèmes. Certains problèmes se prêtent mieux à l'une ou l'autre implémentation. Les tours de Hanoï sont un exemple de casse-tête souvent résolu par une implémentation récursive. À chaque version récursive correspond une version itérative équivalente (plus ou moins complexe), et inversement.
- En série, en parallèle ou distribué
- On aborde généralement les algorithmes en supposant que les ordinateurs exécutent une instruction à la fois sur des systèmes séquentiels. Les algorithmes séquentiels sont conçus pour ces environnements, contrairement aux algorithmes parallèles ou distribués . Les algorithmes parallèles tirent parti des architectures informatiques où plusieurs processeurs peuvent traiter un problème simultanément. Les algorithmes distribués utilisent plusieurs machines connectées via un réseau. Les algorithmes parallèles et distribués divisent le problème en sous-problèmes et regroupent ensuite les résultats. La consommation de ressources de ces algorithmes inclut non seulement les cycles processeur de chaque processeur, mais aussi les communications entre les processeurs. Certains algorithmes de tri peuvent être parallélisés efficacement, mais leurs communications sont coûteuses. Les algorithmes itératifs sont généralement parallélisables, mais certains problèmes ne possèdent pas d'algorithmes parallèles et sont dits intrinsèquement séquentiels.
- Déterministe ou non déterministe
- Les algorithmes déterministes résolvent le problème en prenant des décisions exactes à chaque étape ; tandis que les algorithmes non déterministes le résolvent par conjecture. Ces conjectures sont généralement affinées grâce à l’utilisation d’ heuristiques .
- Exact ou approximatif
- Alors que de nombreux algorithmes convergent vers une solution exacte, les algorithmes d'approximation recherchent une approximation proche de la solution véritable. Ces algorithmes présentent un intérêt pratique pour de nombreux problèmes complexes. Par exemple, le problème du sac à dos , où l'objectif est de remplir un sac à dos avec un ensemble d'objets afin d'obtenir une valeur totale maximale. Chaque objet a un poids et une valeur. Le poids total transportable est limité à une valeur fixe X. La solution doit donc prendre en compte à la fois le poids et la valeur des objets.
- Algorithme quantique
- Les algorithmes quantiques s'appuient sur un modèle réaliste de calcul quantique . Ce terme est généralement employé pour désigner les algorithmes qui semblent intrinsèquement quantiques ou qui utilisent certaines caractéristiques essentielles du calcul quantique, telles que la superposition quantique ou l'intrication quantique .
Par paradigme de conception
Une autre façon de classer les algorithmes consiste à se baser sur leur méthodologie ou paradigme de conception . Voici quelques paradigmes courants :
- Recherche par force brute ou exhaustive
- La force brute est une méthode de résolution de problèmes qui consiste à tester systématiquement toutes les options possibles jusqu'à trouver la solution optimale. Cette approche peut s'avérer très chronophage, car elle implique de tester toutes les combinaisons de variables possibles. Elle est souvent utilisée lorsque d'autres méthodes sont indisponibles ou trop complexes. La force brute permet de résoudre divers problèmes, comme trouver le chemin le plus court entre deux points et déchiffrer des mots de passe.
- Diviser pour mieux régner
- Un algorithme de type « diviser pour régner » réduit itérativement un problème à une ou plusieurs instances plus petites de lui-même (généralement de manière récursive ) jusqu'à ce que ces instances soient suffisamment petites pour être résolues facilement. Le tri fusion est un exemple d'algorithme de ce type : une liste non triée est divisée en listes plus petites, triées de la même manière, puis fusionnées. Une variante plus simple, appelée algorithme d'élagage et de recherche (ou algorithme de réduction pour régner) , résout une instance plus petite du problème et ne nécessite pas d'étape de fusion. L'algorithme de recherche dichotomique est un exemple d'algorithme d'élagage et de recherche .
- Recherche et énumération
- De nombreux problèmes (comme jouer aux échecs ) peuvent être modélisés comme des problèmes de graphes . Un algorithme d'exploration de graphes définit des règles de déplacement et est utile pour ce type de problèmes. Cette catégorie inclut également les algorithmes de recherche , l'énumération par séparation et évaluation , et le retour arrière .
- Algorithme aléatoire
- Ces algorithmes effectuent certains choix de manière aléatoire (ou pseudo-aléatoire). Ils trouvent des solutions approchées lorsque la recherche de solutions exactes est impraticable (voir la méthode heuristique ci-dessous). Pour certains problèmes, les approximations les plus rapides nécessitent une part d'aléatoire . La question de savoir si les algorithmes randomisés de complexité polynomiale peuvent être les plus rapides pour certains problèmes est une question ouverte connue sous le nom de problème P versus NP . Il existe deux grandes classes de tels algorithmes :
- Les algorithmes de Monte Carlo fournissent une réponse correcte avec une forte probabilité. Par exemple, RP est une sous-classe de ces algorithmes qui s'exécutent en temps polynomial .
- Les algorithmes de Las Vegas renvoient toujours la bonne réponse, mais leur temps d'exécution n'est limité que de manière probabiliste, par exemple ZPP .
- Réduction de la complexité
- Cette technique transforme des problèmes complexes en problèmes plus connus, résolubles par des algorithmes (idéalement) asymptotiquement optimaux . L'objectif est de trouver un algorithme de réduction dont la complexité n'est pas dominée par celle des algorithmes réduits obtenus. Par exemple, un algorithme de sélection trouve la médiane d'une liste non triée en triant d'abord la liste (la partie coûteuse), puis en extrayant l'élément central de la liste triée (la partie peu coûteuse). Cette technique est également connue sous le nom de « transformer pour régner » .
- Retour en arrière
- Dans cette approche, plusieurs solutions sont construites progressivement et abandonnées lorsqu'il est déterminé qu'elles ne peuvent pas aboutir à une solution complète et valide.
Problèmes d'optimisation
Pour les problèmes d'optimisation, il existe une classification plus spécifique des algorithmes ; un algorithme pour de tels problèmes peut appartenir à une ou plusieurs des catégories générales décrites ci-dessus, ainsi qu'à l'une des suivantes :
- Programmation linéaire
- Lorsqu'on recherche des solutions optimales pour une fonction linéaire soumise à des contraintes d'égalité et d'inégalité linéaires, ces contraintes peuvent être utilisées directement pour obtenir ces solutions optimales. Il existe des algorithmes capables de résoudre tout problème de cette catégorie, comme le célèbre algorithme du simplexe . Parmi les problèmes résolubles par programmation linéaire figure le problème du flot maximal pour les graphes orientés. Si un problème impose également que certaines inconnues soient des entiers , il relève alors de la programmation linéaire en nombres entiers . Un algorithme de programmation linéaire peut résoudre un tel problème s'il est possible de démontrer que toutes les restrictions sur les valeurs entières sont superficielles, c'est-à-dire que les solutions satisfont de toute façon ces restrictions. Dans le cas général, on utilise un algorithme spécialisé ou un algorithme de recherche de solutions approchées, selon la difficulté du problème.
- Programmation dynamique
- Lorsqu'un problème présente des sous-structures optimales (c'est-à-dire que la solution optimale peut être construite à partir des solutions optimales de sous-problèmes) et des sous-problèmes qui se chevauchent (c'est-à-dire que les mêmes sous-problèmes servent à résoudre plusieurs instances différentes du problème), une approche plus rapide appelée programmation dynamique évite de recalculer les solutions. Par exemple, l'algorithme de Floyd-Warshall permet de trouver le plus court chemin entre un sommet de départ et un sommet d'arrivée dans un graphe pondéré en utilisant le plus court chemin vers l'arrivée depuis tous les sommets adjacents. La programmation dynamique et la mémoïsation sont étroitement liées. Contrairement à l'approche « diviser pour régner », les sous-problèmes de la programmation dynamique se chevauchent souvent. La différence entre la programmation dynamique et la récursivité simple réside dans la mise en cache ou la mémoïsation des appels récursifs. Lorsque les sous-problèmes sont indépendants et ne se répètent pas, la mémoïsation est inutile ; la programmation dynamique n'est donc pas applicable à tous les problèmes complexes. Grâce à la mémoïsation, la programmation dynamique réduit la complexité de nombreux problèmes d'exponentielle à polynomiale.
- La méthode avide
- Les algorithmes gloutons , à l'instar de la programmation dynamique, fonctionnent en examinant des sous-structures, non pas du problème lui-même, mais d'une solution donnée. Ces algorithmes partent d'une solution et l'améliorent par petites modifications. Pour certains problèmes, ils trouvent toujours la solution optimale, tandis que pour d'autres, ils peuvent s'arrêter à des optima locaux . L'application la plus courante des algorithmes gloutons est la recherche d'arbres couvrants minimaux de graphes sans cycles négatifs. Les algorithmes de Huffman , de Kruskal , de Prim et de Sollin sont des exemples d'algorithmes gloutons capables de résoudre ce problème d'optimisation.
- La méthode heuristique
- Dans les problèmes d'optimisation , les algorithmes heuristiques trouvent des solutions proches de la solution optimale lorsque la recherche de cette dernière est impraticable. Ces algorithmes s'en approchent progressivement. En principe, s'ils étaient exécutés indéfiniment, ils finiraient par trouver la solution optimale. Idéalement, ils peuvent trouver une solution très proche de l'optimum en un temps relativement court. Parmi ces algorithmes, on trouve la recherche locale , la recherche tabou , le recuit simulé et les algorithmes génétiques . Certains, comme le recuit simulé, sont non déterministes, tandis que d'autres, comme la recherche tabou, sont déterministes. Lorsqu'une borne supérieure de l'erreur de la solution non optimale est connue, l'algorithme est alors qualifié d' algorithme d'approximation .
Exemples
Algorithme LargestNumber Entrée : Une liste de nombres L .Résultat : Le plus grand nombre de la liste L.
Si L.size = 0, retourner null. largest ← L [0]. Pour chaque élément de L , si élément > largest , alors largest ← élément. Retourner le plus grand.
- " ← " désigne une affectation . Par exemple, " largest ← item " signifie que la valeur de largest change pour la valeur de item .
- La fonction « return » termine l'algorithme et renvoie la valeur suivante.
Découverte d'algorithmes assistée par l'IA
En 2025, Google DeepMind a introduit AlphaEvolve , un agent de programmation évolutionnaire s'appuyant sur de vastes modèles de langage pour la découverte et l'optimisation d'algorithmes à usage général. AlphaEvolve utilise des modèles de langage pour proposer des modifications de code, des évaluateurs automatisés pour tester les solutions candidates et un processus évolutionnaire pour améliorer les algorithmes prometteurs au fil de plusieurs itérations.