un algorithme est une procédure spécifique pour résoudre un problème de calcul bien défini. Le développement et l’analyse d’algorithmes sont fondamentaux pour tous les aspects de l’informatique: intelligence artificielle, bases de données, graphiques, réseaux, systèmes d’exploitation, sécurité, etc. Le développement d’algorithmes est plus qu’une simple programmation., Cela nécessite une compréhension des alternatives disponibles pour résoudre un problème de calcul, y compris le matériel, la mise en réseau, le langage de programmation et les contraintes de performance qui accompagnent toute solution particulière. Il faut également comprendre ce que signifie pour un algorithme d’être” correct  » dans le sens où il résout pleinement et efficacement le problème à portée de main.

Une notion d’accompagnement est la conception d’une structure de données particulière qui permet à un algorithme de s’exécuter efficacement., L’importance des structures de données provient du fait que la mémoire centrale d’un ordinateur (où les données sont stockées) est linéaire, constituée d’une séquence de cellules de mémoire qui sont en série numérotée 0, 1, 2,…. Ainsi, la structure de données la plus simple est un tableau linéaire, dans lequel les éléments adjacents sont numérotés avec des « index” entiers consécutifs et la valeur d’un élément est accessible par son index unique. Un tableau peut être utilisé, par exemple, pour stocker une liste de noms, et des méthodes efficaces sont nécessaires pour rechercher et récupérer efficacement un nom particulier du tableau., Par exemple, le tri de la liste Par Ordre alphabétique permet d’utiliser une technique de recherche dite binaire, dans laquelle le reste de la liste à rechercher à chaque étape est coupé en deux. Cette technique de recherche est similaire à la recherche d’un nom particulier dans un annuaire téléphonique. Savoir que le livre est dans l’ordre alphabétique permet de se tourner rapidement vers une page qui est proche de la page contenant le nom souhaité. De nombreux algorithmes ont été développés pour trier et rechercher efficacement des listes de données.,

bien que les éléments de données soient stockés consécutivement en mémoire, ils peuvent être liés entre eux par des pointeurs (essentiellement, des adresses de mémoire stockées avec un élément pour indiquer où se trouvent le ou les éléments suivants de la structure) afin que les données puissent être organisées de manière similaire à celles dans lesquelles elles seront accessibles. La structure la plus simple est appelée liste chaînée, dans laquelle les éléments stockés de manière non concontigueuse peuvent être accédés dans un ordre pré-spécifié en suivant les pointeurs d’un élément de la liste à l’autre., La liste peut être circulaire, le dernier élément pointant vers le premier, ou chaque élément peut avoir des pointeurs dans les deux sens pour former une liste doublement liée. Des algorithmes ont été développés pour manipuler efficacement de telles listes en recherchant, en insérant et en supprimant des éléments.

Les pointeurs offrent également la possibilité d’implémenter des structures de données plus complexes. Un graphique, par exemple, est un ensemble de nœuds (éléments) et de liens (appelés arêtes) qui relient des paires d’éléments., Un tel graphique pourrait représenter un ensemble de villes et les autoroutes qui les rejoignent, la disposition des éléments de circuit et des fils de connexion sur une puce mémoire, ou la configuration des personnes interagissant via un réseau social. Les algorithmes de graphe typiques incluent des stratégies de traversée de graphe, telles que la façon de suivre les liens d’un nœud à l’autre (peut-être la recherche d’un nœud avec une propriété particulière) de manière à ce que chaque nœud ne soit visité qu’une seule fois. Un problème connexe est la détermination du chemin le plus court entre deux nœuds donnés sur un graphe arbitraire. (Voir la théorie des graphes.,) Un problème d’intérêt pratique dans les algorithmes de réseau, par exemple, est de déterminer combien de liens « cassés” peuvent être tolérés avant que les communications commencent à échouer. De même, dans la conception de puces D’intégration à très grande échelle (VLSI), il est important de savoir si le graphique représentant un circuit est Plan, c’est-à-dire s’il peut être dessiné en deux dimensions sans aucun lien se croisant (fils se touchant).

la complexité (informatique) d’un algorithme est une mesure de la quantité de ressources informatiques (temps et espace) qu’un algorithme particulier consomme lorsqu’il s’exécute., Les informaticiens utilisent des mesures mathématiques de la complexité qui leur permettent de prédire, avant d’écrire le code, la vitesse de fonctionnement d’un algorithme et la quantité de mémoire nécessaire. Ces prédictions sont des guides importants pour les programmeurs implémentant et sélectionnant des algorithmes pour des applications réelles.,

la complexité de calcul est un continuum, en ce sens que certains algorithmes nécessitent un temps linéaire (c’est-à-dire que le temps requis augmente directement avec le nombre d’éléments ou de nœuds dans la liste, le graphique ou le réseau en cours de traitement), tandis que d’autres nécessitent un temps quadratique ou même exponentiel pour À l’extrémité de ce continuum se trouvent les mers troubles des problèmes insolubles—ceux dont les solutions ne peuvent pas être mises en œuvre efficacement., Pour ces problèmes, les informaticiens cherchent à trouver des algorithmes heuristiques qui peuvent presque résoudre le problème et s’exécuter dans un délai raisonnable.

Plus loin encore, des problèmes algorithmiques qui peut être dit, mais ne sont pas solvables, c’est, on peut prouver qu’aucun programme ne peut être écrit pour résoudre le problème. Un exemple classique d’un problème algorithmique insoluble est le problème d’arrêt, qui stipule qu’aucun programme ne peut être écrit qui peut prédire si un autre programme s’arrête après un nombre fini d’étapes., L’inviolabilité du problème d’arrêt a une incidence pratique immédiate sur le développement de logiciels. Par exemple, il serait frivole d’essayer de développer un outil logiciel qui prédit si un autre programme en cours de développement a une boucle infinie (bien qu’avoir un tel outil serait extrêmement bénéfique).