Nous ne ferons pas des algorithmes pour le plaisir : un algorithme doit fournir une solution à un problème.
Il est donc primordial de savoir exactement ce que nous désirons faire (analyse du problème).
Ensuite, nous devons donc savoir ce que peut réaliser le processeur, pour déterminer le type et le niveau d'affinage auquel nous devrons soumettre notre algorithme.
Il faut savoir que le processeur ne peut réaliser que de très simples opérations. Il est de plus totalement dépourvu de tout sens de l'initiative. Comment dès lors lui demander de faire quelque chose?
Nous devons tenter de découper ce que nous désirons faire en une multitude de tâches plus simples, ces tâches étant elles aussi découpées en sous tâches, jusqu'au moment ou nous nous trouvons en possession d'une liste d'instructions que nous pouvons fournir au processeur car il en comprend la signification.
Un algorithme est donc une manière de décrire les différentes actions à entreprendre; il doit pouvoir être compris par une autre personne, exempt de toute ambiguïté, indépendant de tout langage de programmation, concis, et facilement découpé en séquences.
Je peux dire à quelqu'un : "sert moi une tasse de café, s'il te plait".
En admettant que la personne comprenne ma langue ( et soit assez aimable ), il est probable que cette phrase suffise.
Il est impossible de demander une tasse de café de la même manière à un processeur.
Je dois donc découper ma demande :
Nous avons donc notre premier algorithme.
Comme notre processeur ne sait toujours pas ce que signifie "faire bouillir de l'eau", nous devons affiner l'algorithme :
Nous devons donc affiner notre algorithme jusqu'au moment où chaque instruction peut être réalisée par le processeur.
Avant d'aller plus en avant, il est important de comprendre les notions de syntaxe et de sémantique.
Ces deux notions sont étroitement liées à notre futur algorithme, et en cas d'erreur, nous situerons précisément ce qu'il faut corriger.
Lors de l'utilisation d'un IDE (environnement intégré de développement), les messages d'erreurs retournés par notre compilateur spécifieront par exemple si l'erreur est syntaxique.
La syntaxe est un ensemble de conventions qui régissent l'écriture.
Par exemple, chaque phrase débute par une majuscule et se termine par un point.
La sémantique est le sens, la signification de la phrase ou de l'instruction.
Par exemple, la phrase "Un est plus grand que deux." est syntaxiquement correcte, mais présente une erreur de sémantique.
Exemple : calcul de l'addition de deux nombres a et b.
r = a - b ;
Une erreur de logique ne peut être détectée par le compilateur : les instructions s'effectuent correctement, mais le résultat n'est pas celui attendu.
r = a; + b
Le délimiteur de fin d'instruction (;) est placé au milieu de l'instruction.
Une erreur de syntaxe est détectée à la compilation.
r = a + 'b' ;
Le programme est prévu pour additionner deux nombres, et b est considéré ici comme un caractère et pas comme une variable.
La syntaxe de l'instruction est correcte, mais pas la sémantique.
Une erreur de sémantique est détectée à la compilation.
Nous verrons dans les pages suivantes que diverses notions nous seront nécessaires dans la conception des algorithmes :
La structure de nos algorithmes répondra le plus souvent à trois grands principes :
Avant de travailler sur un algorithme, nous devons nous poser quelques questions :
Nous pouvons considérer la complexité d'un algorithme de différentes manières : dans le temps (temps nécessaire àl'exécution), dans l'espace (quantité de mémoire nécessaire), au niveau des resources (charge du processeur, etc.), mais nous allons nous intéresser ici à la complexité en temps en fonction de la quantité de données à traiter, sans dépendre de facteurs extérieurs tels que la machine sur laquelle l'algorithme est exécuté. Nous parlerons d'ordre de grandeur.
Afin de donner un ordre de gandeur de la complexité d'un algorithme, nous utiliserons la notion d'instruction élémentaire.
Tp(n) correspond au Temps d'exécution de p en fonction de la taille de données n (dans le pire des cas), ce qui correspond au nombre maximal d'instructions élémentaires qui seront exécutées par p sur n'importe quelle entrée de taille n.
Nous pouvons utiliser différentes notations pour spécifier un ordre de grandeur. La notation la plus répendue est Θ, mais nous retrouvons aussi souvent une sorte de O majuscule :
(c'est le cas par défaut sur ce site, mais vous pouvez le modifier par le lien en bas de page).
(f(n)) ≤
(g(n()) ∧
(f(n)) ≤
(f(n())
La complexité de l'algorithme
(f(n)) s'exprime donc en fonction de la quantité n de données à traiter par une fonction f.
La notation correcte est f(n) ∈
(n), ce qui signifie que la fonction f qui traite une taille de données n appartient à l'ordre de grandeur de n, mais nous utilisons souvent la notation f(n) =
(n) par abus de notation.
Le tableau ci-dessous reprend donc les complexités des algorithmes les plus fréquentes.
| Notation | Type de complexité | Exemple | |
|---|---|---|---|
| complexité constante (indépendante de la taille de la donnée) | fonction head() | ||
| complexité logarithmique (ou sub-linéaires) | |||
| complexité linéaire | recherche simple du plus grand élément d'un tableau | ||
| complexité quasi-linéaire | tri par fusion | ||
| complexité quadratique | tri par sélection | ||
| complexité cubique | multiplication de matrices | ||
| complexité quasi-polynomiale | |||
| complexité polynomiale | |||
| complexité superpolynomiale | |||
| complexité exponentielle | borne supérieure d'un calcul inéfficace d'une suite de Fibonacci | ||
| complexité superexponentielle | |||
| complexité factorielle |
Situation : variable n ≥ 0, constantes k, l ≥ 0, fonction f(n) ≥ 0
| Théorème | Condition | Informations |
|---|---|---|
| Multiplier une fondtion par une constante ne modifie pas l'ordre de grandeur de la fonction | ||
| si | Nous conservons celui qui croît le plus rapidement | |
| si 0 ≤ k ≤ l | ||
| si k > 1 | Les fonctions exponentielles croissent plus rapidement que les fonctions polynomes | |
| si k > l | Dans le cas de 2 fonctions de même exposant, nous conservons la plus grande base | |
| si |
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
13 mots clés dont 0 définis manuellement (plus d'information...).
Avertissement
Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Cours de Méthodes de Programmation(Septembre 2009)
Algorithms, programs and programming languages(2004)
Processing Algorithms(2004)
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)