logo

Algorithmique


Algorithmique : encyclopédie mathématiques

wikipediaCet article est issu de l'encyclopédie libre Wikipedia.
Vous pouvez consulter l'article ici ainsi que son historique.
Les textes et les images sont disponibles sous les termes de la Licence de documentation libre GNU.
Organigramme de programmation représentant l'algorithme d'Euclide

L'algorithmique est l’ensemble des règles et des 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 les étapes vers le résultat. En d'autres termes, un algorithme est une suite finie et non-ambiguë d’instructions permettant de donner la réponse à un problème.

Si les instructions d'un algorithme s’exécutent les unes après les autres, l'algorithme est dit séquentiel, si elles s’exécutent en même temps, il est parallèle. Si l'algorithme exploite des tâches s’exécutant sur un réseau de processeurs on parle d’algorithme réparti, ou distribué.

Le mot « algorithme Â» vient du nom du mathĂ©maticien Al Khuwarizmi (latinisĂ© au Moyen Ă‚ge en Algoritmi), qui, au IXe siècle Ă©crivit le premier ouvrage systĂ©matique sur la solution des Ă©quations linĂ©aires et quadratiques.

Sommaire

[modifier] Histoire

[modifier] 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.

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 convergence.

[modifier] Étude systématique

Le premier à avoir systématisé des algorithmes est le mathématicien arabophone Al Khuwarizmi, 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 arabe 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 logicien 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.

L’utilisation du terme algorithme est remarquable chez Ada Lovelace, fille de Lord Byron et assistante de Charles Babbage (1791-1871).

[modifier] Vocabulaire

Le substantif algorithmique désigne la méthode utilisant des algorithmes. Le terme est également employé comme adjectif.

Un algorithme énonce une résolution sous la forme d’une série d’opérations à effectuer. La mise en œuvre de l’algorithme consiste en l’écriture de ces opérations dans un langage de programmation et constitue alors la brique de base d’un programme informatique.

Les informaticiens utilisent frĂ©quemment l’anglicisme implĂ©mentation pour dĂ©signer cette mise en Ĺ“uvre. L’écriture en langage informatique est aussi frĂ©quemment dĂ©signĂ©e par le terme « codage Â», qui n’a ici aucun rapport avec la cryptographie, mais qui se rĂ©fère au terme « code source Â» pour dĂ©signer le texte, en langage de programmation, constituant le programme. L’algorithme devra ĂŞtre 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.

[modifier] Étude formelle

De nombreux outils formels ou thĂ©ories 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.

[modifier] 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.

[modifier] 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ée la garantie qu'un algorithme terminera, la preuve de correction doit apporter l'assurance que si l'algorithme termine en donnant une proposition de solution, alors cette solution est correcte — c'est-à-dire qu'elle est effectivement une solution au problème posé.

La preuve de complétude garantit que, pour un espace de problèmes donné, l'algorithme, s'il termine, donnera des propositions de solutions.

[modifier] Complexité algorithmique

Article dĂ©taillĂ© : ThĂ©orie de la complexitĂ© des algorithmes.

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é
O(1) complexité constante (indépendante de la taille de la donnée)
O(log(n)) complexité logarithmique
O(n) complexité linéaire
O(nlog(n)) complexité quasi-linéaire
O(n2) complexité quadratique
O(n3) complexité cubique
O(np) complexité polynomiale
O(nlog(n)) complexité quasi-polynomiale
O(2n) complexité exponentielle
O(n!) 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 répartissent les problèmes (plutôt que les algorithmes) en classes de complexité.

[modifier] Quelques indications sur l’efficacité des algorithmes

Souvent, l’efficacitĂ© d’un algorithme n’est 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Ă© supĂ©rieure 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 les plus efficaces en moyenne) : l’algorithme de tri le plus trivial sera suffisamment efficace.

Entre deux algorithmes dont la complexité est identique, on cherchera à utiliser celui dont l’occupation mémoire est la plus faible. 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 Quicksort (ou 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.

Un autre paramètre à prendre en compte est la localité de l’algorithme. Par exemple pour un système à mémoire virtuelle qui dispose de peu de mémoire (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).

Enfin, il existe certains algorithmes dont la complexité est dite amortie. Cela signifie que, pour certaines exécutions de l’algorithme (cas marginaux), la complexité de l’algorithme sera très supérieure au cas moyen. Bien sûr, on n’utilise la notion de complexité amortie que dans les cas où cette réaction est très marginale.

[modifier] 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 ne regardant que les cas simples, ou ceux apparaissant le plus souvent. 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)
  • alĂ©atoire, ou par approximations successives : certains algorithmes utilisent des recherches alĂ©atoires, ou par approches successives, donnant de meilleurs rĂ©sultats (en moyenne) que des recherches directes ou explicites.
  • dĂ©composition top-down / bottom-up : les dĂ©compositions top-bottom 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.

[modifier] 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 une solution la plus proche possible d’une solution optimale en procédant par essais successifs. 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 afin de trouver celle répondant au problème, mais de trouver une solution approchée convenable (qui peut être exacte dans certains cas) dans un temps raisonnable. 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.

[modifier] 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 pour le Tapis de SierpiĹ„ski (programme informatique), la Courbe du dragon, le flocon, …
  • 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 et le calcul d'une base de Gröbner d'un idĂ©al de polynĂ´me,
    • en thĂ©orie des graphes qui donne lieu Ă  de nombreux algorithmes.
  • 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)

[modifier] Voir aussi

Sur les autres projets Wikimedia :

[modifier] Articles connexes

  • Al-Khuwarizmi
  • Algorithme rĂ©cursif
  • Algorithme rĂ©parti
  • Algorithme Ă©mergent
  • Algorithme adaptatif
  • Liste des algorithmes
  • MĂ©taheuristique
  • Recherche opĂ©rationnelle


wikipediaCet article est issu de l'encyclopédie libre Wikipedia.
Vous pouvez consulter l'article ici ainsi que son historique.
Les textes et les images sont disponibles sous les termes de la Licence de documentation libre GNU.


maths haut de pagehaut Retrouvez cette page sur ilemaths l'île des mathématiques
© Tom_Pascal & Océane 2012