Je suis vraiment confus quant aux différences entre les grandes notations O, Big Omega et Big Theta.
Je comprends que big O est la limite supérieure et Big Omega est la limite inférieure, mais que représente exactement big (thêta)?
J'ai lu que cela signifieétroitement lié, mais qu'est-ce que cela signifie?
Cela signifie que l'algorithme est à la fois big-O et big-Omega dans la fonction donnée.
Par exemple, s'il s'agit de Ө(n)
, il existe une constante k
, telle que votre fonction (exécution, peu importe), est supérieure à n*k
pour une variable suffisamment grande n
et une autre constante K
telle que votre fonction est inférieure à n*K
pour suffisamment grand n
.
En d'autres termes, pour n
suffisamment grand, il est pris en sandwich entre deux fonctions linéaires:
Pour k < K
et n
suffisamment grand, n*k < f(n) < n*K
Commençons par comprendre ce que sont le gros O, le grand Theta et le grand Omega. Ils sont tous ensembles de fonctions.
Big O donne le asymptotique lié supérieur, tandis que le grand Omega donne une borne inférieure. Big Theta donne les deux.
Tout ce qui est Ө(f(n))
est également O(f(n))
, mais pas l'inverse .T(n)
est dit être dans Ө(f(n))
s'il est à la fois dans O(f(n))
et dans Omega(f(n))
.
Dans la terminologie des ensembles, Ө(f(n))
EST LE INTERSECTION DE O(f(n))
ET Omega(f(n))
Par exemple, le pire des cas de fusion est à la fois O(n*log(n))
et Omega(n*log(n))
- et donc aussi à Ө(n*log(n))
, mais également à O(n^2)
, puisque n^2
est asymptotiquement "plus grand" que lui. Cependant, il s’agit de notӨ(n^2)
, puisque l’algorithme n’est pas Omega(n^2)
.
O(n)
est la limite supérieure asymptotique. Si T(n)
est O(f(n))
, cela signifie que, à partir d'un certain n0
, il existe une constante C
telle que T(n) <= C * f(n)
. Par ailleurs, Big-Omega dit qu'il existe une constante C2
telle que T(n) >= C2 * f(n))
).
Ne pas confondre avec l'analyse des cas les plus, des meilleurs et des cas moyens: les trois notations (Omega, O, Theta) sont not liées aux analyses des cas les meilleurs, les plus mauvais et les plus moyens des algorithmes. Chacun de ceux-ci peut être appliqué à chaque analyse.
Nous l'utilisons généralement pour analyser la complexité des algorithmes (comme l'exemple de tri par fusion ci-dessus). Lorsque nous disons que "l'algorithme A est O(f(n))
", ce que nous voulons vraiment dire est "La complexité de l'algorithme dans le pire des cas.1 L’analyse de cas est O(f(n))
"- ce qui signifie qu’elle est" similaire "(ou formellement, pas pire que) la fonction f(n)
.
Eh bien, il y a plusieurs raisons à cela, mais je pense que les plus importantes d'entre elles sont:
Pour illustrer ce problème, consultez les graphiques suivants:
Il est clair que f(n) = 2*n
est "pire" que f(n) = n
. Mais la différence n’est pas aussi radicale que dans l’autre fonction. Nous pouvons voir que f(n)=logn
devient rapidement beaucoup plus bas que les autres fonctions, et f(n) = n^2
devient rapidement beaucoup plus haut que les autres.
Donc, à cause des raisons ci-dessus, nous "ignorons" les facteurs constants (2 * dans l'exemple des graphiques) et prenons uniquement la notation big-O.
Dans l'exemple ci-dessus, f(n)=n, f(n)=2*n
sera à la fois dans O(n)
et dans Omega(n)
- et sera donc également dans Theta(n)
.
D'autre part - f(n)=logn
sera dans O(n)
(il est "meilleur" que f(n)=n
), mais NE SERA PAS dans Omega(n)
- et ne sera donc PAS aussi dans Theta(n)
.
Symétriquement, f(n)=n^2
sera dans Omega(n)
, mais PAS dans O(n)
, et donc - n'est pas non plus Theta(n)
.
1Habituellement, mais pas toujours. quand la classe d'analyse (pire, moyenne et meilleure) est manquante, nous entendons vraiment le pire des cas.
Theta (n): Une fonction f(n)
appartient à Theta(g(n))
, s'il existe des constantes positives c1
et c2
telles que f(n)
puisse être pris en sandwich entre c1(g(n))
et c2(g(n))
. c'est-à-dire qu'il donne à la fois la limite supérieure et la limite inférieure.
Theta (g (n)) = {f(n): il existe des constantes positives c1, c2 et n1 telles que 0 <= c1 (g (n)) <= f (n) <= c2 (g (n)) pour tout n> = n1}
lorsque nous disons f(n)=c2(g(n))
ou f(n)=c1(g(n))
, cela représente une limite asymptotiquement étroite.
O (n): Il ne donne que la limite supérieure (peut être serré ou non)
O(g(n)) = {f(n): il existe des constantes positives c et n1 telles que 0 <= f (n) <= cg (n) pour tout n> = n1}
ex: le 2*(n^2) = O(n^2)
lié est asymptotiquement serré, alors que le 2*n = O(n^2)
lié n'est pas asymptotiquement serré.
o (n): Il ne donne que la limite supérieure (jamais une limite étroite)
la différence notable entre O(n) et o(n) est f(n) est inférieure à cg (n) pour tout n> = n1 mais non égal à O (n).
ex: 2*n = o(n^2)
, mais 2*(n^2) != o(n^2)
J’espère que c’est ce que vous voudrez peut-être trouver dans le classique CLRS (page 66):
Rien à gâcher mon pote !!
Si nous avons une valeur positive, les fonctions f(n) et g(n) prennent un argument positif n, alors ϴ (g (n)) défini comme {f (n): il existe des constantes c1 , c2 et n1 pour tout n> = n1}
où c1 g (n) <= f (n) <= c2 g (n)
c1 = 5 et c2 = 8 et n1 = 1
Parmi toutes les notations, la notation donne la meilleure intuition sur le taux de croissance de la fonction car elle nous donne un lien étroit contrairement à big-oh et big -omega , Qui donne respectivement les limites supérieure et inférieure.
ϴ nous dit que g(n) est aussi proche que f (n), le taux de croissance de g(n) est aussi proche du taux de croissance de f(n) comme possible.