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.
ds.algorithms
proofs
Marin
fuente
fuente
Respuestas:
Máximo local 2D
entrada: 2 dimensiones matrizn×n A
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,j−1],A[i−1,j],A[i+1,j] A
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.A X X A (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 .A∖X A X (i′,j′) A′
Lema Cuadrante contiene un máximo local de .A′ A
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′) A′ A′ (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×n2 A′ (i,j)
El tiempo de ejecución para una matriz satisface , entonces .T(n) n×n T(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?
fuente