web-dev-qa-db-fra.com

Quelle est la différence entre (n) et O (n)?

Parfois, je vois Θ (n) avec l'étrange symbole avec quelque chose au milieu, et parfois juste O (n). Est-ce juste une paresse de frappe parce que personne ne sait comment taper ce symbole, ou est-ce que ça veut dire quelque chose de différent?

402
martinus

Brève explication:

Si un algorithme est de (g (n)), cela signifie que le temps d'exécution de l'algorithme lorsque n (taille de l'entrée) devient plus grand est proportionnel à g (n).

Si un algorithme est de O (g (n)), cela signifie que le temps d'exécution de l'algorithme lorsque n devient plus grand est au plus proportionnelle à g (n).

Normalement, même lorsque les gens parlent de O(g(n)), ils veulent dire (g (n)), mais techniquement, il y a une différence.


Plus techniquement:

O (n) représente la limite supérieure. (N) signifie un lien étroit. Ω (n) représente la borne inférieure.

f(x) = Θ(g(x)) iff f(x) = O(g(x)) and f(x) = Ω(g(x))

Fondamentalement, quand on dit qu'un algorithme est de O (n), c'est aussi O (n2), Sur1000000), O (2n), ... mais un algorithme (n) est pas (n2).

En fait, puisque f(n) = Θ (g (n)) signifie que pour des valeurs suffisamment grandes de n, f(n) peut être lié dans c1g (n) et c2g (n) pour certaines valeurs de c1 et C2, c’est-à-dire que le taux de croissance de f est asymptotiquement égal à g: g peut être une limite inférieure et et une limite supérieure de f. Cela implique directement que f peut être une limite inférieure et une limite supérieure de g également. Par conséquent,

f(x) = Θ(g(x)) iff g(x) = Θ(f(x))

De même, pour montrer f(n) = Θ (g (n)), il suffit de montrer que g est une limite supérieure de f (c.-à-d. f(n) = O(g(n))) et f est une borne inférieure de g (c.-à-d. f(n) = Ω (g (n)), qui est exactement la même chose que g(n) = O (f (n))). Avec concision,

f(x) = Θ(g(x)) iff f(x) = O(g(x)) and g(x) = O(f(x))


Il existe également des notations peu-oh et peu-oméga (ω) représentant les limites lâches inférieure et supérieure d'une fonction.

Résumer:

f(x) = O(g(x)) (big-oh) signifie que le taux de croissance de f(x) est asymptotique inférieur ou égal à au taux de croissance de g(x).

f(x) = Ω(g(x)) (big-oméga) signifie que le taux de croissance de f(x) est asymptotique plus grand ou égal à le taux de croissance de g(x)

f(x) = o(g(x)) (little-oh) signifie que le taux de croissance de f(x) est asymptotique moins que le taux de croissance de g(x).

f(x) = ω(g(x)) (petit-oméga) signifie que le taux de croissance de f(x) est asymptotique plus grand que le taux de croissance de g(x)

f(x) = Θ(g(x)) (thêta) signifie que le taux de croissance de f(x) est asymptotique égal à le taux de croissance de g(x)

Pour une discussion plus détaillée, vous pouvez lisez la définition sur Wikipedia ou consultez un manuel classique comme Introduction aux algorithmes de Cormen et al.

577
Mehrdad Afshari

Il existe un moyen simple (une astuce, je suppose) de se rappeler quelle notation signifie quoi.

Toutes les notations Big-O peuvent être considérées comme ayant une barre.

Quand on regarde un Ω, la barre est en bas, donc c'est une borne inférieure (asymptotique).

Quand on regarde un Θ, le bar est évidemment au milieu. C'est donc un lien étroit (asymptotique).

Lorsque vous écrivez à la main O, vous terminez généralement en haut et dessinez un gribouillis. Par conséquent, O(n) est la limite supérieure de la fonction. Pour être juste, celle-ci ne fonctionne pas avec la plupart des polices, mais c'est la justification originale des noms.

311
Andrei Krotkov

on est Big "O"

on est Big Theta

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

Big O signifie que votre algorithme ne s'exécutera pas plus rapidement que dans une expression donnée (n ^ 2)

Big Omega signifie que votre algorithme s'exécutera en pas moins que dans l'expression donnée (n ^ 2)

Lorsque les deux conditions sont vraies pour la même expression, vous pouvez utiliser la grande notation thêta ....

55
l_39217_l

Plutôt que de fournir une définition théorique, qui est déjà magnifiquement résumée ici, je vais donner un exemple simple:

Supposons que le temps d'exécution de f(i) soit O(1). Ci-dessous, un fragment de code dont le runtime asymptotique est Θ(n). Il toujours appelle la fonction f(...)n fois. La limite inférieure et supérieure est n.

for(int i=0; i<n; i++){
    f(i);
}

Le deuxième fragment de code ci-dessous a le temps d'exécution asymptotique de O(n). Il appelle la fonction f(...)au plusn fois. La limite supérieure est n, mais la limite inférieure peut être Ω(1) ou Ω(log(n)), en fonction de ce qui se passe à l'intérieur de f2(i).

for(int i=0; i<n; i++){
    if( f2(i) ) break;
    f(i);
}
34
kara deniz

Un graphique pourrait rendre les réponses précédentes plus faciles à comprendre:

-Notation - Même commande | Notation O - Limite supérieure

Θ(n) - Same orderO(n) - Upper bound

En anglais,

