web-dev-qa-db-fra.com

que signifie O(N) signifie

Duplicata possible:
Qu'est-ce que la notation Big O? L'utilisez-vous?

Salut à tous,

question de notation d'évolutivité assez basique.

J'ai récemment reçu un commentaire sur un article que mon python commande de liste ordonnée ", mais attention à ce que votre implémentation" d'ensemble ordonné "soit O(N) pour les insertions) "

C'est super à savoir, mais je ne sais pas ce que cela signifie.

J'ai vu des notations telles que n(o) o (N), N(o-1) ou N (o * o)

à quoi fait référence la notation ci-dessus?

40
Fire Crow

Le commentaire faisait référence à la notation Big-O .

Brièvement:

  1. O (1) signifie en temps constant - indépendamment du nombre d'articles.
  2. O (N) signifie proportionnellement au nombre d'articles.
  3. O(log N) means a time proportional to log(N)

Fondamentalement, toute notation "O" signifie qu'une opération prendra du temps jusqu'à un maximum de k * f (N)
où:

k est un multiplicateur constant

f () est une fonction qui dépend de N

52
quamrana

Cela s'appelle Big O Notation: http://en.wikipedia.org/wiki/Big_O_notation

Donc, dire que l'insertion est O(n) signifie que vous devez parcourir toute la liste (ou la moitié - la grande notation O ignore les facteurs constants) pour effectuer l'insertion.

Cela ressemble à une belle introduction: http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/

23
dreeves

O (n) est Notation Big O et fait référence à la complexité d'un algorithme donné. n fait référence à la taille de l'entrée, dans votre cas, c'est le nombre d'éléments dans votre liste.

O (n) signifie que votre algorithme prendra l'ordre de n opérations pour insérer un élément. par exemple. parcourir une fois la liste (ou un nombre constant de fois, par exemple deux fois ou n'en parcourir que la moitié).

O (1) signifie que cela prend un temps constant, qu'il ne dépend pas du nombre d'éléments dans la liste.

O (n ^ 2) signifie que pour chaque insert, il faut n * n opérations. soit 1 opération pour 1 article, 4 opérations pour 2 articles, 9 opérations pour 3 articles. Comme vous pouvez le voir, les algorithmes O (n ^ 2) deviennent inefficaces pour gérer un grand nombre d'éléments.

Pour les listes O(n) n'est pas mauvais pour l'insertion, mais pas le plus rapide. Notez également que O(n/2) est considéré comme étant le même as O(n) car ils grandissent tous les deux au même rythme avec n.

14
Colin Gislason

Plus précisément O(n) signifie que s'il y a 2x autant d'éléments dans la liste, cela ne prendra Pas plus de deux fois plus longtemps, s'il y en a 50 fois plus qu'il faudra Pas plus de Voir l'article wikipedia dreeves souligné pour plus de détails

Modifier (en gras ci-dessus): Il a été souligné que Big-O représente la limite supérieure, donc s'il y a deux fois plus d'éléments dans la liste, l'insertion prendra au maximum deux fois plus longtemps, et s'il y a 50 fois plus d'éléments, cela prendrait au maximum 50 fois plus longtemps.

Si elle était en plus Ω (n) (Big Omega of n), cela prendrait au moins deux fois plus longtemps pour une liste deux fois plus grande. Si votre implémentation est à la fois O(n) et Ω (n), ce qui signifie qu'il faudra au moins les deux et au maximum deux fois plus long pour une liste deux fois plus grande, alors on peut dire que Θ (n) (Big Theta de n), ce qui signifie qu'il faudra exactement deux fois plus de temps s'il y a deux fois plus d'éléments.

Selon Wikipedia (et mon expérience personnelle, en étant moi-même coupable), Big-O est souvent utilisé là où Big-Theta est ce que l'on veut dire. Il serait techniquement correct d'appeler votre fonction O (n ^ n ^ n ^ n) car tout ce que Big-O dit est que votre fonction n'est pas plus lente que cela, mais personne ne dirait cela autrement que pour prouver un point parce que c'est informations peu utiles et trompeuses, bien qu'elles soient techniquement exactes.

11
Davy8

Il fait référence à la complexité de votre programme, c'est-à-dire au nombre d'opérations nécessaires pour résoudre réellement un problème. O(n) signifie que chaque opération prend le même nombre d'étapes que les éléments de votre liste, ce qui, pour l'insertion, est très lent. De même, si vous avez O (n ^ 2) signifie que toute opération nécessite "n" nombre d'étapes au carré pour accomplir, et ainsi de suite ... Le "O" est pour l'ordre de grandeur, et l'expression entre parenthèses est toujours liée au nombre d'éléments manipulés dans la procédure .

5
Michael

Réponse courte: cela signifie que le temps de traitement est en relation linéaire avec la taille de l'entrée. Par exemple, si la taille de l'entrée (longueur de la liste) triple, le temps de traitement triple (grosso modo). Et s'il augmente de mille fois, le temps de traitement augmente également de la même ampleur.

Réponse longue: Voir les liens fournis par Ian P et dreeves

4
Kimvais

Cela peut aider:

http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions

O (n): Recherche d'un élément dans une liste non triée ou un arbre mal formé (pire cas); addition de deux nombres à n chiffres

Bonne chance!

3
Ian P

Wikipedia explique bien mieux que moi, mais cela signifie que si la taille de votre liste est N, il faut au maximum N boucles/itérations pour insérer un élément. (En effet, vous devez parcourir toute la liste)

Si vous voulez une meilleure compréhension, il y a un livre gratuit de Berkeley qui va plus en détail sur la notation.

2
Yacoby