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.
ds.algorithms
proofs
Marin
fonte
fonte
Respostas:
Máximo local 2D
entrada: bidimensional matrizAn × n UMA
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 , j - 1 ] , A [ i - 1 , j ] , A [ i + 1 , j ] UMA
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.UMA X X UMA ( 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 ' .A ∖ X UMA X ( i′, j′) UMA′
Lema. Quadrant contém um máximo local de A .UMA′ UMA
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′) UMA′ UMA′ ( 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×n2 A′ (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×n T(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?
fonte