À gauche, notez qu'il existe une limite supérieure et une limite inférieure du même ordre de grandeur (c.-à-d. g (n) ). Ignorer les constantes, et si les bornes supérieure et inférieure ont le même ordre de grandeur, on peut valablement dire f (n) = Θ (g (n)) ou f (n) est en grand thêta de g (n) .

En commençant par la droite, l’exemple le plus simple, on dit que la limite supérieure g (n) est simplement l’ordre de grandeur et ignore la constante c (comme le font toutes les grandes grandes notations O ).

10
Ricardo

Theta est une manière abrégée de faire référence à une situtation spéciale où le gros O et Omega sont les mêmes.

Ainsi, si on réclame The Theta is expression q, alors ils réclament également nécessairement que Big O is expression q et Omega is expression q.


Analogie approximative:

Si: Theta affirme: "Cet animal a 5 pattes." il en résulte que: Big O est vrai ("Cet animal a moins de ou égal à 5 ​​pattes.") et Omega est vrai ("Cet animal a plus de ou égal à 5 ​​pattes.")

Ce n'est qu'une analogie approximative, car les expressions ne sont pas nécessairement des nombres spécifiques, mais des fonctions d'ordre variable, telles que log (n), n, n ^ 2, (etc.).

10
ahnbizcad

f(n) appartient à O(n) s'il existe un comportement positif k comme f(n)<=k*n

f(n) appartient à Θ(n) s'il existe un résultat positif k1, k2 en tant que k1*n<=f(n)<=k2*n

article de Wikipedia sur la notation Big O

6
user54579

Conclusion: nous considérons grand O, grand θ et grand Ω comme la même chose.

Pourquoi? Je vais dire la raison ci-dessous:

Tout d'abord, je vais clarifier une affirmation erronée, certaines personnes pensent que nous nous soucions simplement de la pire complexité temporelle, nous utilisons donc toujours un grand O au lieu d'un grand θ. Je dirai que cet homme fait des conneries. Les bornes supérieure et inférieure sont utilisées pour décrire une fonction et non pour décrire la complexité temporelle. La fonction de pire temps a ses limites supérieure et inférieure; la meilleure fonction temporelle a aussi ses limites supérieure et inférieure.

Afin d'expliquer clairement la relation entre le grand O et le grand θ, je vais expliquer la relation entre le grand O et le petit o en premier. De la définition, on peut facilement savoir que petit o est un sous-ensemble du grand O. Par exemple:

T (n n ^ 2 + n, on peut dire T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4). Mais pour petit o, T (n) = o (n ^ 2) ne correspond pas à la définition de petit o. Donc, juste T (n) = o (n ^ 3), T (n) = o ( n ^ 4) sont corrects pour les petits o. Le redondant T (n) = O (n ^ 2) est quoi? C'est grand θ!) ==

En général, on dit que grand est O (n ^ 2), difficilement dire que T (n) = O (n ^ 3), T (n) = O (n ^ 4). Pourquoi? Parce que nous considérons le grand O comme un grand θ inconsciemment.

De la même façon, nous considérons aussi grand Ω comme grand θ inconsciemment.

En un mot, gros O, grand θ et grand Ω ne sont pas la même chose dans les définitions, mais ils sont la même chose dans notre bouche et notre cerveau.

4
haibo cu

Utilisation des limites

Considérons f(n) > 0 et g(n) > 0 pour tout n. Vous pouvez prendre cela en considération, car l'algorithme réel le plus rapide comporte au moins une opération et termine son exécution après le début. Cela simplifiera le calcul, car nous pouvons utiliser la valeur (f(n)) à la place de la valeur absolue (|f(n)|).

  1. f(n) = O(g(n))

    Général:

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞   g(n)
    

    Pour g(n) = n:

              f(n)     
    0 ≤ lim ──────── < ∞
        n➜∞    n
    

    Exemples:

        Expression               Value of the limit
    ------------------------------------------------
    n        = O(n)                      1
    1/2*n    = O(n)                     1/2
    2*n      = O(n)                      2
    n+log(n) = O(n)                      1
    n        = O(n*log(n))               0
    n        = O(n²)                     0
    n        = O(nⁿ)                     0
    

    Contre-exemples:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ O(log(n))                 ∞
    1/2*n    ≠ O(sqrt(n))                ∞
    2*n      ≠ O(1)                      ∞
    n+log(n) ≠ O(log(n))                 ∞
    
  2. f(n) = Θ(g(n))

    Général:

              f(n)     
    0 < lim ──────── < ∞
        n➜∞   g(n)
    

    Pour g(n) = n:

              f(n)     
    0 < lim ──────── < ∞
        n➜∞    n
    

    Exemples:

        Expression               Value of the limit
    ------------------------------------------------
    n        = Θ(n)                      1
    1/2*n    = Θ(n)                     1/2
    2*n      = Θ(n)                      2
    n+log(n) = Θ(n)                      1
    

    Contre-exemples:

        Expression                Value of the limit
    -------------------------------------------------
    n        ≠ Θ(log(n))                 ∞
    1/2*n    ≠ Θ(sqrt(n))                ∞
    2*n      ≠ Θ(1)                      ∞
    n+log(n) ≠ Θ(log(n))                 ∞
    n        ≠ Θ(n*log(n))               0
    n        ≠ Θ(n²)                     0
    n        ≠ Θ(nⁿ)                     0
    
3
ROMANIA_engineer