Quelle est la difference entre Θ (n) et O (n)?


427

Parfois, je vois Θ (n) avec l'étrange symbole Θ avec quelque chose au milieu, et parfois juste O (n). Est-ce simplement de la paresse à taper parce que personne ne sait comment taper ce symbole, ou cela signifie-t-il quelque chose de différent?


8
Ce n'est pas évident, mais cette question est une copie de celle-ci stackoverflow.com/questions/464078/… d'hier.
Bill the Lizard

Réponses:


600

Brève explication:

Si un algorithme est de Θ (g (n)), cela signifie que le temps d'exécution de l'algorithme lorsque n (taille d'entrée) augmente 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 proportionnel à g (n).

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


Plus techniquement:

O (n) représente la limite supérieure. Θ (n) signifie lié étroitement. Ω (n) représente la borne inférieure.

f (x) = Θ (g (x)) ssi f (x) = O (g (x)) et f (x) = Ω (g (x))

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

En fait, puisque f (n) = Θ (g (n)) signifie pour des valeurs suffisamment grandes de n, f (n) peut être lié à l'intérieur de c 1 g (n) et c 2 g (n) pour certaines valeurs de c 1 et c 2 , c'est-à-dire que le taux de croissance de f est asymptotiquement égal à g: g peut être une borne inférieure et et une borne supérieure de f. Cela implique directement que f peut également être une borne inférieure et une borne supérieure de g. Par conséquent,

f (x) = Θ (g (x)) ssi g (x) = Θ (f (x))

De même, pour montrer f (n) = Θ (g (n)), il suffit de montrer que g est une borne supérieure de f (c'est-à-dire f (n) = O (g (n))) et f est une borne inférieure de g (c'est-à-dire f (n) = Ω (g (n)) qui est exactement la même chose que g (n) = O (f (n))). De manière concise,

f (x) = Θ (g (x)) ssi f (x) = O (g (x)) et g (x) = O (f (x))


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

Résumer:

f(x) = O(g(x))(big-oh) signifie que le taux de croissance de f(x)est asymptotiquement 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 asymptotiquement supérieur ou égal au taux de croissance deg(x)

f(x) = o(g(x))(petit-oh) signifie que le taux de croissance de f(x)est asymptotiquement inférieur à au taux de croissance de g(x).

f(x) = ω(g(x))(petit oméga) signifie que le taux de croissance de f(x)est asymptotiquement supérieur à au taux de croissance deg(x)

f(x) = Θ(g(x))(thêta) signifie que le taux de croissance de f(x)est asymptotiquement égal au taux de croissance deg(x)

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


1
Si "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 proportionnel à g (n)." Alors comment dites-vous que "Fondamentalement, lorsque nous disons qu'un algorithme est de O (n), c'est aussi O (n2), O (n1000000), O (2n)," ??
Andy897

@ Andy897 Il découle de la définition de "proportionnelle". Extrait de Wikipédia: "En mathématiques, deux variables sont proportionnelles si un changement dans l'une est toujours accompagné d'un changement dans l'autre, et si les changements sont toujours liés en utilisant un multiplicateur constant. La constante est appelée le coefficient de proportionnalité ou de proportionnalité constant."
Mehrdad Afshari

Que veut >= \Omega(...)dire? Je comprends si on dit que c'est un membre de \Omega(...), mais si c'est plus que ça? Quel sens cela fait-il?
Johannes Schaub - litb

328

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 comportant une barre.

Lorsque vous regardez un Ω, la barre est en bas, c'est donc une borne inférieure (asymptotique).

En regardant un Θ, la barre est évidemment au milieu. Il s'agit donc d'une limite étroite (asymptotique).

Lorsque vous écrivez O, vous finissez généralement en haut et dessinez un gribouillis. Par conséquent, O (n) est la limite supérieure de la fonction. Pour être honnête, celui-ci ne fonctionne pas avec la plupart des polices, mais c'est la justification d'origine des noms.


5
Je ne descends généralement pas en dessous de 3-4 réponses à toutes les questions. Cela valait le détour. Merci d'avoir partagé l'astuce. : D
impossible

56

l'un est grand "O"

on est Big Theta

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

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

Big Omega signifie que votre algorithme s'exécutera en moins d'étapes 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 ....


20
Mais c'est faux! Le nombre d'étapes est délimité ci-dessus par n ^ 2 car n devient très grand. Cependant, un algorithme qui s'exécute en n ^ 2 + c étapes prend plus de n ^ 2 étapes, mais reste O (n ^ 2). La notation Big-O ne décrit que le comportement asymptotique .
HenryR

1
Ce n'est pas une fin tout soit toute définition. C'est juste un point de départ ... Puisque nous parlons de notations asymptotiques à mesure que n approche de l'infini. La constante C devient un non facteur.
l_39217_l

1
Bien que j'aime la simplicité de cette réponse, il convient de noter qu'un algorithme O (n ^ 2) pourrait très bien prendre 1 000 000 000 * n ^ 2 étapes à exécuter, ce qui est certainement beaucoup plus grand que n ^ 2. Un algorithme étant O (n ^ 2) signifie simplement qu'il ne faudra pas plus de k * n ^ 2 étapes pour s'exécuter, où k est un nombre réel positif.
MarredCheese

38

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

Supposons que le temps d'exécution de f(i)est O(1). Ci-dessous, un fragment de code dont l'exécution asymptotique est Θ(n). Il appelle toujours les f(...) ntemps de fonction . 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 runtime asymptotique de O(n). Il appelle la fonction la f(...) plupart du n temps. La limite supérieure est n, mais la limite inférieure peut être Ω(1)ou Ω(log(n)), selon ce qui se passe à l'intérieur f2(i).

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

Qu'entendez-vous par «exécution asymptotique»?
chopper tirage au sort lion4

1
Asymptotique dans ce contexte signifie "pour un n assez grand". Le temps d'exécution d'un fragment de code dont le temps d'exécution asymptotique est Θ(n)augmente de façon linéaire à mesure que n augmente, par exemple le temps d'exécution T peut être exprimé comme T (n) = a * n + b. Pour les petites valeurs de n (par exemple n = 1 ou 2), ce n'est peut-être pas la meilleure façon de décrire le comportement - peut-être avez-vous un code d'initialisation qui prend beaucoup plus de temps que f (i).
kara deniz

11

Thêta est une manière abrégée de désigner une situation spéciale où le grand O et l'Oméga sont les mêmes.

Ainsi, si l'on prétend The Theta is expression q, alors ils le disent aussi nécessairement Big O is expression qet Omega is expression q.


Analogie approximative:

Si: Theta affirme: "Cet animal a 5 pattes." alors il s'ensuit que: Big O est vrai ("Cet animal a moins ou égal à 5 ​​pattes.") et Omega est vrai ("Cet animal a plus ou égal à 5 ​​pattes.")

Ce n'est qu'une analogie grossière parce que les expressions ne sont pas nécessairement des nombres spécifiques, mais plutôt des fonctions de différents ordres de grandeur tels que log (n), n, n ^ 2, (etc.).


11

Un graphique pourrait faciliter la compréhension des réponses précédentes:

Notation ation - Même ordre | O-Notation - Limite supérieure

Θ (n) - Même ordre O (n) - Limite supérieure

En anglais,

À gauche, notez qu'il existe une borne supérieure et une borne inférieure qui sont toutes les deux du même ordre de grandeur (c.-à-d. G (n) ). Ignorez les constantes, et si la borne supérieure et la borne 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 partant de la droite, l'exemple le plus simple, il dit que la limite supérieure g (n) est simplement l'ordre de grandeur et ignore la constante c (comme le fait toute la grande notation O ).


Vous avez foiré les mots et les graphiques.
kushalvm

@kushalvm, merci pour votre honnêteté. Pourriez-vous bien vouloir expliquer ce que vous voulez dire précisément? Pour le bien de mon apprentissage et d'autres qui peuvent se confondre avec cette réponse. :-)
Ricardo

La dernière ligne du dernier paragraphe ne devrait-elle pas être f (n) est la Thêta de g (n)?
kushalvm

@kushalvm, merci de le clarifier. J'ai changé le texte de la dernière ligne du paragraphe avant le dernier pour corriger mon erreur en anglais.
Ricardo

en savoir plus sur la prononciation
Ricardo


3

Utiliser des limites

Considérons f(n) > 0et g(n) > 0pour tous n. Il est correct de considérer cela, car l'algorithme réel le plus rapide a au moins une opération et termine son exécution après le démarrage. Cela simplifiera le calcul, car nous pouvons utiliser la valeur ( f(n)) au lieu 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
    

2

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

Pourquoi? J'en dirai la raison ci-dessous:

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

Afin d'expliquer clairement la relation entre le grand O et le grand θ, je vais d'abord expliquer la relation entre le grand O et le petit o. D'après la définition, nous pouvons facilement savoir que le 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 le petit o, T (n) = o (n ^ 2) ne répond pas à la définition du petit o. Donc, juste T (n) = o (n ^ 3), T (n) = o (n ^ 4) sont corrects pour le petit o. Le redondant T (n) = O (n ^ 2) est quoi? C'est grand θ!

Généralement, nous disons que le grand O est O (n ^ 2), pour ne pas dire T (n) = O (n ^ 3), T (n) = O (n ^ 4). Pourquoi? Parce que nous considérons le grand O comme le grand θ inconsciemment.

De même, nous considérons également les gros Ω comme les grands θ inconsciemment.

En un mot, grand 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.


Pourquoi ce contenu est-il formaté comme une citation? Est- ce une citation d'une source externe? Si tel est le cas, la source doit être liée ou identifiée d'une autre manière. Sinon, la mise en forme du devis doit être supprimée.
Mark Amery
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.