En quoi est-elle différente de l'analyse asymptotique? Quand l'utilisez-vous et pourquoi?
J'ai lu des articles qui semblent avoir été bien écrits, comme ceux-ci:
http://www.ugrad.cs.ubc.ca/~cs320/2010W2/handouts/aa-nutshell.pdf
http://www.cs.princeton.edu/~fiebrink/423/AmortizedAnalysisExplained_Fiebrink.pdf
mais je n'ai toujours pas bien compris ces concepts.
Alors, quelqu'un peut-il me simplifier la tâche?
L'analyse amortie ne multiplie pas naïvement le nombre d'appels avec le pire des cas pour une seule invocation.
Par exemple, pour un tableau dynamique qui double de taille en cas de besoin, une analyse asymptotique normale conclurait seulement que l'ajout d'un élément à celui-ci coûte O (n), car il pourrait avoir besoin de croître et de copier tous les éléments dans le nouveau tableau. L'analyse amortie tient compte du fait que pour avoir à croître, n/2 éléments doivent avoir été ajoutés sans provoquer de croissance depuis la croissance précédente, donc l'ajout d'un élément ne prend vraiment que O(1) (le coût de O(n) est amorti sur n/2 actions).
L'analyse amortie n'est pas la même chose qu'une "performance moyenne" - l'analyse amortie donne une garantie ferme sur ce que la performance fera si vous faites autant d'actions.
Il y a beaucoup de réponses à "quoi", mais aucune à "pourquoi".
Comme tout le monde l'a dit, l'analyse asymptotique concerne la façon dont les performances d'une opération donnée s'adaptent à un grand ensemble de données. L'analyse amortie concerne la façon dont la moyenne des performances de toutes les opérations sur un grand ensemble de données est échelonnée. L'analyse amortie ne donne jamais de limites pires que asymptotiques, et donne parfois de bien meilleures.
Si vous êtes préoccupé par la durée totale d'un travail plus long, les meilleures limites de l'analyse amortie sont probablement ce qui vous intéresse. C'est pourquoi les langages de script (par exemple) sont souvent heureux de développer des tableaux et des tables de hachage par un certain facteur, même si c'est une opération coûteuse. (La croissance peut être une opération O(n)
, mais amortie est O(1)
parce que vous le faites rarement.)
Si vous effectuez une programmation en temps réel (les opérations individuelles doivent se terminer dans un délai prévisible), les meilleures limites de l'analyse amortie n'ont pas d'importance. Peu importe si l'opération a été rapide en moyenne, si vous ne l'avez pas terminée à temps pour revenir en arrière et régler la scie à ruban avant qu'elle ne coupe trop loin ...
Celui qui compte dans votre cas dépend exactement de votre problème de programmation.
Ce terme se réfère à l'analyse des performances de l'algorithme en supposant que les données sur lesquelles l'algorithme fonctionne (le entrée) sont, en termes simples, "suffisamment grandes pour que leur agrandissement ne change pas la conclusion". Bien que la taille exacte de l'entrée n'ait pas besoin d'être spécifiée (nous n'avons besoin que d'une limite supérieure), l'ensemble de données lui-même a doit être spécifié.
Notez que jusqu'à présent, nous n'avons parlé que de la méthode de l'analyse; nous n'avons pas spécifié exactement quelle quantité nous analysons (complexité temporelle? complexité spatiale?), et nous n'avons pas non plus spécifié quelle métrique nous sommes intéressés (pire cas? meilleur cas ? moyenne?).
En pratique, le terme analyse asymptotique fait généralement référence à complexité de la limite supérieure d'un algorithme, c'est-à-dire les performances les plus défavorables mesurées par le temps de fonctionnement total, qui est représenté par la notation big-Oh (par exemple, un algorithme de tri pourrait être O(nlogn)
).
Ce terme se réfère à l'analyse des performances de l'algorithme basée sur une séquence spécifique d'opérations qui cible le pire scénario - c'est-à-dire que l'analyse amortie implique que la métrique est la pire des performances (bien qu'elle le fasse toujours ne pas dire quelle quantité est mesurée). Pour effectuer cette analyse, nous devons spécifier la taille de l'entrée, mais nous n'avons pas besoin de faire d'hypothèses sur sa forme.
En termes simples, l'analyse amortie consiste à choisir une taille arbitraire pour l'entrée, puis à "lire" l'algorithme. Chaque fois qu'une décision qui dépend de l'entrée doit être prise, le pire chemin est pris¹. Une fois l'algorithme exécuté, nous divisons la complexité calculée par la taille de l'entrée pour produire le résultat final.
¹note: Pour être précis, le pire chemin qui est théoriquement possible. Si vous avez un vecteur dont la taille double dynamiquement à chaque fois que sa capacité est épuisée, le "pire des cas" ne signifie pas qu'il devra doubler lors de l'insertion chaque car les insertions sont traitées comme une séquence . Nous sommes autorisés à (et devons en effet) utiliser connus état pour éliminer mathématiquement autant de cas "encore pires" que possible, même si l'entrée reste inconnue.
La différence critique entre une analyse asymptotique et une analyse amortie est que la première dépend de l'entrée elle-même, tandis que la seconde dépend de la séquence d'opérations que l'algorithme exécutera.
Par conséquent:
La réponse à cette question est succinctement définie par la première phrase du chapitre Analyse amortie du livre - Introduction aux algorithmes:
Dans une analyse amortie, le temps nécessaire pour effectuer une séquence d'opérations de structure de données est moyenné sur toutes les opérations effectuées.
Nous représentons la complexité de la croissance d'un programme par analyse asymptotique - qui limite la croissance du programme par une fonction et définit le pire, le meilleur ou le cas moyen de cela.
Mais cela peut être trompeur dans les cas où il n'y a qu'un seul cas où la complexité du programme atteint un pic, mais en général, le programme ne prend pas beaucoup de calcul.
Par conséquent, il est plus logique de faire la moyenne des coûts sur une séquence d'opérations, même si une seule opération peut être coûteuse. Ceci est une analyse amortie!
L'analyse amortie est une alternative à la technique asymptotique utilisée pour calculer la complexité. Il nous aide à calculer une complexité plus vraie en termes de caractère pratique, afin de comparer et de décider entre deux ou plusieurs algorithmes.
La meilleure référence que j'ai trouvée jusqu'à présent pour comprendre l'analyse amortie des algorithmes se trouve dans le livre Introduction to Algorithms , troisième édition, chapitre 17: "Amortized Analysis". Tout est là, expliqué bien mieux que ce que l'on peut trouver dans un article Stack Overflow. Vous trouverez le livre dans la bibliothèque de n'importe quelle université décente.
Une analyse asymptotique régulière examine les performances d'une opération individuelle de manière asymptotique, en fonction de la taille du problème. La notation O() est ce qui indique une analyse asymptotique.
L'analyse amortie (qui est également une analyse asymptotique) examine les performances totales de plusieurs opérations sur une infrastructure de données partagée .
La différence est que l'analyse amortie prouve généralement que le calcul total requis pour M opérations a une meilleure garantie de performance que M fois le pire des cas pour l'opération individuelle.
Par exemple, une opération individuelle sur un arbre d'affichage de taille N peut prendre jusqu'à O(N) temps. Cependant, une séquence d'opérations M sur un arbre de la taille N est limitée par le temps O (M (1 + log N) + N log N), qui est à peu près O (log N) par opération. : cela prouve que toute séquence d'opérations possible satisfera son pire cas asymptotique.
L'analyse amortie traite du coût total sur un certain nombre d'exécutions de la routine et des avantages qui peuvent en être tirés. Par exemple, la recherche d'un tableau non trié de n éléments pour une seule correspondance peut prendre jusqu'à n comparaisons et est donc de complexité o(n). Cependant, si nous savons que le même tableau va être recherché pour m éléments, la répétition de la tâche totale aurait alors la complexité O (m * n). Cependant, si nous trions le tableau à l'avance, le coût est O (n log (n)), et les recherches successives ne prennent que O(log(n)) pour un tableau trié. Ainsi, le coût amorti total pour m éléments adoptant cette approche est O (n * log (n) + m * log (n)). Si m> = n, cela équivaut à O (n log (n)) par pré-tri par rapport à O (n ^ 2) pour non tri, le coût amorti est donc moins cher.
En termes simples, en dépensant un peu plus tôt, nous pouvons économiser beaucoup plus tard.