web-dev-qa-db-fra.com

Quelqu'un pourrait-il expliquer Big O contre Big Omega vs Big Theta?

Duplicata possible:
Notation Big Theta - que représente exactement Big Theta?

Je le comprends en théorie, je suppose, mais ce que j'ai du mal à comprendre, c'est l'application des trois.

À l'école, nous avons toujours utilisé Big O pour dénoter la complexité d'un algorithme. Le tri à bulles était O (n ^ 2) par exemple.

Maintenant, après avoir lu plus de théorie, je comprends que Big Oh n'est pas la seule mesure, il y en a au moins deux autres intéressantes.

Mais voici ma question:

Big O est la limite supérieure, Big Omega est la limite inférieure et Big Theta est un mélange des deux. Mais qu'est-ce que cela signifie conceptuellement? Je comprends ce que cela signifie sur un graphique; J'en ai vu un million d'exemples. Mais qu'est-ce que cela signifie pour la complexité de l'algorithme? Comment une "borne supérieure" ou une "borne inférieure" se mélange-t-elle à cela?

Je suppose que je n'ai tout simplement pas son application. Je comprends que si multiplié par une constante c que si après une certaine valeur n_0 f(x) est supérieur à g (x), f(x) est considéré comme O (g (x)). Mais qu'est-ce que cela signifie pratiquement? Pourquoi multiplierions-nous f(x) par une valeur c? t importe.

42
Doug Smith

La grande notation O, et ses proches, le grand Thêta, le grand Omega, le petit o et le petit oméga sont des façons de dire quelque chose sur le comportement d'une fonction à un point limite (par exemple, à l'approche de l'infini, mais aussi à l'approche 0, etc.) sans en dire beaucoup plus sur la fonction. Ils sont couramment utilisés pour décrire l'espace d'exécution et le temps des algorithmes, mais peuvent également être vus dans d'autres domaines des mathématiques concernant le comportement asymptotique.

La définition semi-intuitive est la suivante:

Une fonction g(x) est dite O(f(x)) si "à partir d'un certain point", g(x) est inférieur à c * f (x), où c est une constante.

Les autres définitions sont similaires, Theta exigeant que g(x) soit entre deux multiples constants de f (x), Omega exigeant g (x)> c * f (x), et le petit les versions exigent que cela soit vrai pour toutes ces constantes.

Mais pourquoi est-il intéressant de dire, par exemple, qu'un algorithme a un temps d'exécution de O (n ^ 2)?

C'est intéressant principalement parce que, en informatique théorique, nous nous intéressons surtout au comportement des algorithmes pour les grandes entrées. Cela est vrai car sur de petites entrées, les temps d'exécution des algorithmes peuvent varier considérablement en fonction de la mise en œuvre, de la compilation, du matériel et d'autres choses qui ne sont pas vraiment intéressantes lors de l'analyse théorique d'un algorithme.

Le taux de croissance, cependant, dépend généralement de la nature de l'algorithme, et pour l'améliorer, vous avez besoin d'informations plus approfondies sur le problème que vous essayez de résoudre. C'est le cas, par exemple, avec des algorithmes de tri, où vous pouvez obtenir un algorithme simple (Bubble Sort) à exécuter dans O (n ^ 2), mais pour améliorer cela en O (n log n), vous avez besoin d'une idée vraiment nouvelle , comme celle introduite dans Merge Sort ou Heap Sort.

D'un autre côté, si vous avez un algorithme qui s'exécute en exactement 5n secondes et un autre qui s'exécute en 1000n secondes (ce qui est la différence entre un long bâillement et une pause de lancement pour n = 3, par exemple), lorsque vous arrivez à n = 1000000000000, la différence d'échelle semble moins importante. Si vous avez un algorithme qui prend O (log n), vous devrez attendre log (1000000000000) = 12 secondes, peut-être multiplié par une constante, au lieu des 317 098 années, ce qui, quelle que soit la taille de la constante est, est une échelle complètement différente.

J'espère que cela rend les choses un peu plus claires. Bonne chance avec vos études!

38
Alfonso Fernandez