Différence entre la notation Big-O et Little-O


Réponses:


444

f ∈ O (g) dit, essentiellement

Pour au moins un choix d'une constante k > 0, vous pouvez trouver une constante a telle que l'inégalité 0 <= f (x) <= kg (x) soit valable pour tout x> a.

Notez que O (g) est l'ensemble de toutes les fonctions pour lesquelles cette condition est vérifiée.

f ∈ o (g) dit, essentiellement

Pour chaque choix d'une constante k > 0, vous pouvez trouver une constante a telle que l'inégalité 0 <= f (x) <kg (x) soit valable pour tout x> a.

Encore une fois, notez que o (g) est un ensemble.

Dans Big-O, il suffit de trouver un multiplicateur particulier k pour lequel l'inégalité se maintient au-delà d'un minimum x .

Dans Little-o, il doit y avoir un minimum x après lequel l'inégalité tient, peu importe la taille de k , tant qu'elle n'est pas négative ou nulle.

Ces deux termes décrivent les limites supérieures, bien que quelque peu contre-intuitif, Little-o est la déclaration la plus forte. Il existe un écart beaucoup plus important entre les taux de croissance de f et g si f ∈ o (g) que si f ∈ O (g).

Une illustration de la disparité est la suivante: f ∈ O (f) est vrai, mais f ∈ o (f) est faux. Par conséquent, Big-O peut être lu comme "f ∈ O (g) signifie que la croissance asymptotique de f n'est pas plus rapide que celle de g", tandis que "f ∈ o (g) signifie que la croissance asymptotique de f est strictement plus lente que celle de g". C'est comme <=contre <.

Plus précisément, si la valeur de g (x) est un multiple constant de la valeur de f (x), alors f ∈ O (g) est vraie. C'est pourquoi vous pouvez supprimer des constantes lorsque vous travaillez avec la notation big-O.

Cependant, pour que f ∈ o (g) soit vrai, alors g doit inclure une puissance plus élevée de x dans sa formule, et donc la séparation relative entre f (x) et g (x) doit en fait devenir plus grande au fur et à mesure que x devient plus grand.

Pour utiliser des exemples purement mathématiques (plutôt que de faire référence à des algorithmes):

Ce qui suit est vrai pour Big-O, mais ne serait pas vrai si vous avez utilisé little-o:

  • x² ∈ O (x²)
  • x² ∈ O (x² + x)
  • x² ∈ O (200 * x²)

Ce qui suit est vrai pour little-o:

  • x² ∈ o (x³)
  • x² ∈ o (x!)
  • ln (x) ∈ o (x)

Notez que si f ∈ o (g), cela implique f ∈ O (g). par exemple x² ∈ o (x³) donc il est également vrai que x² ∈ O (x³), (encore une fois, pensez à O as <=et o as <)


146
Oui - la différence est de savoir si les deux fonctions peuvent être asymptotiquement identiques. Intuitivement, j'aime penser à big-O qui signifie "ne croît pas plus vite que" (c'est-à-dire croît au même rythme ou plus lentement) et little-o qui signifie "croît strictement plus lentement que".
Phil

12
Copiez ceci sur wikipedia? C'est bien mieux que ce qui est là.
cloudsurfin

1
@SA Oui. C'est un cas plus délicat où la règle plus simple que j'ai donnée à propos des "puissances supérieures de x" n'est pas évidemment applicable. Mais si vous regardez les définitions de limites plus rigoureuses données dans la réponse de Strilanc ci-dessous, ce que vous voulez savoir, c'est si lim n-> inf (2 ^ n / 3 ^ n) = 0. Puisque (2 ^ n / 3 ^ n) = (2/3) ^ n et puisque pour tout 0 <= x <1, lim n-> inf (x ^ n) = 0, il est vrai que 2 ^ n = o (3 ^ n).
Tyler McHenry

