Ejemplos de algoritmos y pruebas que parecen correctos, pero no lo son

15

En mi introducción al curso de programación, estamos aprendiendo sobre el método de inicialización-mantenimiento-terminación para probar que un algoritmo hace lo que esperamos. Pero solo hemos tenido que demostrar que un algoritmo que ya se sabe que es correcto, es correcto. Nunca se nos ha pedido que demostremos que un algoritmo no es correcto.

¿Hay ejemplos clásicos de algoritmos que se vean correctos, pero no lo son? Estoy buscando casos en los que el enfoque de inicialización-mantenimiento-terminación capte algo que la intuición de primera vista no.

Marin
fuente
55
Posiblemente de interés: cs.stackexchange.com/q/29475/755
DW
55
Votación porque creo que esta es una pregunta pedagógica muy importante. Está un poco fuera de alcance para cstheory, pero no conozco una mejor plataforma para ello, y hay muchos instructores de algoritmos en la comunidad cstheory. La mayoría de los cursos de diseño de algoritmos exponen a los estudiantes solo a los algoritmos correctos existentes y a problemas que se pueden resolver fácilmente utilizando técnicas conocidas. Esto refuerza la impresión, tan atractiva para los estudiantes, que uno puede confiar con seguridad en la sensación intuitiva de que un algoritmo aparentemente plausible es correcto. ¡Un buen curso de diseño de algoritmos debería hacer lo contrario!
Neal Young
3
Me encantaría tener una colección como esta.
Chandra Chekuri

Respuestas:

20

Máximo local 2D

entrada: 2 dimensiones matrizn×nA

salida: un máximo local: un par tal que no tiene una celda vecina en la matriz que contenga un valor estrictamente mayor. (i,j)A[i,j]

(Las celdas vecinas son aquellas entre que están presentes en la matriz). Entonces, por ejemplo, si esA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

entonces cada celda en negrita es un máximo local. Cada matriz no vacía tiene al menos un máximo local.

Algoritmo. Hay un algoritmo de tiempo : simplemente verifique cada celda. Aquí hay una idea para un algoritmo más rápido y recursivo.O(n2)

Dado , defina la cruz para que consista en las celdas en la columna central y las celdas en la fila central. En primer lugar comprobar cada celda de para ver si la célula es un máximo local en . Si es así, devuelva dicha celda. De lo contrario, sea una celda en con un valor máximo. Como no es un máximo local, debe tener una celda vecina con un valor mayor.AXXA(i,j)X(i,j)(i,j)

Partición (la matriz , menos las celdas en ) en cuatro cuadrantes (los cuadrantes superior izquierdo, superior derecho, inferior izquierdo e inferior derecho) de la manera natural. La celda vecina con mayor valor debe estar en uno de esos cuadrantes. Llame a ese cuadrante . AXAX(i,j)A

Lema Cuadrante contiene un máximo local de .AA

Prueba. Considere comenzar en la celda . Si no es un máximo local, muévase a un vecino con un valor mayor. Esto se puede repetir hasta llegar a una celda que es un máximo local. Esa celda final tiene que estar en , porque está delimitada por todos lados por celdas cuyos valores son más pequeños que el valor de la celda . Esto prueba el lema. (i,j)AA(i,j)

El algoritmo se llama a sí mismo recursivamente en la sub-matriz para encontrar un máximo local allí, luego devuelve esa celda.n2×n2A(i,j)

El tiempo de ejecución para una matriz satisface , entonces . T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Por lo tanto, hemos demostrado el siguiente teorema:

Teorema. Existe un algoritmo -time para encontrar un máximo local en una matriz .O(n)n×n

O tenemos?

Neal Young
fuente
En la primera lectura, el único error que vi fue la solución de recurrencia. ¿Es ese el único error?
Radu GRIGore
1
La recurrencia es correcta. El algoritmo no lo es!
Neal Young
1
Ah, sí, cometí un error tonto con la recurrencia. Veo el problema: el máximo que demuestras que existe no es (necesariamente) lo que encuentras. Y lo que encuentras ignora la X.
Radu GRIGore
3
He aquí un ejemplo:
(2143300101230001023002222222333233300323000032300)
Radu GRIGORE
2
@Marin, lo que falta es una prueba de que un máximo local de también es un máximo local de , porque no es cierto. (De alguna manera me gusta mi redacción inicial, pero no es precisa y no está clara. Pero puede ayudar a la intuición.) AAA
Radu GRIGore