Qu'est-ce que la notation Big-O ?

Qu'est-ce que la notation Big-O ?

Vous êtes-vous déjà demandé pourquoi un programme que vous avez écrit prenait autant de temps à s'exécuter ? Vous aimeriez peut-être savoir si vous pouvez rendre votre code plus efficace. Comprendre comment le code s'exécute peut amener votre code au niveau supérieur. La notation Big-O est un outil pratique pour calculer l'efficacité réelle de votre code.



Qu'est-ce que la notation Big-O ?

La notation Big-O vous permet de calculer combien de temps il faudra pour exécuter votre code. Vous pouvez chronométrer physiquement la durée d'exécution de votre code, mais avec cette méthode, il est difficile de détecter de petites différences de temps. Par exemple, le temps qu'il faut entre l'exécution de 20 et 50 lignes de code est très court. Cependant, dans un grand programme, ces inefficacités peuvent s'additionner.



app zone ar qu'est-ce que c'est

La notation Big-O compte le nombre d'étapes qu'un algorithme doit exécuter pour évaluer son efficacité. Aborder votre code de cette manière peut être très efficace si vous devez ajuster votre code pour augmenter l'efficacité. La notation Big-O vous permettra de mesurer différents algorithmes par le nombre d'étapes nécessaires à leur exécution et de comparer objectivement l'efficacité des algorithmes.





Comment calculez-vous la notation Big-O

Considérons deux fonctions qui comptent le nombre de chaussettes individuelles dans un tiroir. Chaque fonction prend le nombre de paires de chaussettes et renvoie le nombre de chaussettes individuelles. Le code est écrit en Python, mais cela n'affecte pas la façon dont nous comptons le nombre d'étapes.

Algorithme 1 :



def sockCounter(numberOfPairs):
individualSocks = 0
for x in range(numberOfPairs):
individualSocks = individualSocks + 2
return individualSocks

Algorithme 2 :

def sockCounter(numberOfPairs):
return numberOfPairs * 2

C'est un exemple idiot, et vous devriez être capable de dire facilement quel algorithme est le plus efficace. Mais pour la pratique, passons en revue chacun.

EN RELATION: Qu'est-ce qu'une fonction en programmation ?

L'algorithme 1 comporte plusieurs étapes :

  1. Il attribue une valeur de zéro à la variable individualSocks.
  2. Il attribue une valeur de un à la variable i.
  3. Il compare la valeur de i à numberOfPairs.
  4. Il ajoute deux à individualSocks.
  5. Il s'attribue la valeur accrue de individualSocks.
  6. Il incrémente i de un.
  7. Il boucle ensuite les étapes 3 à 6 pour le même nombre de fois que (indiviualSocks - 1).

Le nombre d'étapes que nous devons effectuer pour l'algorithme 1 peut être exprimé comme suit :

4n + 2

Il y a quatre étapes que nous devons effectuer n fois. Dans ce cas, n serait égal à la valeur de numberOfPairs. Il y a aussi 2 étapes qui sont complétées une fois.

En comparaison, l'algorithme 2 n'a qu'une étape. La valeur de numberOfPairs est multipliée par deux. Nous exprimerions cela comme :

1

Si ce n'était pas déjà évident, nous pouvons maintenant facilement voir que l'algorithme 2 est un peu plus efficace.

Analyse Big-O

Généralement, lorsque vous vous intéressez à la notation Big-O d'un algorithme, vous vous intéressez davantage à l'efficacité globale et moins à l'analyse fine du nombre d'étapes. Pour simplifier la notation, nous pouvons simplement indiquer l'ampleur de l'efficacité.

Dans les exemples ci-dessus, l'algorithme 2 serait exprimé comme un :

O(1)

Mais l'algorithme 1 serait simplifié comme suit :

O(n)

Cet instantané rapide nous dit comment l'efficacité de l'algorithme un est liée à la valeur de n. Plus le nombre est élevé, plus l'algorithme devra effectuer d'étapes.

Code linéaire

Crédit d'image: Nick Fledderus/ Projet

Comme nous ne connaissons pas la valeur de n, il est plus utile de réfléchir à la façon dont la valeur de n affecte la quantité de code à exécuter. Dans l'algorithme 1, on peut dire que la relation est linéaire. Si vous tracez le nombre de pas en fonction de la valeur de n, vous obtenez une ligne droite qui monte.

Code quadratique

Toutes les relations ne sont pas aussi simples que l'exemple linéaire. Imaginez que vous ayez un tableau 2D et que vous vouliez rechercher une valeur dans le tableau. Vous pouvez créer un algorithme comme celui-ci :

