Exemplos de algoritmos e provas que parecem corretos, mas não são

15

Na minha introdução ao curso de programação, estamos aprendendo sobre o método Initialization-Maintenance-Termination de provar que um algoritmo faz o que esperamos. Mas apenas tivemos que provar que um algoritmo já conhecido como correto está correto. Nunca fomos solicitados a mostrar que um algoritmo não está correto.

Existem exemplos clássicos de algoritmos que parecem corretos, mas não são? Estou procurando casos em que a abordagem Inicialização, Manutenção e Terminação capta algo que a intuição à primeira vista não capta.

Marin
fonte
5
Possivelmente de interesse: cs.stackexchange.com/q/29475/755
DW
5
Voto positivo porque acho que essa é uma questão pedagógica muito importante. Está um pouco fora do escopo da cstheory, mas não conheço uma plataforma melhor para ela, e há muitos instrutores de algoritmos na comunidade da cstheory. A maioria dos cursos de design de algoritmos expõe os alunos apenas a algoritmos corretos e existentes e a problemas facilmente solucionáveis ​​usando técnicas conhecidas. Isso reforça a impressão, tão atraente para os alunos, que podemos confiar com segurança no sentimento intuitivo de que um algoritmo aparentemente plausível está certo. Um bom curso de design de algoritmo deve fazer o oposto!
Neal Young
3
Eu adoraria ter uma coleção como esta.
Chandra Chekuri 31/03/19

Respostas:

20

Máximo local 2D

entrada: bidimensional matrizAn×nA

saída: um máximo local - um par forma que não tenha célula vizinha na matriz que contenha um valor estritamente maior. A [ i , j ](i,j)A[i,j]

(As células vizinhas são aquelas entre que estão presentes na matriz.) Então, por exemplo, se éAA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

então cada célula em negrito é um máximo local. Toda matriz não vazia possui pelo menos um máximo local.

Algoritmo. Existe um algoritmo de tempo de : basta verificar cada célula. Aqui está uma idéia para um algoritmo recursivo mais rápido.O(n2)

Dado , defina a cruz X para consistir nas células da coluna do meio e nas células da linha do meio. Primeiro verifique cada célula X para ver se a célula é um máximo local em A . Nesse caso, retorne essa célula. Caso contrário, seja ( i , j ) uma célula em X com o valor máximo. Como ( i , j ) não é um máximo local, ele deve ter uma célula vizinha ( i ' , j ' ) com maior valor.AXXA(i,j)X(i,j)(i,j)

Partição (a matriz A , menos as células em X ) em quatro quadrantes - os quadrantes superior esquerdo, superior direito, inferior esquerdo e inferior direito - da maneira natural. A célula vizinha ( i ' , j ' ) com maior valor deve estar em um desses quadrantes. Chame esse quadrante de A ' . AXAX(i,j)A

Lema. Quadrant contém um máximo local de A .AA

Prova. Considere começar na célula . Se não for um máximo local, vá para um vizinho com um valor maior. Isso pode ser repetido até chegar a uma célula que seja o máximo local. Essa célula final deve estar em A ' , porque A ' é limitada por todos os lados por células cujos valores são menores que o valor da célula ( i ' , j ' ) . Isso prova o lema. (i,j)AA(i,j)

O algoritmo se chama recursivamente no sub-matrizA'para encontrar um máximo local(i,j)lá e, em seguida, retorna essa célula.n2×n2A(i,j)

O tempo de execução para um n x n satisfaz matriz T ( n ) = T ( n / 2 ) + S ( n ) , então T ( n ) = O ( n ) . T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Assim, provamos o seguinte teorema:

Teorema. Há um -tempo algoritmo para encontrar um local,-máxima numa n × n matriz.O(n)n×n

Ou nós?

Neal Young
fonte
Na primeira leitura, o único erro que vi foi a solução de recorrência. Esse é o único erro?
Radu GRIGore 31/03/19
1
A recorrência está correta. O algoritmo não é!
Neal Young
1
Ah, sim, cometi um erro estúpido com a recorrência. Eu vejo o problema: o máximo que você prova que existe não é (necessariamente) o que você encontra. E o que você encontra ignora o X.
Radu GRIGore
3
(2143300101230001023002222222333233300323000032300)
2
AA