Exemples d'algorithmes et de preuves qui semblent corrects, mais qui ne le sont pas


15

Dans mon cours d'introduction à la programmation, nous apprenons la méthode d'initialisation-maintenance-terminaison pour prouver qu'un algorithme fait ce que nous attendons de lui. Mais nous n'avons eu qu'à prouver qu'un algorithme déjà connu pour être correct est correct. On ne nous a jamais demandé de montrer qu'un algorithme n'est pas correct.

Existe-t-il des exemples classiques d'algorithmes qui semblent corrects, mais qui ne le sont pas? Je recherche des cas où l'approche Initialisation-Maintenance-Arrêt intercepte quelque chose que l'intuition à première vue ne fait pas.


5
Peut-être d'intérêt: cs.stackexchange.com/q/29475/755
DW

5
Voter parce que je pense que c'est une question pédagogique très importante. Il est légèrement hors de portée de cstheory, mais je ne connais pas de meilleure plate-forme pour cela, et il existe de nombreux instructeurs d'algorithmes dans la communauté cstheory. La plupart des cours de conception d'algorithmes n'exposent les étudiants qu'à des algorithmes corrects existants et à des problèmes qui peuvent être facilement résolus en utilisant des techniques connues. Cela renforce l'impression, si attrayante pour les étudiants, que l'on peut avoir confiance en son sentiment intuitif qu'un algorithme apparemment plausible est juste. Un bon cours de conception d'algorithmes devrait faire le contraire!
Neal Young

3
J'aimerais avoir une collection comme ça.
Chandra Chekuri

Réponses:


20

Maximum local 2D

entrée: tableau bidimensionnel An×nUNE

sortie: un maximum local - une paire telle que A [ i , j ] n'a pas de cellule voisine dans le tableau qui contient une valeur strictement supérieure. (je,j)UNE[je,j]

(Les cellules voisines sont celles parmi qui sont présentes dans le tableau.) Ainsi, par exemple, si A estUNE[je,j+1],UNE[je,j-1],UNE[je-1,j],UNE[je+1,j]UNE

0134323125014013

alors chaque cellule en gras est un maximum local. Chaque tableau non vide a au moins un maximum local.

Algorithme. Il existe un algorithme : il suffit de vérifier chaque cellule. Voici une idée pour un algorithme récursif plus rapide.O(n2)

Étant donné , définissez la croix X pour qu'elle se compose des cellules de la colonne du milieu et des cellules de la ligne du milieu. Tout d' abord vérifier chaque cellule X pour voir si la cellule est un maximum local dans A . Si oui, renvoyez une telle cellule. Sinon, soit ( i , j ) une cellule de X avec une valeur maximale. Puisque ( i , j ) n'est pas un maximum local, il doit avoir une cellule voisine ( i ' , j ' ) de plus grande valeur.UNEXXUNE(je,j)X(je,j)(je,j)

Partitionnez (le tableau A , moins les cellules de X ) en quatre quadrants - les quadrants supérieur gauche, supérieur droit, inférieur gauche et inférieur droit - de manière naturelle. La cellule voisine ( i , j ) de plus grande valeur doit être dans l'un de ces quadrants. Appelez ce quadrant A . UNEXUNEX(je,j)UNE

Lemme. Quadrant contient un maximum local de A .UNEUNE

Preuve. Pensez à commencer par la cellule . S'il ne s'agit pas d'un maximum local, déplacez-vous vers un voisin avec une valeur plus élevée. Cela peut être répété jusqu'à arriver à une cellule qui est un maximum local. Cette cellule finale doit être en A ' , car A ' est délimité de tous côtés par des cellules dont les valeurs sont inférieures à la valeur de la cellule ( i ' , j ' ) . Cela prouve le lemme. (je,j)UNEUNE(je,j)

L'algorithme s'appelle récursivement sur le sous-tableauA'pour y trouver un maximum local(i,j), puis renvoie cette cellule.n2×n2UNE(je,j)

Le temps d'exécution pour une matrice n × n satisfait T ( n ) = T ( n / 2 ) + O ( n ) , donc T ( n ) = O ( n ) . T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Ainsi, nous avons prouvé le théorème suivant:

Théorème. Il existe un algorithme pour trouver un maximum local dans un tableau n × n .O(n)n×n

Ou avons-nous?


En première lecture, la seule erreur que j'ai repérée était la solution de récurrence. Est-ce la seule erreur?
Radu GRIGore

1
La récurrence est correcte. L'algorithme ne l'est pas!
Neal Young

1
Ah, oui, j'ai fait une erreur stupide avec la récurrence. Je vois le problème: le maximum dont vous prouvez l'existence n'est pas (nécessairement) ce que vous trouvez. Et ce que vous trouvez ignore le X.
Radu GRIGore

3
Voici un exemple:
(2143300101230001023002222222333233300323000032300)
Radu GRIGore

2
UNEUNE
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.