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
?
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:
(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:
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é.
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.
(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
.
(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