¿Cuál es el algoritmo más eficiente para encontrar todos los picos 2D en una matriz?

Supongo que un pico 2D es un valor que es más alto que sus vecinos. También podemos definir que los valores en ambos extremos de la matriz solo tienen un vecino, y serán picos si son más altos que ese vecino.

Este algoritmo tendrá una complejidad mínima de O (n) ya que todos los elementos de la matriz deben examinarse para encontrar los picos. También se puede implementar en O (n) complejidad, es decir, lineal.

Podemos construir una máquina de estado para hacer esto de manera muy eficiente.

Los estados son: (escalar, descender) y la siguiente entrada también puede ser: (escalar, descender).

Cuando el estado actual = subir y la siguiente entrada = descender, tenemos un pico. De lo contrario, solo actualice el estado actual de acuerdo con la siguiente entrada.

Aquí hay un pseudocódigo.

current_state: = escalada

– 1 es el primer elemento de la matriz, n es el número de elementos
para i: = 1 a n
– Determinar next_input
si i = n entonces
next_input: = descendente
más
si valor (i) <valor (i + 1) entonces
next_input: = escalada
más
next_input: = descendente
terminara si
terminara si

– Determinar si se encontró un pico
si current_state = escalando y next_input = descendiendo entonces
– encontró un pico en el valor (i), haga lo que quiera con él
terminara si

– Actualizar estado actual
current_state: = next_input
fin para