n * log n et n / log n en fonction du temps d'exécution polynomial


14

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ù .Θ(n)Θ(nJournaln)Θ(n/Journaln)Θ(nJournaln)Θ(n/Journaln)Θ(nF)0<F<1

Par exemple, comment décidons-nous vs ouΘ(n/Journaln)Θ(n2/3)Θ(n1/3)

J'aimerais avoir des instructions pour procéder dans de tels cas. Je vous remercie.

Réponses:


3

Si vous dessinez simplement quelques graphiques, vous serez en bonne forme. Wolfram Alpha est une excellente ressource pour ces types d'enquêtes:

équations

Graphique

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.



En plus d'être d'accord avec Raphael, cette image donnerait une bien meilleure idée , choisir une plage encore plus grande laisse disparaître la deuxième fonction, ce qui peut être déroutant.
phant0m

9

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.Journaln2n2nnkkJournalnnkk

vs n k , pour k < 1 est identique à: n / log n vs n / n 1 - kn/Journalnnkk<1n/Journalnn/n1-k

comme pour grand n , n / log n > n k pour k < 1 et grand n .n1-k>Journalnnn/Journaln>nkk<1n


3

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 nsera finalement négligeable par rapport à la multiplication (ou la division) par n^fpour 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^fcolonne.

Même si elle fétait plus proche de 1, la n^fcolonne 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 ncolonne semble changer à un taux constant.

Tracons un cas particulier sur un graphe

entrez la description de l'image ici entrez la description de l'image ici

Source: Wolfram Alpha

J'ai sélectionné O(n^k)tel qui kest 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).



C'était un peu une faute de frappe, c'est ce que je voulais dire au début. Quoi qu'il en soit, j'ai ajouté un graphique plus approprié qui montre n^kfinalement être plus rapide, même si les constantes sont sélectionnées de sorte qu'il est initialement plus lent.

3

Pense juste à comme nnF . Doncpour votre exemple,n2/3=n/n1/3. Il est ensuite facile de comparer la croissance denn1-Fn2/3=n/n1/3

nJournalncontre.nn1-F.

Journalnnεε>0


1

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


1
N'écrivez pas O(10^9), mais le point principal sur l'utilisation de quelques chiffres pour construire l'intuition est juste.

Échouer. Ce n'est pas correct. Vous avez substitué une seule constante n, qui peut être biaisée. Si je choisissais différentes constantes, je pourrais améliorer l'apparence de n'importe quel algorithme. La notation Big O est utilisée pour établir les tendances de ce qui sera plus rapide à long terme. Pour ce faire, vous devez pouvoir montrer qu'il est plus rapide pour les grands n, même s'il est plus lent lorsque n est plus petit.

Merci. Ajout d'une partie de valeurs multiples et de considérer de plus grands nombres

Il convient de noter que le simple fait que f (a)> g (a) pour une constante a n'implique pas nécessairement que O (f (x))> O (g (x)). Ceci est utile pour construire l'intuition, mais est insuffisant pour composer une preuve rigoureuse. Afin de montrer que cette relation est vraie, vous devez montrer que cela est vrai pour TOUS les grands n, pas seulement pour un grand n. De même, vous devez montrer que cela est vrai pour tous les polynômes de degré positif <1.

1

Fg

nα1(Journaln)α2(JournalJournaln)α3nβ1(Journaln)β2(JournalJournaln)β3(α1,α2,α3)<(β1,β2,β3)

(2,dix)<(3,5)(2,dix)>(2,5)

Appliqué à votre exemple:

O(n/Journaln)(1,-1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,-1,0)O(n1/3)O(n2/3)O(n/Journaln)

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.