web-dev-qa-db-fra.com

Différence entre la notation Big-Theta et Big O en langage simple

En essayant de comprendre la différence entre la notation Theta et O , je suis tombé sur l'énoncé suivant:

The Theta-notation asymptotically bounds a function from above and below. When
we have only an asymptotic upper bound, we use O-notation.

Mais je ne comprends pas cela. Le livre l'explique mathématiquement, mais c'est trop complexe et devient vraiment ennuyeux à lire quand je ne comprends vraiment pas.

Quelqu'un peut-il expliquer la différence entre les deux en utilisant des exemples simples mais puissants .

36
Suhail Gupta

Big O ne donne que la limite asymptotique supérieure, tandis que le gros Theta donne également une limite inférieure.

Tout ce qui est Theta(f(n)) est aussi O(f(n)), mais pas l'inverse.
T(n) est dit Theta(f(n)), s'il s'agit à la fois de O(f(n)) et Omega(f(n))

Pour cette raison big-Theta est plus informatif que la notation big-O , donc si nous pouvons dire que quelque chose est big-Theta, c'est généralement préféré. Cependant, il est plus difficile de prouver que quelque chose est grand Thêta que de prouver qu'il est grand-O.

Pour exemple , tri par fusion est à la fois O(n*log(n)) et Theta(n*log(n)), mais il est également O (n2), puisque n2 est asymptotiquement "plus grand" que lui. Cependant, ce n'est PAS Theta (n2), Puisque l'algorithme n'est PAS Omega (n2).


Omega(n) est borne inférieure asymptotique. Si T(n) est Omega(f(n)), cela signifie qu'à partir d'un certain n0, Il y a une constante C1 Telle que T(n) >= C1 * f(n). Alors que big-O dit qu'il y a une constante C2 Telle que T(n) <= C2 * f(n)).

Les trois (Omega, O, Theta) ne donnent que des informations asymptotiques ("pour une entrée importante"):

  • Big O donne la limite supérieure
  • Big Omega donne une limite inférieure et
  • Big Theta donne des limites inférieures et supérieures

Notez que cette notation n'est pas liée à l'analyse des meilleurs, des pires et des cas moyens des algorithmes. Chacun de ces éléments peut être appliqué à chaque analyse.

43
amit

Je vais juste citer Knuth's TAOCP Volume 1 - page 110 (j'ai l'édition indienne). Je recommande de lire les pages 107-110 (section 1.2.11 Représentations asymptotiques)

Les gens confondent souvent la notation O en supposant qu'elle donne un ordre exact de croissance; ils l'utilisent comme s'il spécifiait une borne inférieure ainsi qu'une borne supérieure. Par exemple, un algorithme peut être appelé inefficace car son temps d'exécution est O (n ^ 2). Mais un temps de fonctionnement de O (n ^ 2) ne signifie pas nécessairement que le temps de fonctionnement n'est pas également O (n)

À la page 107,

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O (n ^ 4) et

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = O (n ^ 3) et

1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + n ^ 2 = (1/3) n ^ 3 + O (n ^ 2)

Big-Oh est pour des approximations. Il vous permet de remplacer ~ par un signe égal =. Dans l'exemple ci-dessus, pour un n très grand, nous pouvons être sûrs que la quantité restera inférieure à n ^ 4 et n ^ 3 et (1/3) n ^ 3 + n ^ 2 [et pas simplement n ^ 2]

Big Omega est pour les bornes inférieures - Un algorithme avec Omega (n ^ 2) ne sera pas aussi efficace que celui avec O (N logN) pour les grands N. Cependant, nous ne savons pas à quelles valeurs de N (dans ce sens, nous savons approximativement)

Big Theta est pour l'ordre exact de croissance, à la fois la limite inférieure et supérieure.

9
rjha94

Si le temps d'exécution est exprimé en notation big-O, vous savez que le temps d'exécution ne sera pas plus lent que l'expression donnée. Il exprime le pire des scénarios.

Mais avec la notation Thêta, vous savez également que ce ne sera pas plus rapide. C'est-à-dire qu'il n'y a pas de meilleur scénario dans lequel l'algorithme reviendra plus rapidement.

