Quelle est la complexité temporelle de l'algorithme de vérifier si un nombre est prime?
C'est l'algorithme:
bool isPrime (int number) {
if (number < 2) return false;
if (number == 2) return true;
if (number % 2 == 0) return false;
for (int i=3; (i*i) <= number; i+=2) {
if (number % i == 0 ) return false;
}
return true;
}
O (sqrt (n)) dans l'ampleur du nombre, mais aussi longtemps que vous utilisez int
Notez que les complexités des algorithmes liés au numéro de choix sont souvent discutées avec n comme la longueur (dans les bits) du nombre - et que vous ne pouvez pas assumer des choses comme la comparaison , Ajout, module ou multiplication à être O (1), car avec des numéros d'arbitrari de précision, ces opérations deviennent plus chères avec la taille du nombre.
Le meilleur algorithme actuellement conn fonctionne dans O ((log n) ^ 6)
Le pire des cas - lorsque le nombre est élevé - est assez évident O(sqrt(n)) Le meilleur cas se produit lorsque le nombre peut être divisé par 2,3,5,7,9. Dans ces cas Nous terminerons la boucle jolie bientôt en nombre fini d'étapes - O (1)
Permet maintenant de calculer une affaire moyenne complète pour l'algo:
Sur l'intervalle [0, N], il y a des nombres premiers APROX N/LN (N).
L'algo frappe prime avec une probabilité de p1 = 1/ln (n)
Les autres numéros avec probabilité de p2 = 1-ln (n)
L'affaire moyenne est O (sqrt (n)) * 1/ln (n) + o (1) * (1-ln (n)) Nous nous débarrassons de la partie inférieure
=O(sqrt(n))/ln(n)
déplacer ln (n) à l'intérieur de O ()
=O(sqrt(n)/ln(n))
la base du logarithme n'a pas d'importance pour la notation Big-O
= O(sqrt(n)/log(n))
L'heure d'exécution maximale de cet algorithme est O (sqrt (n)), qui sera obtenue si n est amorifique ou le produit de deux grands nombres premiers.
Le temps d'exécution moyen est délicat; Je dirais quelque chose comme O (sqrt (n)/journal n), car il n'y a pas beaucoup de chiffres avec seulement de gros facteurs premiers.