In meiner Einführung in den Programmierkurs lernen wir die Methode Initialisierung-Wartung-Beendigung kennen, mit der bewiesen wird, dass ein Algorithmus das tut, was wir von ihm erwarten. Wir mussten jedoch nur beweisen, dass ein Algorithmus, von dem bereits bekannt ist, dass er korrekt ist, korrekt ist. Wir wurden nie gebeten zu zeigen, dass ein Algorithmus nicht korrekt ist.
Gibt es klassische Beispiele für Algorithmen, die korrekt aussehen, aber nicht korrekt sind? Ich suche nach Fällen, in denen der Ansatz der Initialisierung, Wartung und Beendigung etwas erfasst, was die Intuition auf den ersten Blick nicht tut.
ds.algorithms
proofs
Marin
quelle
quelle
Antworten:
2D lokales Maximum
Eingabe: 2-dimensionales Array A.n × n EIN
Ausgabe: ein lokales Maximum - ein Paar so dass A [ i , j ]( i , j ) A [ i , j ] keine benachbarte Zelle im Array hat, die einen streng größeren Wert enthält.
(Die benachbarten Zellen sind diejenigen unter , die in dem Array vorhanden sind.) Also zum Beispiel, wenn A istA [ i , j + 1 ] , A [ i , j - 1 ] , A [ i - 1 , j ] , A [ i + 1 , j ] EIN
dann ist jede fettgedruckte Zelle ein lokales Maximum. Jedes nicht leere Array hat mindestens ein lokales Maximum.
Algorithmus. Es gibt einO ( n2) -Zeitalgorithmus: Überprüfen Sie einfach jede Zelle. Hier ist eine Idee für einen schnelleren, rekursiven Algorithmus.
Damit haben wir folgenden Satz bewiesen:
Oder haben wir?
quelle