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?
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.
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 def(x)
est asymptotique 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 asymptotique plus grand ou égal à le taux de croissance deg(x)
f(x) = o(g(x))
(little-oh) signifie que le taux de croissance def(x)
est asymptotique moins que le taux de croissance deg(x)
.
f(x) = ω(g(x))
(petit-oméga) signifie que le taux de croissance def(x)
est asymptotique plus grand que le taux de croissance deg(x)
f(x) = Θ(g(x))
(thêta) signifie que le taux de croissance def(x)
est asymptotique égal à le taux de croissance deg(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.
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.
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 ....
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);
}
Un graphique pourrait rendre les réponses précédentes plus faciles à comprendre:
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 ).
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.).
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
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.
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)|
).
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