1
Soyez prudent avec "Dans Little-o, il doit y avoir un minimum x après lequel l'inégalité tient, peu importe la taille de k, tant qu'elle n'est pas négative ou nulle." Ce n'est pas "pour tout ace kqu'il y a: ...", c'est "pour tout ce kqu'il y a un aqui: ..."
GA1

1
"Dans Little-o, il doit y avoir un minimum x après lequel l'inégalité se maintient, peu importe la taille de k, tant qu'elle n'est pas négative ou nulle." non, c'est incorrect.
Filippo Costa

196

Big-O est à peu o comme c'est <. Big-O est une borne supérieure inclusive, tandis que little-o est une borne supérieure stricte.

Par exemple, la fonction f(n) = 3nest:

  • dans O(n²), o(n²)etO(n)
  • pas O(lg n), o(lg n)ouo(n)

De façon analogue, le nombre 1est:

  • ≤ 2,, < 2et≤ 1
  • non ≤ 0, < 0ou< 1

Voici un tableau, montrant l'idée générale:

Grande table o

(Remarque: le tableau est un bon guide mais sa définition de limite devrait être en termes de limite supérieure au lieu de la limite normale. Par exemple, 3 + (n mod 2) oscille entre 3 et 4 pour toujours. C'est en O(1)dépit de ne pas avoir de limite normale, car il a toujours a lim sup: 4.)

Je recommande de mémoriser la conversion de la notation Big-O en comparaisons asymptotiques. Les comparaisons sont plus faciles à retenir, mais moins flexibles car vous ne pouvez pas dire des choses comme n O (1) = P.


J'ai une question: quelle est la différence entre les lignes 3 et 4 (colonne des définitions de limites)? Pourriez-vous me montrer un exemple où 4 prises (lim> 0), mais pas 3?
Masked Man

3
Oh, je l'ai compris. Big Omega est pour lim> 0, Big Oh est pour lim <infinity, Big Theta est lorsque les deux conditions sont respectées, ce qui signifie 0 <lim <infinity.
Masked Man

Pour f ∈ Ω (g), la limite à l'infini ne devrait-elle pas être évaluée à> = 1? De même pour f ∈ O (g), 1 = <c <∞?
user2963623

1
@ user2963623 Non, car les valeurs finies strictement supérieures à 0, y compris les valeurs comprises entre 0 et 1, correspondent à "la même complexité asymptotique mais différents facteurs constants". Si vous omettez des valeurs inférieures à 1, vous avez une coupure dans l'espace à facteur constant plutôt que dans l'espace à complexité asymptotique.
Craig Gidney

1
@ubadub Vous diffusez l'opération d'exponentiation sur l'ensemble. C'est une notation lâche.
Craig Gidney

45

Je trouve que lorsque je ne peux pas saisir quelque chose sur le plan conceptuel, il est utile de comprendre pourquoi on utiliserait X. (Pour ne pas dire que vous n'avez pas essayé cela, je prépare le terrain.)

[trucs que vous connaissez] Une façon courante de classer les algorithmes est par le runtime, et en citant la complexité big-Oh d'un algorithme, vous pouvez obtenir une assez bonne estimation de celle qui est "meilleure" - celle qui a la fonction "la plus petite" dans le O! Même dans le monde réel, O (N) est "meilleur" que O (N²), sauf les choses idiotes comme les constantes super-massives et autres. [/ Stuff you know]

Disons qu'il y a un algorithme qui s'exécute en O (N). Assez bien, hein? Mais disons que vous (vous, personne brillante, vous) trouvez un algorithme qui s'exécute en O ( NloglogloglogN ). YAY! C'est plus rapide! Mais vous vous sentiriez idiot d'écrire cela encore et encore lorsque vous rédigez votre thèse. Vous l'écrivez donc une fois, et vous pouvez dire "Dans cet article, j'ai prouvé que l'algorithme X, précédemment calculable en temps O (N), est en fait calculable en o (n)".

Ainsi, tout le monde sait que votre algorithme est plus rapide --- de combien n'est pas clair, mais ils le savent plus vite. Théoriquement. :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.