Ce qui est un invariant?
Le mot semble l'avoir utilisé dans un certain nombre de contextes. Le mieux que je peux comprendre, c'est qu'ils signifient une variable qui ne peut pas changer. N'est-ce pas constantes/finales (darn vous Java!) sont pour?
- Ils devraient peut-être l'avez appelé non-variante?
Vous devez vous connecter pour publier un commentaire.
Un invariant est plus "conceptuel" que d'une variable. En général, c'est une propriété de l'état du programme qui est toujours vrai. Une fonction ou une méthode qui garantit que l'invariant est dit à maintenir l'invariant.
Par exemple, un arbre de recherche binaire peut avoir l'invariant que pour chaque nœud, la clé du nœud de gauche de l'enfant est moins que le nœud est propre clé. Correctement écrit insertion de la fonction pour cet arbre à conserver cette invariant.
Comme vous pouvez le dire, ce n'est pas le genre de chose que vous pouvez stocker dans une variable: c'est plus une déclaration sur le programme. Par trouver ce genre d'invariants votre programme devrait maintenir, puis l'examen de votre code pour s'assurer qu'il maintient actuellement ces invariants, vous pouvez éviter les erreurs logiques dans votre code.
Il est une condition que vous savez toujours être fidèle à un endroit particulier de votre logique et pouvez le vérifier lors du débogage de travailler sur ce qui a mal tourné.
J'ai l'habitude de les voir plus en termes d'algorithmes ou de structures.
Par exemple, vous pourriez avoir un invariant de boucle que pourrait faire valoir--toujours vrai au début ou à la fin de chaque itération. C'est, si votre boucle était censé traiter une collection d'objets à partir d'une pile à une autre, on pourrait dire que |stack1|+|stack2|=c, en haut ou en bas de la boucle.
Si l'invariant échec de la vérification, il indique quelque chose s'est mal passé. Dans cet exemple, cela pourrait signifier que vous avez oublié de pousser au traitement de l'élément sur la dernière pile, etc.
La magie de wikipédia: Invariant (informatique)
Que cette ligne déclare:
Afin de mieux comprendre cette espérer que cet exemple en C++ à l'aide.
Imaginez un scénario où vous devez obtenir certaines valeurs et d'obtenir le nombre total d'entre eux dans une variable appelée comme
count
et les ajouter dans une variable appelée commesum
La invariant (encore une fois c'est plus comme un concept):
Le code ci-dessus serait quelque chose comme ceci,
Ce que le code ci-dessus n'?
1) Lit l'entrée de
cin
et les met dansx
2) Après un succès de la lecture, de l'incrément
count
etsum = sum + x
3) Répéter 1-2 jusqu'à la lecture s'arrête ( j'.e ctrl+D)
Invariant de boucle:
L'invariant doit être Vrai TOUJOURS. Donc, au départ, vous commencez votre code avec juste ce
Cette boucle lit les données à partir de l'entrée standard et les stocke dans x. Bien et bon. Mais le invariant devient fausse, car la première partie de notre invariant n'était pas suivi (ou gardé vrai).
Comment garder l'invariant vrai?
Simple! incrémenter le comte.
Donc
++count;
serait se faire du bien!. Maintenant, notre code devient quelque chose comme cela,Mais
Même maintenant notre invariant (un concept qui doit être VRAI) est Faux car, maintenant, nous n'avons pas satisfaire à la seconde partie de notre invariant.
Alors, que faire maintenant?
Ajouter
x
àsum
et de le stocker danssum
(sum+=x
) et la prochaine foiscin>>x
va lire une nouvelle valeur dans x.Maintenant notre code devient quelque chose comme cela,
Nous allons vérifier
Si le code correspond à notre invariant
code:
Ah!. Maintenant, l'invariant de boucle est Vrai toujours et le code fonctionne très bien.
L'exemple ci-dessus a été prises et modifié à partir de le livre Accelerated C++ par Andrew-koening et Barbara-E
Quelque chose qui ne change pas à l'intérieur d'un bloc de code
La suite de ce qu'il est, les invariants sont très utiles dans l'écriture de code propre, depuis sachant que, conceptuellement, ce invariants doivent être présents dans votre code vous permet de décider comment organiser votre code afin d'atteindre ces objectifs. Comme mentionné plus tôt, ils sont également utiles dans le débogage, la vérification pour voir si l'invariant est maintenu est souvent un bon moyen de voir si quelque manipulation que vous tentez d'effectuer est réellement en train de faire ce que vous voulez.
C'est typiquement une quantité qui ne change pas le cadre de certaines opérations mathématiques.
Un exemple est un scalaire, ce qui ne change pas sous les rotations. En imagerie par résonance magnétique, par exemple, il est utile de caractériser un tissu de la propriété par un mouvement de rotation de l'invariant, car alors son estimation, idéalement, ne dépend pas de l'orientation du corps dans le scanner.
L'ADT invariant spécifie les relations
parmi les champs de données (variables d'instance)
qui doit toujours être vrai avant et après
l'exécution d'une méthode d'instance.
Il est un excellent exemple d'un invariant et pourquoi c'est important dans le livre Java de la Simultanéité dans la Pratique.
Bien que Java, l'exemple décrit un code qui est chargé de calculer les facteurs d'un nombre entier. L'exemple de code tente de mettre en cache le dernier numéro, et les facteurs qui ont été calculés pour améliorer les performances. Dans ce scénario, il est un invariant qui n'a pas été comptabilisée dans l'exemple de code qui a quitté le code sensible aux conditions de course dans un tel scénario.