def searchForValue(targetValue, arraySearched):
foundTarget = False
for x in arraySearched:
for y in x:
if(y == targetValue):
foundTarget = True
return foundTarget

Dans cet exemple, le nombre d'étapes dépend du nombre de tableaux dans arraySearched et du nombre de valeurs dans chaque tableau. Ainsi, le nombre simplifié d'étapes serait n * n ou n².

l'ordinateur ne voit pas le disque dur externe

Crédit d'image: Nick Fledderus/ Projet

Cette relation est une relation quadratique, ce qui signifie que le nombre d'étapes de notre algorithme croît de façon exponentielle avec n. En notation Big-O, vous l'écririez comme suit :

O(n²)

EN RELATION: Outils utiles pour vérifier, nettoyer et optimiser les fichiers CSS

Code logarithmique

Bien qu'il existe de nombreuses autres relations, la dernière relation que nous examinerons est celle des relations logarithmiques. Pour vous rafraîchir la mémoire, le log d'un nombre est la valeur de l'exposant nécessaire pour atteindre un nombre donné une base. Par exemple:

log 2 (8) = 3

Le log est égal à trois car si notre base était 2, nous aurions besoin d'une valeur d'exposant de 3 pour arriver au nombre 8.

Crédit d'image: Nick Fledderus/ Projet

Ainsi, la relation d'une fonction logarithmique est l'opposé d'une relation exponentielle. À mesure que n augmente, moins de nouvelles étapes sont nécessaires pour exécuter l'algorithme.

À première vue, cela semble contre-intuitif. Comment les pas d'un algorithme peuvent-ils croître plus lentement que n ? Les recherches binaires en sont un bon exemple. Considérons un algorithme pour rechercher un nombre dans un tableau de valeurs uniques.

  • Nous allons commencer par un tableau à rechercher dans l'ordre du plus petit au plus grand.
  • Ensuite, nous allons vérifier la valeur au milieu du tableau.
  • Si votre nombre est supérieur, nous exclurons les nombres inférieurs de notre recherche et si le nombre était inférieur, nous exclurons les nombres supérieurs.
  • Maintenant, nous allons regarder le nombre du milieu des nombres restants.
  • Encore une fois, nous exclurons la moitié des nombres selon que notre valeur cible est supérieure ou inférieure à la valeur médiane.
  • Nous continuerons ce processus jusqu'à ce que nous trouvions notre cible ou que nous déterminions qu'elle ne figure pas dans la liste.

Comme vous pouvez le voir, étant donné que les recherches binaires éliminent la moitié des valeurs possibles à chaque passage, à mesure que n augmente, l'effet sur le nombre de fois que nous vérifions le tableau est à peine affecté. Pour exprimer cela en notation Big-O, nous écririons :

O(log(n))

L'importance de la notation Big-O

Big-O nation vous offre un moyen simple et rapide de communiquer l'efficacité d'un algorithme. Cela facilite le choix entre différents algorithmes. Cela peut être particulièrement utile si vous utilisez un algorithme d'une bibliothèque et que vous ne savez pas nécessairement à quoi ressemble le code.

comment éditer des fichiers audio sur mac

Lorsque vous apprenez à coder pour la première fois, vous commencez avec des fonctions linéaires. Comme vous pouvez le voir sur le graphique ci-dessus, cela vous mènera très loin. Mais à mesure que vous devenez plus expérimenté et commencez à créer un code plus complexe, l'efficacité commence à devenir un problème. Une compréhension de la façon de quantifier l'efficacité de votre code vous donnera les outils dont vous avez besoin pour commencer à le régler pour plus d'efficacité et peser le pour et le contre des algorithmes.

Partager Partager Tweeter E-mail 10 erreurs de programmation et de codage les plus courantes

Les erreurs de codage peuvent entraîner tant de problèmes. Ces conseils vous aideront à éviter les erreurs de programmation et à garder votre code significatif.

Lire la suite
Rubriques connexes
  • La programmation
  • La programmation
A propos de l'auteur Jennifer Seaton(21 articles publiés)

J. Seaton est un écrivain scientifique spécialisé dans la décomposition de sujets complexes. Elle détient un doctorat de l'Université de la Saskatchewan; ses recherches se sont concentrées sur l'utilisation de l'apprentissage basé sur le jeu pour augmenter l'engagement des étudiants en ligne. Lorsqu'elle ne travaille pas, vous la trouverez avec elle en train de lire, de jouer à des jeux vidéo ou de jardiner.

Plus de Jennifer Seaton

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner