web-dev-qa-db-ja.com

アルゴリズムの「エッジ」ケースをどのように特定しますか?

基本的に、最悪のケースまたはベストケースである可能性のあるケース、およびそれらを使用する前に持つ可能性のあるその他の「エッジ」ケースをどのようにして見つけるのですか。それらのコードをどのように準備しますか?

27
Luis Armando

アルゴリズムの内容に基づいて、どのデータ構造/タイプ/構成が使用されているかを識別できます。次に、それらの(可能性のある)弱点を理解し、それらのケースで実行できるようにする実行計画を考え出そうとします。

たとえば、アルゴリズムは文字列と整数を入力として受け取り、文字列の文字を並べ替えます。

ここにあります:

String既知の特殊なケースがいくつかあります:

  • 空の文字列
  • 長い文字列
  • Unicode文字列(特殊文字)
  • 特定の文字セットに制限されている場合、一部が範囲外の場合にどうなりますか
  • 奇数/偶数の長さの文字列
  • ヌル(引数として)
  • Null以外で終了

整数既知の特殊なケース:

  • Min/MaxInt
  • ネガティブポジティブ

ソートアルゴリズム以下の境界の場合に失敗する可能性があります。

  • 空の入力
  • 1要素入力
  • 非常に長い入力(おそらく長さmax(インデックスに使用されるデータ型))
  • ソートされるコレクション内のゴミ
  • ヌル入力
  • 重複する要素
  • すべての要素が等しいコレクション
  • 奇数/偶数の長さの入力

次に、これらすべてのケースを取り上げ、それらがどのように重複するかを理解しようとする長いリストを作成します。例:

  • 空の文字列ケースは、空のコレクションケースをカバーします
  • Null文字列== nullコレクション
  • 等.

次に、それらのテストケースを作成します。

短い要約:境界ケースがわかっている基本ブロックでアルゴリズムを分割し、それらを再構成して、グローバル境界ケースを作成します

30

「エッジ」には2つの意味があり、エッジケースに関しては両方とも関連があります。エッジは、入力の小さな変化が出力の大きな変化につながる領域、または範囲の終わりです。

そこで、アルゴリズムのEdgeケースを特定するために、まず入力ドメインを調べます。そのEdge値は、アルゴリズムのEdgeケースにつながる可能性があります。

次に、出力ドメインを確認し、それらを作成する可能性のある入力値を確認します。これは一般的にはアルゴリズムの問​​題ではありませんが、特定の出力ドメインにまたがる出力を生成するように設計されているアルゴリズムの問​​題を見つけるのに役立ちます。例えば。乱数ジェネレータは、意図したすべての出力値を生成できる必要があります。

最後に、アルゴリズムをチェックして、類似しているが異なる出力につながる入力ケースがあるかどうかを確認します。これらのEdgeケースを見つけることは、ドメインと入力のペアの両方を含むため、最も困難です。

2
MSalters

Edgeの条件を決定するアルゴリズムはないと思います。

例:バイトパラメータの場合、0、127、128、255、256、-1などの数値をテストして、問題を引き起こす可能性があるものをテストします。

2
Steve Wellens

これは非常に一般的な質問なので、私ができることはいくつかの一般的で曖昧なアイデアを捨てることだけです:)

-境界ケースを調べます。例文字列を解析している場合、文字列が空またはnullの場合はどうなりますか? xからyまで数えている場合、xとyで何が起こりますか?
-簡略化またはD.R.Y.で出力できるコード。不必要な複雑さにより、問題が発生する可能性があります。

0
seand

アルゴリズムを使用するスキルの一部は、それらの弱点と病的ケースを知ることです。ビクターの答えはいくつかの良いヒントを与えますが、一般的に私はあなたがこれを感じるためにトピックをより深く研究する必要があることをお勧めします、私はこの質問に完全に答えるために経験則に従うことができないと思います。例えば。 Cormen 、または Skiena を参照してください(特に、Skienaには、アルゴリズムを使用する場所と特定のケースで何がうまく機能するかについての非常に優れたセクションがあります。Cormenはより多くの理論に取り組んでいます) 。

0
Steve