web-dev-qa-db-fra.com

Que signifie dire qu'un algorithme est sain et complet?

J'ai entendu différentes interprétations de sonores et complètes. Je comprends que exhaustivité signifie trouver une solution s'il y en a une. Que signifie dire qu'un algorithme est son.

Que signifie dire qu'un algorithme est sain et complet?

33
mutelogan

Ce sont des termes très spécifiques liés à la logique.

Voici quelques points de départ:

http://en.wikipedia.org/wiki/Soundness

http://en.wikipedia.org/wiki/Completeness_ (logique)

Fondamentalement, la solidité (d'un algorithme) signifie que l'algorithme ne donne aucun résultat faux. Si, par exemple, j'ai un algorithme de tri qui parfois ne renvoie pas de liste triée, l'algorithme n'est pas sain.

L'exhaustivité, d'autre part, signifie que l'algorithme traite toutes les entrées possibles et n'en manque aucune. Donc, si mon algorithme de tri ne renvoyait jamais une liste non triée, mais refusait simplement de travailler sur des listes contenant le numéro 7, il ne serait pas complet.

Il est complet et sain s'il fonctionne sur toutes les entrées (sémantiquement valable dans le monde du programme) et obtient toujours la bonne réponse.

50
Erik Dietrich

Je trouve la réponse d'Erik Dietrich un peu déroutante. C'est mieux:

Un algorithme est son si, à chaque fois qu'il renvoie une réponse, cette réponse est vraie. Un algorithme est complet s'il garantit de retourner une réponse correcte pour toute entrée arbitraire (ou, s'il n'y a pas de réponse, il garantit de retourner l'échec).

Deux points importants:

  1. La solidité est une faible garantie. Il ne promet pas que A prendra fin.
  2. La solidité et l'exhaustivité sont des concepts connexes; en fait, ils sont l'inverse logique de l'autre. c'est-à-dire que la solidité dit que si une réponse est retournée, cette réponse est vraie. L'exhaustivité indique qu'une réponse est vraie si elle est retournée.

Considérons par exemple un algorithme de tri A qui reçoit en entrée une liste de nombres. Nous disons que A est sain si à chaque fois qu'il renvoie un résultat, ce résultat est une liste triée. De même, nous disons que A est complet si nous garantissons de renvoyer une liste triée chaque fois que nous lui donnons une liste de nombres.

16
Daniel

Ces termes sont issus de la théorie du calcul, ils sont donc plus significatifs dans le contexte de la théorie du calcul que dans le contexte du génie logiciel

Dans la plupart des modèles de calcul standard, les problèmes informatiques sont représentés sous la forme langages . Une langue est un ensemble de chaînes. Un algorithme n'est donc qu'un système ou une procédure qui décide si une chaîne donnée est membre d'une langue (en renvoyant true ou false). En termes de génie logiciel, la théorie du calcul s'intéresse spécifiquement aux fonctions qui ressemblent à ceci, en supposant que les chaînes sont immuables:

boolean some_function(string argument){...}

Nous appelons cette fonction complete si elle retourne vrai pour chaque argument qui est membre du langage. Nous l'appelons son s'il renvoie faux pour chaque argument qui n'est pas membre du langage.

En d'autres termes, il est complet s'il retourne toujours vrai quand nous voulons qu'il revienne vrai, et son s'il retourne toujours faux quand nous voulons qu'il retourne faux.

Comment cela se traduit-il dans d'autres types de fonctions? En fait, il est presque toujours possible de bourrer une quantité arbitraire de données dans une chaîne et de la reconstituer à l'intérieur de la fonction. La restriction sur le type d'argument et l'arité n'est donc rien d'autre qu'une simplification théorique. La restriction sur le type de retour est cependant plus importante. Les problèmes qui appellent un résultat booléen sont appelés problèmes de décision . Une grande partie de la théorie du calcul implique des problèmes de décision; les ensembles P et NP sont limités aux problèmes de décision (et NP, au moins, ne pourrait pas être raisonnablement défini sans cette restriction). Le problème d'arrêt est un autre exemple d'un problème de décision très étudié .

À mon avis, ces termes ne se généralisent pas en dehors du domaine des problèmes de décision, de sorte que la différence entre eux n'est pas vraiment significative lorsque l'on discute d'une fonction générale.

2
Kevin