Comment faire pour déterminer la mémoire et du temps de la complexité d'un algorithme?
Je ne suis pas bon à la détermination du temps et de la mémoire complexité et l'apprécierais si quelqu'un pouvait m'aider.
J'ai un algorithme, ici, et je ne suis pas sûr de ce que son temps et de la mémoire complexité serait.
Function sample(k)
IF k < 2
Return 0
Return 1 + sample(k/2)
Ce qui est de son temps et de la mémoire de la complexité et pourquoi?
Grâce
Cela fait partie de la Informatique Théorique Stack Exchange
Non, il n'est pas vraiment. C'est loin d'être un la recherche au niveau de la question.
A noté
Non, il n'est pas vraiment. C'est loin d'être un la recherche au niveau de la question.
A noté
OriginalL'auteur user3138212 | 2013-12-27
Vous devez vous connecter pour publier un commentaire.
Déterminer le moment et la mémoire complexités élève à comptage combien de ces deux ressources sont utilisées lors de l'exécution de l'algorithme, et de voir comment ces montants changer à mesure que la taille de saisie (k dans ce cas) des changements.
Temps va être déterminé par combien de fois chacune des instructions sont évalués, et un espace sera déterminé par la taille des structures de données concernées doivent obtenir pour calculer la solution.
Dans ce scénario particulier, vous êtes en train de regarder un algorithme récursif, donc, fondamentalement, cela implique de comptage 1) combien d'appels récursifs sont réalisés, et 2) la quantité de travail effectué pour chacun de ces appels.
Depuis l'entrée est réduit de moitié à chaque appel, la séquence d'appels va ressembler à quelque chose comme ceci:
Réduire de moitié à chaque appel récursif de cette façon va conduire à une logarithmique nombre d'appels.
À chaque appel, nous sommes le stockage d'un constante nombre de variables dans la pile d'appel, et de faire de la constante de la quantité de travail (opérations). Cela provient du fait que le nombre de variables et le nombre de comparaisons/ajouts/divisions dans chaque appel ne pas grossir avec de plus gros k.
Le temps total de la complexité est le nombre d'appels, multiplié par la quantité de travail effectué dans chaque appel, ainsi
Pour certaines constantes A et B, qui reflètent le temps réel coût d'un appel récursif et de faire des comparaisons/divisions respectivement. De la même façon:
Adapté pour les constantes C et D pour le coût de l'espace de la récursivité et de stockage variable respectivement.
Maintenant dans ce type d'analyse nous intéresse sur la complexité asymptotique, c'est que nous n'avons pas vraiment de soins sur les constantes, parce qu'elles reflètent des détails sur la machine qui exécute l'algorithme, et nous avons vraiment envie de savoir la forme de la courbe (comme k est plus grand). Si vous suivez les règles de l'écriture de la complexité à l'aide de Grand-Oh notation, vous arriverez à la suite:
Edit: de Mémoire de la complexité des détails
Comme je l'ai dit avant, la mémoire de la complexité est déterminée par la taille des structures de données doivent obtenir pour calculer une solution, de sorte que vous pouvez demander: il n'existe pas de structures de données utilisées dans cette fonction, donc où est le log(k) de la mémoire?
La réponse courte: Vous avez à stocker
log(k)
différentes valeurs du paramètrek
, un pour chaque appel récursif.La réponse détaillée: il y a un implicite structure de données utilisée ici par le mécanisme de la fonction d'appel (qui nous exploiter via la récursivité) et son nom est le la pile des appels. Chaque fois
sample(k)
est appelé, une nouvelle trame de pile est créé et un certain nombre de valeurs sont poussés sur la pile: la valeur locale du paramètrek
, l'adresse de retour, et d'autres dépendant de l'implémentation des choses. De cette façon, chaque appel récursif forme une "couche" sur la pile où son local, l'information est stockée. L'ensemble de l'image finit par ressembler à ceci:(J'ai distingué ici la première valeur du paramètre
p
à partir de la valeur dek
à chaque appel récursif pour éviter toute confusion, nous l'espérons)Principale chose à noter est, comme il y a
n = log(k)
appels récursifs, il y an
une telle pile d'images. Chaque frame de pile a taille constante, et donc l'espace de la complexité estO(log(k))
.Merci pour votre réponse. Je ne suis toujours pas très bien pourquoi l'espace de la complexité est log(k). Je vous serais reconnaissant si vous pourriez expliquer davantage.
Voir l'étendue réponse 🙂
OriginalL'auteur Ezequiel Muns
Vous êtes vraiment à la recherche log_2(k), le logarithme de base 2. Pour changer les bases, vous devez multiplier par une constante. Et puisque nous multiplions par des constantes de toute façon, O(log(n)), O(ln(n)), et O(log_2(n)) sont tous les mêmes.
Alors pourquoi la méthode ci-dessus ont complexité logarithmique avec la base 2? Vous êtes à la division k de la moitié à chaque appel. Si vous allez vers l'arrière, vous le multipliez par 2 à chaque appel. En multipliant par 2 est 2^n, et log_2(n) est exactement l'inverse.
Peut-être cela aide si vous dessinez un arbre binaire: un arbre à n nœuds a la hauteur log_2(n), un arbre à hauteur n a 2^n nœuds.
OriginalL'auteur user835611