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?
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?
Réponses:
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.
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 def(x)
est asymptotiquement inférieur ou égal au taux de croissance deg(x)
.
f(x) = Ω(g(x))
(big-oméga) signifie que le taux de croissance def(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 def(x)
est asymptotiquement inférieur à au taux de croissance deg(x)
.
f(x) = ω(g(x))
(petit oméga) signifie que le taux de croissance def(x)
est asymptotiquement supérieur à au taux de croissance deg(x)
f(x) = Θ(g(x))
(thêta) signifie que le taux de croissance def(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.
>= \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?
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.
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 ....
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(...)
n
temps 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);
}
Θ(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).
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 q
et 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.).
Un graphique pourrait faciliter la compréhension des réponses précédentes:
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 ).
f(n)
appartient à O(n)
si positif existe k
commef(n)<=k*n
f(n)
appartient à Θ(n)
s'il existe positif k1
, k2
commek1*n<=f(n)<=k2*n
Considérons f(n) > 0
et g(n) > 0
pour 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)|
).
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)) ∞
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
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.