La notation Big Oh (O, Theta, Omega) concerne les taux de croissance des fonctions.
Lorsque vous implémentez un algorithme, il a une certaine caractéristique sur la façon dont le runtime change lorsque vous augmentez le jeu de données. Maintenant, vous pouvez optimiser l'algorithme pour qu'il s'exécute plus rapidement d'un facteur 100. Bien sûr, c'est très bien, mais essentiellement, c'est toujours le même algorithme. De même, dans quelques années, les ordinateurs peuvent être deux fois plus rapides qu'aujourd'hui.
La notation Landau résume ces facteurs constants. Peu importe si un algorithme f
est toujours deux fois plus rapide qu'un autre algorithme g
: g
peut-être peut-être optimisé pour fonctionner 4 fois plus rapidement, ou vous pourriez être en mesure d'acheter du matériel plus rapide à la place. Si vous regardez les choses sous cet angle, vous pourriez dire qu'elles sont «les mêmes». (Cela ne veut pas dire que vous pouvez (toujours) ignorer des facteurs constants dans la pratique.)
Big oh spécifie une limite supérieure, c'est similaire à la <=
relation.
Vous conviendrez que 1 < 2
c'est vrai. Est-ce à dire que 1
cela ne peut pas être inférieur à tout autre nombre? Certainement pas. Il y a une quantité infinie de nombres plus grands que 1
.
Avec des taux de croissance, c'est similaire. O(n)
désigne l'ensemble de toutes les fonctions, qui croissent linéairement (ou plus lentement). O(n^2)
d'autre part dénote toutes ces fonctions, qui croissent avec une compelxité quadratique (ou plus lente). Je suis sûr que vous conviendrez qu'une fonction linéaire croît plus lentement qu'une fonction quadratique.
C'est pourquoi une fonction peut être dans plus d'une classe "Big-oh".
Voici une comparaison de différentes fonctions avec : (à partir des mathématiques concrètes de Knuth)
De gauche à droite, les fonctions se développent plus rapidement.
En outre, ce qui signifie que n ^ 2 croît plus rapidement que n ^ 1 car 2> 1.
Définitions
"f croît plus vite ou aussi vite que g"
"f croît plus lentement ou aussi vite que g"
La combinaison des deux ci-dessus. Il dit que la fonction se f
développe "tout aussi rapidement" que g
. C'est une relation d'équivalence.
Interprétation
Disons que vous avez deux algorithmes, f
et g
.
Oméga
En supposant , signifie que peu importe votre budget, il n'y a pas quantité constante de puissance de calcul que vous pouvez ajouter à votre système, de sorte que f
toujours courir aussi vite que g
.
Grand oh
En supposant , signifie que si vous avez suffisamment de données, f
toujours courir plus vite que g
, peu importe combien de puissance de calcul que vous ajoutez à votre système.
Preuve
Si vous essayez vraiment de le prouver, vous devez montrer en utilisant les définitions de la notation Landau que votre fonction remplit les conditions nécessaires.
Vous avez donc besoin de trouver des valeurs pour c
, d
, de n_0
telle sorte que la condition est.
Voici comment vous pouvez le faire pour la borne inférieure avec c
:
Il est important de réaliser, que je définissant arbitrairement c
comme étant plus petit que a-1
parfaitement bien. La définition de Theta (g) dit qu '"il existe un c
". Il peut s'agir de n'importe quelle valeur tant qu'elle est supérieure à 0. (S'il a
s'agit d'un nombre réel positif, vous devrez toutefois modifier légèrement la preuve, car elle a - 1
pourrait en fait être négative)
(Je suppose a
être positif, sinon la fonction sera toujours négative pour les grandes valeurs de n
, ce qui n'a aucun sens pour une fonction désignant le temps d'exécution.)
Vous pouvez essayer de le faire pour la limite supérieure, c'est assez similaire. Si vous ne savez pas comment, je peux vous fournir une preuve.
Astuce: commencez par d > a + 1
Attention
Il est important de ne pas le prouver dans le mauvais sens. Si vous supposez que (an + b) est dans O (n) et continuez à partir de là, vous n'avez pas prouvé ce que vous vouliez. Vous devrez vérifier que toutes vos étapes vont dans les deux sens, c'est-à-dire au lieu de =>
vous <=>
.