Quelle est la différence entre Big-O notation O(n)
et Little-O notation o(n)
?
f ∈ O(g) dit, essentiellement
Pour au moins un choix d'une constante k > 0, vous pouvez trouver une constante a tel que l'inégalité 0 <= f(x) <= k g(x) est 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 tous choix d'une constante k > 0, vous pouvez trouver une constante a tel que l'inégalité 0 <= f(x) <k g(x) est valable pour tout x> a.
Encore une fois, notez que o(g) est un ensemble.
Dans Big-O, il suffit que vous trouviez un multiplicateur particulier k pour lequel l'inégalité tient au-delà d'un minimum x .
Dans Little-o, il doit y avoir un minimum x après lequel l'inégalité est vérifiée, quelle que soit votre taille k , tant que ce n'est pas négatif ou nul.
Ces deux décrivent les limites supérieures, bien que quelque peu contre-intuitivement, Little-o est la déclaration la plus forte. L'écart entre les taux de croissance de f et g est beaucoup plus grand si f ∈ o(g) que si f ∈ O (g).
Voici une illustration de la disparité: f 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", alors 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 utilisez la notation big-O.
Cependant, pour que f ∈ o(g) soit vrai, alors g doit inclure une puissance supérieure de x dans sa formule, et donc la séparation relative entre f(x) et g(x) doit en réalité devenir plus grande à mesure que x grandit.
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 le serait pas si vous utilisiez little-o:
Ce qui suit est vrai pour little-o:
Notez que si f ∈ o (g), cela implique f ∈ O (g). par exemple. x² ∈ o (x³) il est donc également vrai que x² O (x³) (encore une fois, considérons O comme <=
et o comme <
)
Big-O est trop petit comme ≤
est à <
. Big-O est une limite supérieure inclusive, alors que little-o est une limite supérieure stricte.
Par exemple, la fonction f(n) = 3n
est:
O(n²)
, o(n²)
et O(n)
O(lg n)
, o(lg n)
ou o(n)
De manière analogue, le nombre 1
est:
≤ 2
, < 2
et ≤ 1
≤ 0
, < 0
ou < 1
Voici un tableau montrant l'idée générale:
(Remarque: le tableau est un bon guide, mais sa limite doit être définie en fonction de limite supérieure au lieu de la limite normale. Par exemple, 3 + (n mod 2)
oscille entre 3 et 4 pour toujours. dans O(1)
bien qu’il n’ait pas de limite normale, car il a toujours un 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 nO(1) = P.
Je trouve que quand je ne peux pas conceptuellement saisir quelque chose, penser à pourquoi on utiliserait X est utile pour comprendre X. (Pour ne pas dire que vous n'avez pas essayé cela, je prépare simplement le terrain .)
[trucs que vous connaissez] Un moyen courant de classer les algorithmes consiste à exécuter, et en citant la complexité énorme d'un algorithme, vous pouvez obtenir une assez bonne estimation de celui qui est "meilleur" - celui qui possède la "plus petite" fonction. dans le O! Même dans le monde réel, O(N) est "meilleur" que O (N²), à l'exception de choses aussi stupides que les constantes super-massives, etc.
Supposons qu'un algorithme fonctionne en O (N). Plutôt bien, hein? Mais disons que vous (votre personne brillante, vous) proposez un algorithme qui fonctionne en O (N/loglogloglogN). YAY! C'est plus rapide! Mais vous vous sentiriez stupide d'écrire cela encore et encore lorsque vous rédigez votre thèse. Ainsi, vous l'écrivez une fois et vous pouvez dire "Dans cet article, j'ai prouvé que l'algorithme X, auparavant 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, ce n'est pas clair, mais ils savent que c'est plus rapide. Théoriquement. :)