Aujourd'hui en classe, mon professeur a écrit sur le tableau noir cet algorithme factoriel récursif:
int factorial(int n) {
if (n == 1)
return 1;
else
return n * factorial(n-1);
}
Elle a dit que cela avait un coût de T(n-1) + 1
.
Puis avec la méthode d'itération, elle a dit que T(n-1) = T(n-2) + 2 = T(n-3) + 3 ... T(n-j) + j
, donc l'algorithme s'arrête quand n - j = 1
, Donc j = n - 1
.
Après cela, elle a remplacé j
dans T(n-j) + j
, et a obtenu T(1) + n-1
.
Elle a dit directement que pour cela n-1 = 2(Journal2n-1), donc le coût de l'algorithme est exponentiel.
J'ai vraiment perdu les deux dernières étapes. Quelqu'un peut-il me les expliquer?
Commençons par l'analyse de cet algorithme. Nous pouvons écrire une relation de récurrence pour la quantité totale de travail effectuée. Comme cas de base, vous effectuez une unité de travail lorsque l'algorithme est exécuté sur une entrée de taille 1, donc
T (1) = 1
Pour une entrée de taille n + 1, votre algorithme effectue une unité de travail au sein de la fonction elle-même, puis appelle la même fonction sur une entrée de taille n. Donc
T (n + 1) = T(n) + 1
Si vous développez les termes de la récurrence, vous obtenez que
Donc, en général, cet algorithme nécessitera n unités de travail pour terminer (c'est-à-dire T(n) = n).
La prochaine chose que votre professeur a dit est que
T (n) = n = 2journal2 n
Cette affirmation est vraie, car 2journal2x = x pour tout x différent de zéro, puisque l'exponentiation et les logarithmes sont des opérations inverses l'une de l'autre.
La question est donc: est-ce le temps polynomial ou le temps exponentiel? Je classerais cela comme du temps pseudopolynomial. Si vous traitez l'entrée x comme un nombre, le runtime est en effet un polynôme en x. Cependant, le temps polynomial est formellement défini de telle sorte que le temps d'exécution de l'algorithme doit être un polynôme par rapport au nombre de bits utilisés pour spécifier l'entrée du problème. Ici, le nombre x peut être spécifié en seulement bits (log x) bits, donc le runtime de 2log x est techniquement considéré comme un temps exponentiel. J'ai écrit à ce sujet en tant que longueur dans cette réponse précédente , et je recommanderais de le regarder pour une explication plus approfondie.
J'espère que cela t'aides!