web-dev-qa-db-fra.com

Analyse amortie? (Garanties de performance palesdies)

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):

  • Algorithmes randomisés (par exemple, algorithme Quicksort est quadratique dans le pire des cas, mais commander au hasard l'entrée donne une garantie probabiliste que son temps de fonctionnement est linéarithmique)
  • Séquences d'opérations (notre analyse doit prendre en compte les données et la séquence des opérations effectuées par le client)
  • Analyse amortie (Un autre moyen de fournir une garantie de performance est d'amortir le coût, en gardant une trace du coût total de toutes les opérations, divisé par le nombre de Opérations. Dans ce cadre, nous pouvons permettre des opérations coûteuses, tout en conservant le coût moyen des opérations bas. En d'autres termes, nous avons réparti le coût des rares opérations coûteuses, en l'attribuant une partie à chacun d'un grand nombre de personnes peu coûteuses. Opérations)

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

13
Anthony

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:

  • Allouer 2n Morceaux de mémoire
  • copier n articles

Si 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:

  • L'insertion des éléments suivants 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:

  • L'insert
  • Le coût d'attribution d'un morceau de mémoire
  • le coût de la déplacement de la mémoire nouvellement allouée

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:

  • Le coût d'attribution d'un morceau de mémoire
  • le coût de la déplacement de la mémoire nouvellement allouée

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 .

14
phant0m

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.

1
Patrick