Réponses:
Si vous dessinez simplement quelques graphiques, vous serez en bonne forme. Wolfram Alpha est une excellente ressource pour ces types d'enquêtes:
Généré par ce lien . Notez que dans le graphique, log (x) est le logarithme naturel, c'est pourquoi l'équation d'un graphique semble un peu drôle.
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.
vs n k , pour k < 1 est identique à: n / log n vs n / n 1 - k
comme pour grand n , n / log n > n k pour k < 1 et grand n .
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 que O(n/log n)
pour 0 < 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 que O(n/log n)
pour 0 < 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) par n^f
pour tout f > 0
.
Pour le montrer plus clairement, considérons ce qui se passe lorsque n augmente.
n n / log n n^(1/2)
2 n/ 1 ?
4 n/ 2 n/ 2
8 n/ 3 ?
16 n/ 4 n/ 4
64 n/ 6 n/ 8
256 n/ 8 n/16
1024 n/10 n/32
Remarquez ce qui diminue plus rapidement? C'est la n^f
colonne.
Même si elle f
était plus proche de 1, la n^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 la n/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 qui k
est assez proche de 1 (at 0.9
). J'ai également sélectionné les constantes afin qu'au départ O(n^k)
soit plus lent. Cependant, notez qu'il finit par "gagner" à la fin, et prend moins de temps que O(n/log n)
.
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
O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^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
O(10^9)
, mais le point principal sur l'utilisation de quelques chiffres pour construire l'intuition est juste.