Máximo local 2D
entrada: bidimensional matrizAn × nUMA
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
0 03241250 0330 014113
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.UMAXXUMA( 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 ∖ XUMAX( 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×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?