Je comprends que est plus rapide que et plus lent que . Ce qui est difficile à comprendre pour moi, c'est comment comparer réellement et avec où .
Par exemple, comment décidons-nous vs ou
J'aimerais avoir des instructions pour procéder dans de tels cas. Je vous remercie.
est l'inverse de 2 n . Tout comme 2 n croît plus rapidement que tout polynôme n k, quelle que soit la taille d'un k fini, log n croît plus lentement que toutes les fonctions polynomiales n k, quelle que soit la taille d'un k positif non nul.Journaln 2n 2n nk k Journaln nk k
vs n k , pour k < 1 est identique à: n / log n vs n / n 1 - kn / logn nk k < 1 n / logn n / n1 - k
comme pour grand n , n / log n > n k pour k < 1 et grand n .n1 - k> journaln n n / logn > nk k < 1 n
la source
Pour de nombreux algorithmes, il arrive parfois que les constantes soient différentes, ce qui fait que l'une ou l'autre est plus rapide ou plus lente pour des tailles de données plus petites et n'est pas aussi bien ordonnée par la complexité algorithmique.
Cela dit, si l'on ne considère que les très grandes tailles de données, à savoir. que l'on gagne finalement,
O(n^f)
est alors plus rapide queO(n/log n)
pour0 < f < 1
.Une grande partie de la complexité algorithmique consiste à déterminer quel algorithme est finalement plus rapide, sachant ainsi que
O(n^f)
c'est plus rapide queO(n/log n)
pour0 < f < 1
, c'est souvent suffisant.Une règle générale est que la multiplication (ou la division) par
log n
sera finalement négligeable par rapport à la multiplication (ou la division) parn^f
pour toutf > 0
.Pour le montrer plus clairement, considérons ce qui se passe lorsque n augmente.
Remarquez ce qui diminue plus rapidement? C'est la
n^f
colonne.Même si elle
f
était plus proche de 1, lan^f
colonne commencera juste plus lentement, mais lorsque n double, le taux de variation du dénominateur s'accélère, tandis que le dénominateur de lan/log n
colonne semble changer à un taux constant.Tracons un cas particulier sur un graphe
Source: Wolfram Alpha
J'ai sélectionné
O(n^k)
tel quik
est assez proche de 1 (at0.9
). J'ai également sélectionné les constantes afin qu'au départO(n^k)
soit plus lent. Cependant, notez qu'il finit par "gagner" à la fin, et prend moins de temps queO(n/log n)
.la source
n^k
finalement être plus rapide, même si les constantes sont sélectionnées de sorte qu'il est initialement plus lent.Pense juste à comme nnF . Doncpour votre exemple,n2/3=n/n1/3. Il est ensuite facile de comparer la croissance denn1 - f n2 / 3= n / n1 / 3
la source
Lors de la comparaison des temps d'exécution, il est toujours utile de les comparer en utilisant de grandes valeurs de n. Pour moi, cela aide à construire une intuition sur la fonction qui est la plus lente
Dans votre cas, pensez à n = 10 ^ 10 et a = 0,5
Par conséquent, O (n ^ a) est plus rapide que O (n / logn), lorsque 0 <a <1, j'ai utilisé une seule valeur, cependant, vous pouvez utiliser plusieurs valeurs pour créer une intuition sur la fonction
la source
O(10^9)
, mais le point principal sur l'utilisation de quelques chiffres pour construire l'intuition est juste.Appliqué à votre exemple:
Vous pourriez dire: les pouvoirs de n dominent les pouvoirs de log, qui dominent les pouvoirs de log log.
Source: Mathématiques concrètes, p. 441
la source