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


25

基本的に、最悪または最良のケースである可能性のあるもの、およびそれらを取得する前に発生する可能性のある他の「エッジ」ケースをどのようにして見つけるのですか?


2
代替案:可能であれば、私はファジーテストの大ファンです。ランダムに生成された入力の膨大な量が、精査やエッジテストの量が明らかになっていない関数内のバグを見つけることができるのは驚くべきことです。「真」の入力:)上で動作しているときに、2つの仕事本当によく一緒に...そして、彼らは明らかに正確ログエラーによって補完されている
マシューM.

回答:


28

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

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

ここにあります:

いくつかの既知の特殊なケースを含む文字列

  • 空の文字列
  • 長いひも
  • Unicode文字列(特殊文字)
  • 特定の文字セットに制限されている場合、一部が範囲内にない場合に何が起こるか
  • 奇数/偶数長の文字列
  • ヌル(引数として)
  • 非ヌル終端

既知の特別な場合の整数

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

次の境界の場合に失敗する可能性のあるソートアルゴリズム

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

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

  • 空の文字列ケースは空のコレクションケースをカバーします
  • NULL文字列== NULLコレクション

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

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


5
もう1つ追加します。。。コードを分析し、コード内の特殊なケースを探します。開発者が0〜13を14以上とは異なる方法で処理する場合(開発者がパフォーマンス上の理由で小さな値と大きな値に異なるアルゴリズムを使用している場合)、13と14にエッジケースがあります。
エセルエヴァンス

2

エッジの状態を決定するアルゴリズムはないと思います。

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


2

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

したがって、アルゴリズムのエッジケースを識別するために、まず入力ドメインを調べます。そのエッジ値は、アルゴリズムのエッジケースにつながる可能性があります。

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

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


0

これは非常に一般的な質問ですので、私ができることは、一般的な漠然としたアイデアを捨てることだけです:)

-境界ケースを調べます。例 文字列を解析している場合、文字列が空またはヌルの場合はどうなりますか?xからyにカウントしている場合、xとyで何が起こりますか?
-簡略化または乾燥させることができるコード。不要な複雑さは、問題を悪化させる可能性があります。


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.