Qu'est-ce qu'une analyse amortise? Et comment cela peut-il m'aider à atteindre Garanties de performance les plus strictes dans mes programmes?
J'étais Lecture que les techniques suivantes peuvent aider le programmateur à atteindre Garanties de performance palesdies (c'est-à-dire dans mes propres mots: garantissant que l'heure de fonctionnement d'un programme ne serait pas dépasser le temps de fonctionnement dans la pire distribution):
L'auteur a mentionné l'utilisation de Structure de données de réseau de redimensionnement pour la pile comme un exemple de la manière d'obtenir une analyse amortie, mais je ne comprends toujours pas quelle analyse amortie est et comment elle peut réellement être implémenté (structure de données? algorithme?) Pour obtenir des garanties de performance les plus répandues
Vous n'ayez pas implémenter une analyse amortie. C'est une technique pour obtenir plus de précision O
limites.
L'observation essentielle que vous devez faire est que les opérations coûteuses ne puissent pas arriver à tout moment.
Dans le cas d'une structure de données soutenue par une matrice, la matrice a besoin de redimensionner de temps en temps - quand elle est pleine. C'est l'opération la plus chère et prend O(n)
temps. Tous les autres inserts dans la matrice sont O(1)
.
Pour déterminer le temps d'exécution pour l'insertion n
éléments, vous pouvez multiplier n
avec le fonctionnement le plus coûteux O(n)
, ce qui entraîne un comportement global d'exécution de O(n^2)
.
Cependant, cela est inexact car le redimensionnement ne peut pas arriver très souvent.
Lorsque vous parlez d'argent, vous AMORTIZEZ Coût, lorsque vous remboursez votre dette avec plusieurs petits paiements au fil du temps.
Nous pouvons utiliser ce modèle pour réfléchir également aux algorithmes. Nous substituons simplement "l'heure" avec "argent" pour éviter la cartographie mentale.
Une fois que la matrice est pleine de longueur n
, nous pouvons doubler sa taille. Nous devons faire les opérations suivantes:
2n
Morceaux de mémoiren
articlesSi nous supposons que la mémoire allouée et la copie se produisent en temps linéaire, cela va être une opération très coûteuse. Cependant, nous pouvons maintenant utiliser l'idée de la dette et l'amortissant pour notre analyse. Seulement, nous allons amortir notre dette avant de le faire réellement.
[.
Cela a l'implication suivante:
n
éléments couvrira le coût du redimensionnement et de la copie (nous avons n
_ machines à sous utilisées et n
Slots inutilisés`)Nous pouvons maintenant penser à quel point chaque opération d'insertion doit payer pour:
Nous avons maintenant couvert les coûts pour allouer la mémoire, copier et insérer les éléments suivants n
. Cependant, nous avons encore négligé l'affectation de l'espace pour les anciens n
éléments ainsi que les copier.
Nous distribuons simplement les coûts de nos anciens n
éléments à notre nouvelle (encore à insérer) n
éléments:
Au total, chaque opération d'insertion coûtera 5 unités. Cela paie pour sa propre insertion et le déménagement et l'allocation de l'espace pour lui-même et l'un des anciens éléments.
Chaque opération d'insertion prend toujours une durée constante, mais le redimensionnement se produit gratuitement: nous l'avons amortis en dépensant une durée "plus" de chaque insertion.
En conséquence, l'insertion n
éléments prend O(n)
temps.
Les autres techniques d'analyse amortie sont expliquées ici .
Tout d'abord: il s'agit d'une technique pour analyser les exécutions de programme, pas une technique de mise en œuvre pour les algorithmes.
L'exemple mentionné dans votre liste est un bon: Ajout d'un seul élément à la structure de données soutenue par une matrice. Pour chaque opération d'appends unique, le pire des cas devient à copier tous les éléments existants. Ce type d'analyse est beaucoup trop pessimiste, car vous n'avez pas à faire cela si vous utilisez une stratégie de redimensionnement en sens unique (multipliez la taille par certains X> 1.0). L'analyse dit alors que vous avez une liaison O (n ^ 2) - O(n) par article Times N articles - tandis que le temps d'exécution réel est uniquement O (n).
Si vous avez moyenné le coût de redimensionnement sur tous les éléments insérés (dont la plupart n'a pas besoin de redimensionnement), vous faites une analyse amortie. L'analyse amortise entraîne un O(n) liaison correspondant au comportement réel de l'algorithme.