Comme une alternative, utiliser une variable de substitution y = n - x
suivie par la notation Sigma pour analyser le nombre d'itérations de l'intérieur de la while
boucle de votre algorithme.
Le ci-dessus surestime, pour chaque intérieur lors de la boucle, le nombre d'itérations par 1
pour les cas où l' n-1
n'est pas un multiple de i
, (n-1) % i != 0
. Alors que nous avançons, nous allons supposer que (n-1)/i
est un entier pour toutes les valeurs de i
, d'où une surestimation du nombre total d'itérations dans le centre - while
boucle, par la suite, y compris les moins ou signe égal au (i)
ci-dessous. Nous avons procéder à la notation Sigma analyse:
où nous, en (ii)
, se sont chiffrées à l' n
:th harmonique nombre par les associés intégrale. Par conséquent, vous algorithme s'exécute en O(n·ln(n))
, asymptotiquement.
Laissant comportement asymptotique et l'étude de la croissance réelle de l'algorithme, nous pouvons utiliser la nice des données de l'échantillon de l'exacte (n,cnt)
(où cnt
nombre d'intérieure itérations) paires par @chux (voir sa réponse), et de les comparer avec l'estimation du nombre d'itérations à partir de ci-dessus, c'est à dire, n(1+ln(n))-ln(n)
. Il est évident que l'estimation harmoniser parfaitement avec le nombre réel, voir les parcelles ci-dessous ou cet extrait de code pour les nombres réels.
Notez enfin que si nous laissons n->∞
dans la somme sur 1/i
- dessus, la série qui en résulte est l' infini de la série harmonique, qui est, curieusement, divergents. La preuve de ce dernier utilise le fait que, dans la somme infinie de termes non nuls est naturellement infini lui-même. Dans la pratique, cependant, pour une suffisamment grande, mais pas à l'infini n, ln(n)
est une bonne approximation de la somme, et cette divergence n'est pas pertinent pour notre analyse asymptotique ici.