Cela donne une limite plus exacte sur le temps d'exécution prévu. Cependant, dans la plupart des cas, il est plus simple d'ignorer la limite inférieure (la possibilité d'une exécution plus rapide), alors que vous n'êtes généralement préoccupé que par le pire des cas.

5
faester

Voici ma tentative:

Une fonction, f(n) est O(n), si et seulement s'il existe une constante, c, telle que f(n) <= c*g(n).

En utilisant cette définition, pourrait-on dire que la fonction f(2^(n+1)) est O(2^n)?

  1. En d'autres termes, existe-t-il une constante 'c' Telle que 2^(n+1) <= c*(2^n)? Notez que la deuxième fonction (2^n) Est la fonction après le Big O dans le problème ci-dessus. Cela m'a dérouté au début.

  2. Alors, utilisez vos compétences d'algèbre de base pour simplifier cette équation. 2^(n+1) se décompose en 2 * 2^n. Ce faisant, nous nous retrouvons avec:

    2 * 2^n <= c(2^n)

  3. Maintenant, c'est facile, l'équation vaut pour toute valeur de cc >= 2. Donc, oui, nous pouvons dire que f(2^(n+1)) est O(2^n).

Big Omega fonctionne de la même manière, sauf qu'il évalue f(n)> =c*g(n) pour une constante 'c'.

Donc, en simplifiant les fonctions ci-dessus de la même manière, nous nous retrouvons avec (notez le> = maintenant):

2 * 2^n >= c(2^n)

Ainsi, l'équation fonctionne pour la plage 0 <= c <= 2. Donc, nous pouvons dire que f(2^(n+1)) est un Big Omega de (2^n).

Maintenant, puisque les deux sont valides, nous pouvons dire que la fonction est Big Theta (2^n). Si l'un d'eux ne fonctionnait pas pour une constante de 'c', Ce n'est pas Big Theta.

L'exemple ci-dessus est tiré du manuel de conception d'algorithmes de Skiena, qui est un livre fantastique.

J'espère que cela pourra aider. C'est vraiment un concept difficile à simplifier. Ne vous attardez pas trop sur ce qu'est 'c', Décomposez-le simplement en termes plus simples et utilisez vos compétences d'algèbre de base.

5
sma

Je vais utiliser un exemple pour illustrer la différence.

Soit la fonction f(n) définie comme

if n is odd f(n) = n^3
if n is even f(n) = n^2

De CLRS

Une fonction f(n) appartient à l'ensemble Θ (g (n)) s'il existe des constantes positives c1 et c2 telles qu'elle puisse être "prise en sandwich" entre c1g (n) et c2g ( n), pour n suffisamment grand.

ET

O (g (n)) = {f (n): il existe des constantes positives c et n0 telles que 0 ≤ f(n) ≤ cg (n) pour tout n ≥ n0}.

ET

Ω (g (n)) = {f (n): il existe des constantes positives c et n0 telles que 0 ≤ cg (n) ≤ f(n) pour tout n ≥ n0}.

La borne supérieure de f(n) est n ^ 3. Ainsi, notre fonction f(n) est clairement O (n ^ 3).

Mais est-ce Θ (n ^ 3)?

Pour que f(n) soit dans Θ (n ^ 3), il doit être pris en sandwich entre deux fonctions, l'une formant la borne inférieure, et l'autre la borne supérieure, toutes deux croissantes à n ^ 3. Bien que la borne supérieure soit évidente, la borne inférieure ne peut pas être n ^ 3. La borne inférieure est en fait n ^ 2; f(n) est Ω (n ^ 2)

De CLRS

Pour deux fonctions quelconques f(n) et g (n), nous avons f(n) = Θ (g (n)) si et seulement si f(n) = O(g(n)) et f(n) = Ω (g (n )).

Donc f(n) n'est pas dans Θ (n ^ 3) alors qu'il est dans O (n ^ 3) et Ω (n ^ 2)

4
VSOverFlow

Dans une différence de langage très simple serait comme ceci:

La notation Big O est utilisée pour l'analyse du pire cas d'un algorithme. Big Omega est utilisé pour la meilleure analyse de cas d'un algorithme. Big Theta est utilisé pour l'analyse d'un algorithme lorsque le meilleur et le pire des cas sont les mêmes.

Disons que vous recherchez un nombre dans un tableau trié à l'aide d'un algorithme de recherche binaire.

[1 2 3 4 5 6 7] 

Dans le pire des cas, comme lorsque la cible est 1, elle doit effectuer des vérifications de fractionnement log (n), qui est log (7) dans notre cas. Il peut être exprimé comme O (n).

Dans le meilleur des cas, par exemple lorsque la cible est 3, elle n'effectue qu'une seule opération. Il peut être exprimé en Ω (1)

0
Elyor