web-dev-qa-db-fra.com

Comment identifiez-vous les cas "Edge" sur les algorithmes?

Fondamentalement, comment déterminez-vous quel pourrait être votre pire ou votre meilleur cas et tout autre cas "Edge" que vous pourriez avoir AVANT de les avoir et ainsi, comment préparez-vous votre code pour eux?

27
Luis Armando

En fonction du contenu de l'algorithme, vous pouvez identifier les structures/types/constructions de données utilisées. Ensuite, vous essayez de comprendre les points faibles (possibles) de ceux-ci et essayez de trouver un plan d'exécution qui le fera fonctionner dans ces cas.

Par exemple, l'algorithme prend une chaîne et un entier en entrée et effectue un tri des caractères de la chaîne.

Ici nous avons:

String avec quelques cas spéciaux connus:

  • Chaîne vide
  • Longue chaîne
  • Chaîne Unicode (caractères spéciaux)
  • S'il est limité à un ensemble spécifique de caractères, que se passe-t-il lorsque certains ne sont pas dans la plage
  • Chaîne de longueur paire/paire
  • Null (comme argument)
  • Terminé non nul

Entier avec des cas spéciaux connus:

  • Min/MaxInt
  • Négatif positif

algorithme de tri qui pourrait échouer dans les cas limites suivants:

  • Entrée vide
  • 1 entrée d'élément
  • Entrée très longue (peut-être de longueur max (type de données utilisé pour l'index))
  • Ordures dans la collection qui seront triées
  • Entrée nulle
  • Éléments en double
  • Collection avec tous les éléments égaux
  • Entrée de longueur paire/impaire

Ensuite, prenez tous ces cas et créez une longue liste en essayant de comprendre comment ils se chevauchent. Ex:

  • Le cas de chaîne vide couvre le cas de collection vide
  • Chaîne nulle == collection null
  • etc.

Créez maintenant des cas de test pour eux :)

court résumé: décomposer l'algorithme en blocs de base pour lesquels vous connaissez les cas limites, puis les réassembler, créant des cas limites globaux

30

Un "Edge" a deux significations, et les deux sont pertinentes en ce qui concerne les cas Edge. Un Edge est soit une zone où un petit changement dans l'entrée entraîne un grand changement dans la sortie, soit la fin d'une plage.

Donc, pour identifier les cas Edge d'un algorithme, je regarde d'abord le domaine d'entrée. Ses valeurs Edge pourraient conduire à des cas Edge de l'algorithme.

Deuxièmement, je regarde le domaine de sortie et regarde en arrière les valeurs d'entrée qui pourraient les créer. C'est moins souvent un problème avec les algorithmes, mais cela aide à trouver des problèmes dans les algorithmes conçus pour générer une sortie qui s'étend sur un domaine de sortie donné. Par exemple. un générateur de nombres aléatoires devrait être capable de générer toutes les valeurs de sortie prévues.

Enfin, je vérifie l'algorithme pour voir s'il existe des cas d'entrée similaires, mais conduisant à des sorties différentes. La recherche de ces cas Edge est la plus difficile, car elle implique à la fois des domaines et une paire d'entrées.

2
MSalters

Je ne pense pas qu'il existe un algorithme pour déterminer les conditions Edge .... juste l'expérience.

Exemple: pour un paramètre d'octet, vous souhaitez tester des nombres tels que 0, 127, 128, 255, 256, -1, tout ce qui peut causer des problèmes.

2
Steve Wellens

C'est une question très générale donc tout ce que je peux faire est de jeter des idées générales et vagues :)

-Examinez les cas limites. Ex. si vous analysez une chaîne, que se passe-t-il si la chaîne est vide ou nulle? Si vous comptez de x à y, que se passe-t-il en x et y?
- Code qui pourrait être simplifié ou édité en D.R.Y. Toute complexité inutile pourrait ajouter des choses qui pourraient mal tourner.

0
seand

Une partie de l'habileté d'utiliser des algorithmes est de connaître leurs faiblesses et leurs cas pathologiques. La réponse de Victor donne quelques bons conseils, mais en général, je vous conseillerais d'étudier le sujet plus en profondeur pour avoir une idée de cela, je ne pense pas que vous puissiez suivre les règles de base pour répondre pleinement à cette question. Par exemple. voir Cormen , ou Skiena (Skiena en particulier a une très bonne section sur où utiliser les algorithmes et ce qui fonctionne bien dans certains cas, Cormen va vers plus de théorie je pense) .

0
Steve