web-dev-qa-db-fra.com

O(n^2) vs O (n (logn) ^ 2)

La complexité temporelle O(n^2) ou O (n(logn)^2) est-elle meilleure?

Je sais que lorsque nous le simplifions, il devient

O(n) vs O((logn)^2)

et logn <n, mais qu'en est-il de logn^2?

11
Chin

n est seulement inférieur à ( log n)2 pour les valeurs de n inférieures à 0.49 ...

Donc en général ( log n)2 est mieux pour les grands n ...

Mais puisque ces notationsO(quelque chose) - omettent toujours des facteurs constants, dans votre cas, il pourrait ne pas être possible de dire avec certitude quel algorithme est le meilleur ...

Voici un graphique:

enter image description here

(La ligne bleue est n et la ligne verte est ( log n)2 )

Remarquez comment la différence pour les petites valeurs de n n'est pas si grande et peut facilement être minimisée par les facteurs constants non inclus dans la notation Big-O.

Mais pour les grands n , ( log n)2 gagne haut la main:

enter image description here

15
Markus A.

Pour chaque constante k asymptotiquement log(n)^k < n.

La preuve est simple, connectez-vous des deux côtés de l'équation, et vous obtenez:

log(log(n))*k < log(n)

Il est facile de voir que asymptotiquement, c'est correct.


Note sémantique: Supposons ici log(n)^k == log(n) * log(n) * ... * log(n) (k times) et NOT log(log(log(...log(n)))..) (k times) car il est parfois utilisé.

11
amit
O(n^2) vs. O(n*log(n)^2)
<=> O(n) vs. O(log(n)^2) (divide by n)
<=> O(sqrt(n)) vs. O(log(n)) (square root)
<=> polynomial vs. logarithmic

Logarithmique gagne.

2
Timothy Shields

(logn)^2 est également <n

Prenons un exemple: 

 n = 5
 log n = 0.6989....
 (log n)^ 2 = 0.4885..

Vous pouvez voir que (long n) ^ 2 est encore réduit.

Même si vous prenez une plus grande valeur de n p. Ex. 100 000 000, puis 

   log n = 9
   (log n)^ 2 = 81

qui est beaucoup moins que n.

0
Yogendra Singh

(Log n) ^ 2 est préférable, car si vous modifiez une variable n par exp m, alors m ^ 2 est meilleur que exp m

0
Nahuel Fouilleul