---
# System prepended metadata

title: Compléxité algorithmique
tags: [algorithmie]

---

---
title: Compléxité algorithmique
tags: algorithmie
robots: noindex, nofollow
author: Julien Noyer
---

# Compléxité algorithmique 
## Définition et calcul


![](https://i.imgur.com/NfgUofX.jpg)

L'analyse de la complexité d'un algorithme consiste en l'étude formelle de la quantité de ressources nécessaire à l'exécution de cet algorithme, celle-ci ne doit pas être mal comprise : lorsque l'on par de complexité c'est celle que la machine qui exécutera l'algorithme devra passer et pas la personne qui rédige l'algorithme.

Quand les scientifiques ont voulu énoncer formellement et rigoureusement ce qu'est l'efficacité d'un algorithme ou au contraire sa complexité, ils se sont rendu compte que la comparaison des algorithmes entre eux était nécessaire et que les outils pour le faire à l'époque1 étaient primitifs. Dans la préhistoire de l'informatique (les années 1950), la mesure publiée quand elle existait, était souvent dépendante de facteurs non-relatif à l'algorithme à traiter mais à la machine qui l'exécutera.

L'approche la plus classique utiliser pour calculer la complexité d'un algorithme est de calculer le temps de calcul dans le pire des cas nécessaire pour l'exécution de l'algorithme.

## Calculer la complexité d'un algorithme

Il est possible d'écrire différents algorithmes pour atteindre un même résultat, par exemple calculer le fait qu'un utilisateur soit majeur ou pas, mais comment savoir lequel sera le plus efficace cotés machine et qui demandera le moins de ressources matérielles ?  Pour le savoir nous allons analyser un algorithme simple dont voici la définition :

```bash
FUNCTION check_user_age( a: INTEGER, b: INTEGER )
  START
    IF age > 18 THE
      PRINT("User is major")

    ELSE
      PRINT("User is not major")

    END IF
  END
/FUNCTION
```

L'analyse de cette algorithme nous permet de faire quelques constats :

- Le code est lu de haut en bas
- Pour répondre à la condition IF _age_ doit être supérieur à 18
- La condition ELSE est déclencher uniquement si la condition IF n'est pas remplie

Nous pouvons donc considérer que pour que l'algorithme s'exécute le plus rapidement il faut que le paramètre _age_ soit supérieur à 18 ce que nous nommerons lexécution __idéale__ de l'agorithme. Pour en calculer sa complexité nous allons donc le pire des scénarios : que ce passe-t-il si _age_ est égal à 10 ?

Pour calculer la complexité d'un algorithme il faut prendre en compte le pire des scénarios et associer un point pour chaque opération élémentaire : 

- affectation
- calcul
- comparaison

Passons à présent au calcul de la complexité de l'algorithme suivant :

```bash
FUNCTION check_number()
  // Declare
  a: INTEGER, 
  b: INTEGER

  START
    a <- 14
    PRINT("Number a is ", a)

    b <- a - 5
    PRINT("Number b is ", b)

  END
/FUNCTION
```

### Calcule de la complexité d'un algorithme simple

Nous commençons par calculer chaque opération élémentaires

- a <- 14 = 1
- b <- a - 5 = 1
- a - 5 = 1
- __Total__ = 3

La complexité de l'algorithme est donc de __3__ sur une échelle de temps, c'est à dire que qu'à chaque fois qu'il est répéter il faudra multiplier par 3 ne temps d'exécution. La syntaxe pour d'écrire la complexité de cette algorithme est :

```bash
T(n) = 3
```

## Calcule de la complexité d'un algorithme compliqué

Passons à présent au calcule de la complexité d'un algorithme plus compliqué :

```bash
FUNCTION total(n: NUMBER): NUMBER
  // Declare
  1: INTEGER, 
  response: INTEGER

  START
    response <- 0

    FOR i FROM 0 TO n [ i <- i + 1 ] 
      response <- response + i

    END FOR

    RETURN response

  END
/FUNCTION
```

Commençons par calculer les opérations élémentaires :

- response <- 0 = 1
- __Total__ = 1


Nous retenons le résultat et passons au calcule de la boucle

- i FROM 0 = 1
- 0 TO n = 1
- i <- i + 1 = 1
- i + 1 = 1
- response <- response + i = 1
- response + i = 1


La complexité de l'algorithme est donc de __6n + 1__ sur une échelle de temps dont la syntaxe pour la d'écrire est :

```bash
T(n) = 6n + 1
```