Beispiele für Algorithmen und Beweise, die korrekt erscheinen, aber nicht korrekt sind

15

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.

Marin
quelle
5
Möglicherweise von Interesse: cs.stackexchange.com/q/29475/755
DW
5
Upvoting, weil ich denke, dass dies eine sehr wichtige pädagogische Frage ist. Es ist etwas außerhalb des Rahmens für cstheory, aber ich kenne keine bessere Plattform dafür, und es gibt viele Algorithmuslehrer in der cstheory-Community. Die meisten Algorithmen-Design-Kurse setzen die Schüler nur korrekten, vorhandenen Algorithmen und Problemen aus, die mit bekannten Techniken leicht zu lösen sind. Dies verstärkt den für Studenten so attraktiven Eindruck, dass man seinem intuitiven Gefühl vertrauen kann, dass ein scheinbar plausibler Algorithmus richtig ist. Ein guter Algorithmus-Design-Kurs sollte das Gegenteil bewirken!
Neal Young
3
Ich würde gerne eine solche Sammlung haben.
Chandra Chekuri

Antworten:

20

2D lokales Maximum

Eingabe: 2-dimensionales Array A.n×nA

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,j1],A[i1,j],A[i+1,j]A

0134323125014013

dann ist jede fettgedruckte Zelle ein lokales Maximum. Jedes nicht leere Array hat mindestens ein lokales Maximum.

Algorithmus. Es gibt ein O(n2) -Zeitalgorithmus: Überprüfen Sie einfach jede Zelle. Hier ist eine Idee für einen schnelleren, rekursiven Algorithmus.

AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

n2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Damit haben wir folgenden Satz bewiesen:

O(n)n×n

Oder haben wir?

Neal Young
quelle
Bei der ersten Lesung war der einzige Fehler, den ich entdeckte, die Wiederholungslösung. Ist das der einzige Fehler?
Radu GRIGore
1
Die Wiederholung ist korrekt. Der Algorithmus ist nicht!
Neal Young
1
Ah, ja, ich habe mit der Wiederholung einen dummen Fehler gemacht. Ich sehe das Problem: Das Maximum, das Sie beweisen, ist nicht (notwendigerweise) das, was Sie finden. Und was Sie finden, ignoriert das X.
Radu GRIGore
3
(2143300101230001023002222222333233300323000032300)
2
AA