Dada una matriz N-por-N de N ^ 2 enteros distintos, ¿cómo podemos diseñar un algoritmo O (N) para encontrar un mínimo local?

Puede encontrar el problema aquí Dividiendo y conquistando la plaza en el artículo DIVIDIENDO Y CONQUISTANDO EL CUADRADO por Donna C Llewellyn y Craig A Tovey 10 de marzo de 1990

Explican un enfoque de divide y vencerás que resuelve el problema utilizando consultas 2.554n.

Llegar a 3n + 4log n es algo fácil:

Consulta todos los elementos en la columna central. Encuentre el mínimo en esta columna, observe que sus dos vecinos horizontales se repiten en la mitad de la matriz que contiene el más pequeño de los dos vecinos. Luego haga lo mismo después de consultar la fila del medio. En n + 2 + n / 2 + 2 pasos, hemos reducido el problema de un tamaño nxn a uno n / 2xn / 2. El número total de consultas será 3n + 4 log n.

La intuición detrás de por qué esto funciona me vino del algoritmo de descenso más empinado que busca un mínimo local.

En cada punto, mantenemos la mitad del problema que contiene el elemento mínimo que hemos visto hasta ahora. Ese elemento puede ser un mínimo local, o uno de sus vecinos puede ser más pequeño que él, pero la ruta de acceso a un elemento más pequeño siempre estará en la mitad que hayamos elegido porque todos los elementos en el borde son más grandes.

Un algoritmo bastante simple.

i = 0
j = 0

localMin (i, j):
Encuentre el mínimo de vecinos de [i] [j]:
min { a [i] [j], a [i-1] [j], a [i] [j-1], a [i] [j + 1], a [i + 1] [j] } (teniendo en cuenta las condiciones de contorno)
             i = índice de fila del elemento obtenido anteriormente
j = índice de columna del elemento obtenido anteriormente
localMin (i, j)              // recursividad

Del mismo modo, puede elegir cualquier índice como fuente y tierra como mínimo local.

Difícil de probar pero creo que es O (N). Puede probarlo la cantidad de veces que el código recursivo se ejecuta usted mismo. Está vagamente claro en mi cabeza por qué esto es O (N), pero si alguien puede proporcionar una prueba, será útil.

More Interesting

Cómo mejorarme siendo un graduado de TI más fresco, para poder descifrar las entrevistas técnicas redondas de Java

Al hacer una entrevista de codificación de pizarra y te quedas atascado, ¿está bien explicarle al entrevistador cómo usarías Google para encontrar una respuesta?

Dado todo el tipo / aleatoriedad anti-loop de la entrevista que puede suceder, ¿puede un desarrollador promedio incluso aspirar a trabajar en Amazon / Google / Facebook?

¿Qué efecto tiene terminar una entrevista antes de tiempo en los desarrolladores de software y su opinión de la compañía después?

¿Cuáles son algunas de las últimas preguntas de la entrevista de programación de Google?

¿Qué es una pregunta de entrevista Java?

¿Por qué las entrevistas tecnológicas se centran en problemas o algoritmos complicados de la estructura de datos cuando la mayoría de las empresas no requieren esto en el trabajo diario?

¿Cuál es el mejor libro de algoritmos para descifrar entrevistas?

WordPress: ¿Cuáles serían algunas preguntas de entrevista comunes que se le hacen a un desarrollador experimentado de WordPress?

Hay un gran archivo de palabras que está cambiando dinámicamente. Continuamente estamos agregando algunas palabras. ¿Cómo haría un seguimiento de las 10 palabras más populares en cada momento?

¿Qué preguntas me pueden hacer sobre las prácticas ágiles? ¿Cómo debo prepararme para tales preguntas?

Cómo reorganizar una matriz determinada para que Arr [I] se convierta en Arr [Arr [I]] con O (1) espacio adicional

Cómo usar de manera óptima los seis meses que tengo para mejorar en Python

¿Por qué solo las preguntas relacionadas con algoritmos se hacen principalmente en entrevistas a los grandes?

¿Cuándo encuentra tiempo para mejorar sus habilidades de codificación?