Wie können Sie herausfinden, welches Ihr schlechtester oder bester Fall sein könnte und welche anderen "Rand" -Fälle Sie haben könnten, bevor Sie sie haben, und wie bereiten Sie Ihren Code für sie vor?
Wie können Sie herausfinden, welches Ihr schlechtester oder bester Fall sein könnte und welche anderen "Rand" -Fälle Sie haben könnten, bevor Sie sie haben, und wie bereiten Sie Ihren Code für sie vor?
Antworten:
Basierend auf dem Inhalt des Algorithmus können Sie identifizieren, welche Datenstrukturen / -typen / -konstrukte verwendet werden. Dann versuchen Sie, die (möglichen) Schwachstellen dieser zu verstehen und einen Ausführungsplan zu erstellen, der es in diesen Fällen zum Laufen bringt.
Der Algorithmus nimmt beispielsweise eine Zeichenfolge und eine Ganzzahl als Eingabe und sortiert die Zeichen der Zeichenfolge.
Hier haben wir:
Zeichenfolge mit einigen bekannten Sonderfällen:
Ganzzahl mit bekannten Sonderfällen:
Sortieralgorithmus , der in den folgenden Grenzfällen fehlschlagen kann:
Nehmen Sie dann all diese Fälle und erstellen Sie eine lange Liste, um zu verstehen, wie sie sich überschneiden. Ex:
Jetzt erstelle Testfälle für sie :)
Kurze Zusammenfassung : Teilen Sie den Algorithmus in Basisblöcke auf, für die Sie die Grenzfälle kennen, und setzen Sie sie dann wieder zusammen, um globale Grenzfälle zu erstellen
Ich glaube nicht, dass es irgendeinen Algorithmus gibt, um Kantenbedingungen zu bestimmen ... nur Erfahrung.
Beispiel: Für einen Byte-Parameter möchten Sie Zahlen wie 0, 127, 128, 255, 256, -1 testen, die Probleme verursachen können.
Eine "Kante" hat zwei Bedeutungen, und beide sind relevant, wenn es um Kantenfälle geht. Eine Kante ist entweder ein Bereich, in dem eine kleine Änderung der Eingabe zu einer großen Änderung der Ausgabe führt, oder das Ende eines Bereichs.
Um die Randfälle eines Algorithmus zu identifizieren, betrachte ich zunächst die Eingabedomäne. Seine Kantenwerte könnten zu Kantenfällen des Algorithmus führen.
Zweitens schaue ich auf die Ausgabedomäne und zurück auf die Eingabewerte, die sie erstellen könnten. Dies ist weniger häufig ein Problem bei Algorithmen, hilft jedoch bei der Suche nach Problemen bei Algorithmen, die zur Generierung von Ausgaben über eine bestimmte Ausgabedomäne entwickelt wurden. Beispielsweise sollte ein Zufallsgenerator in der Lage sein, alle beabsichtigten Ausgabewerte zu generieren.
Schließlich überprüfe ich den Algorithmus, um festzustellen, ob Eingabefälle ähnlich sind, die jedoch zu unterschiedlichen Ausgaben führen. Das Auffinden dieser Randfälle ist am schwierigsten, da sowohl Domänen als auch zwei Eingaben erforderlich sind.
Das ist eine sehr allgemeine Frage, also kann ich nur ein paar allgemeine, vage Ideen rausschmeißen :)
-Prüfung Grenzfälle. Ex. Wenn Sie eine Zeichenfolge analysieren, was passiert, wenn die Zeichenfolge leer oder null ist? Wenn Sie von x nach y zählen, was passiert dann bei x und y?
-Code, der vereinfacht oder ausgetrocknet werden könnte. Jede nicht benötigte Komplexität kann zu Problemen führen.
Ein Teil der Fähigkeit, Algorithmen zu verwenden, besteht darin, ihre Schwächen und pathologischen Fälle zu kennen. Victors Antwort gibt einige gute Tipps, aber im Allgemeinen würde ich raten, dass Sie sich mit dem Thema eingehender befassen müssen, um ein Gefühl dafür zu bekommen. Ich glaube nicht, dass Sie Faustregeln befolgen können, um diese Frage vollständig zu beantworten. ZB siehe Cormen oder Skiena (Skiena hat insbesondere einen sehr guten Abschnitt darüber, wo Algorithmen verwendet werden und was in bestimmten Fällen gut funktioniert, Cormen geht auf mehr Theorie ein, denke ich).