Um zu testen, ob ein Algorithmus für ein Problem korrekt ist, versuchen Sie in der Regel, den Algorithmus für eine Reihe einfacher Testfälle von Hand auszuführen. Versuchen Sie es an einigen Beispiel-Problemfällen, einschließlich einiger einfacher Eckfälle ". Dies ist eine großartige Heuristik: Es ist eine großartige Möglichkeit, viele fehlerhafte Versuche an einem Algorithmus schnell auszumerzen und zu verstehen, warum der Algorithmus nicht funktioniert.
Beim Erlernen von Algorithmen sind einige Schüler jedoch versucht, damit aufzuhören: Wenn ihr Algorithmus an einer Handvoll Beispiele korrekt funktioniert, einschließlich aller Eckfälle, die sie ausprobieren können, kommen sie zu dem Schluss, dass der Algorithmus korrekt sein muss. Es gibt immer einen Studenten, der fragt: "Warum muss ich meinen Algorithmus nachweisen, wenn ich ihn nur an ein paar Testfällen ausprobieren kann?"
Also, wie können Sie die Heuristik "Testfälle ausprobieren" zum Narren halten? Ich suche einige gute Beispiele, um zu zeigen, dass diese Heuristik nicht ausreicht. Mit anderen Worten, ich suche nach einem oder mehreren Beispielen für einen Algorithmus, der auf den ersten Blick korrekt aussieht und die richtige Antwort auf alle kleinen Eingaben ausgibt, die wahrscheinlich von irgendjemandem kommen, aber wo der Algorithmus tatsächlich ist funktioniert nicht Möglicherweise funktioniert der Algorithmus nur bei allen kleinen Eingaben ordnungsgemäß und schlägt nur bei großen Eingaben oder nur bei Eingaben mit einem ungewöhnlichen Muster fehl.
Konkret suche ich:
Ein Algorithmus. Der Fehler muss auf der algorithmischen Ebene liegen. Ich suche keine Implementierungsfehler. (Zum Beispiel sollte das Beispiel zumindest sprachunabhängig sein, und der Fehler sollte sich eher auf algorithmische Belange als auf Software-Engineering- oder Implementierungsprobleme beziehen.)
Ein Algorithmus, den sich jemand einfallen lassen könnte. Der Pseudocode sollte zumindest plausibel korrekt aussehen (z. B. ist Code, der verschleiert oder offensichtlich zweifelhaft ist, kein gutes Beispiel). Bonuspunkte, wenn es sich um einen Algorithmus handelt, den ein Schüler bei der Lösung einer Hausaufgabe oder eines Prüfungsproblems entwickelt hat.
Ein Algorithmus, der mit hoher Wahrscheinlichkeit eine vernünftige manuelle Teststrategie besteht. Es ist unwahrscheinlich, dass jemand, der ein paar kleine Testfälle von Hand ausprobiert, den Fehler entdeckt. Zum Beispiel sollte es unwahrscheinlich sein, dass "QuickCheck von Hand in einem Dutzend kleiner Testfälle simuliert", dass der Algorithmus falsch ist.
Vorzugsweise ein deterministischer Algorithmus. Ich habe viele Studenten gesehen, die dachten, dass "einige Testfälle von Hand versuchen" eine vernünftige Methode ist, um zu überprüfen, ob ein deterministischer Algorithmus korrekt ist, aber ich vermute, die meisten Studenten würden nicht davon ausgehen, dass das Probieren einiger Testfälle eine gute Methode ist, um die Wahrscheinlichkeit zu überprüfen Algorithmen. Bei probabilistischen Algorithmen kann häufig nicht festgestellt werden, ob eine bestimmte Ausgabe korrekt ist. Und Sie können nicht genügend Beispiele manuell ankurbeln, um einen nützlichen statistischen Test der Ausgabeverteilung durchzuführen. Daher würde ich mich lieber auf deterministische Algorithmen konzentrieren, da sie die falschen Vorstellungen der Schüler klarer herausarbeiten.
Ich möchte lehren, wie wichtig es ist, Ihren Algorithmus als korrekt zu beweisen, und ich hoffe, dass ich einige Beispiele wie dieses verwenden kann, um Beweise für die Richtigkeit zu motivieren. Ich würde Beispiele bevorzugen, die relativ einfach und für Studierende zugänglich sind. Beispiele, die schwere Maschinen oder eine Tonne mathematischen / algorithmischen Hintergrunds erfordern, sind weniger nützlich. Außerdem möchte ich keine "unnatürlichen" Algorithmen. Es mag zwar einfach sein, einen seltsamen künstlichen Algorithmus zu konstruieren, um die Heuristik zu täuschen, aber wenn er höchst unnatürlich aussieht oder eine offensichtliche Hintertür hat, die nur dazu dient, diese Heuristik zu täuschen, wird er die Schüler wahrscheinlich nicht überzeugen. Irgendwelche guten Beispiele?