Se le da una matriz de números MxN, con la propiedad de que los números aumentan a medida que avanza por cada columna y hacia la derecha en cada fila. ¿Cómo puede verificar eficientemente si un número dado está en la matriz?

Una solución en n + m pasos: comienza con A [0] [n – 1] . Lo compruebas con tu número. Si A [0] [n-1] es más alto que su número actual, significa que puede eliminar todos los números en esta fila e ir una fila hacia abajo, si es más bajo, puede eliminar todos los números en esta columna y continuar La columna a la izquierda. Entonces, en cada paso, disminuye el índice de la columna o aumenta el índice de la fila. Solo puedes hacer esto n + m veces.

Por qué no se puede hacer mucho mejor:
Puede encontrar un ejemplo que tenga números ordenados por diagonales para que los números en una diagonal más alta sean más pequeños que los números en una diagonal más baja y para que dentro de cada diagonal el orden sea aleatorio.

Un ejemplo de eso sería:

1 2 6 10
3 4 7 13
5 9 11 14
8 12 15 16

En estos ejemplos, debe pasar por la mayoría de los elementos en diagonal en el peor de los casos porque una pregunta en la diagonal simplemente elimina a un candidato y una pregunta fuera de la diagonal simplemente ayuda a determinar la diagonal derecha para buscar. Entonces, en el peor de los casos, debe hacer al menos consultas O (min (m, n)).

Si usa cascada fraccional ( http://en.wikipedia.org/wiki/Fra …), puede resolver este problema en el tiempo [matemático] O (M + \ log N) [/ matemático] – estrictamente mejor que el propuesto [matemáticas] O (M + N) [/ matemáticas] límite propuesto anteriormente. Tenga en cuenta que este enfoque también se generaliza incluso si atenuamos las restricciones en la cuadrícula, de modo que solo se clasifica una dimensión y la otra no.

Hay muchos enfoques para resolver este problema, veamos algunos de ellos.

Enfoque 1:
Verifique el número uno por uno mirando cada elemento de la matriz.
Este enfoque no es eficiente ya que en el peor de los casos necesitamos atravesar la matriz completa para identificar si el elemento está presente o no.

Enfoque 2:
Como la matriz está ordenada por filas y columnas, podemos aplicar la búsqueda binaria en cada fila e identificar si el elemento está presente o no.

Enfoque 3:
En este enfoque, comenzaremos nuestra búsqueda mirando el elemento más a la derecha de la primera fila.

  1. If Current Element = Search element, Return True, elemento encontrado.
  2. Si Elemento actual < Elemento de búsqueda, significa que todos los elementos a la izquierda del elemento actual son más pequeños y no es necesario mirar a la izquierda. Verifique el elemento en la siguiente columna.
  3. Si Elemento actual> Elemento de búsqueda, significa que todos los elementos en el elemento actual debajo son más altos y no es necesario mirar hacia abajo. Verifique el elemento en el lado izquierdo en la misma fila.

Tomemos un ejemplo y comprendamos la solución:

Explicación detallada con el programa: Buscar en una matriz ordenada por filas y columnas

More Interesting

Estoy aprendiendo algoritmos, ¿para qué sirve la notación Big O?

¿Cuáles son los problemas resueltos por los algoritmos hash?

¿Qué algoritmos usa Bing para clasificar los resultados de búsqueda? ¿La patente de Google les impide usar PageRank? Análisis de enlaces en general?

¿Hay alguna razón para no usar el generador de números aleatorios estándar de C ++?

¿Se puede implementar un mapa usando Tree? ¿Se puede implementar un mapa usando List? Esto es específico de Java, pero me gustaría conocer el enfoque general.

¿Cómo convertirse en un experto en ciencia de datos (aprendizaje automático) que tiene una idea básica de la programación C / C ++? ¿Cuáles son algunos cursos o libros disponibles gratis o baratos?

¿Es posible determinar el valor máximo de puntos que se puede otorgar para una sola palabra Scrabble?

¿Puede un gráfico tener bordes dirigidos y no dirigidos?

¿Cuál es el enfoque para encontrar un acuerdo que produzca el salario mínimo?

Cómo implementar la idea de algoritmos en MATLAB

¿Utiliza el cerebro el algoritmo de propagación hacia atrás dado cómo se conectan las sinapsis secuencialmente?

Cómo clasificar videos de YouTube usando el algoritmo de puntuación de Wilson

¿Cuál es la elección ideal de algoritmos, bibliotecas en PNL y aprendizaje automático para construir un bot de chat?

¿Cuáles son las aplicaciones prácticas de los diversos algoritmos que estudian los estudiantes de CS en Data Structures?

¿Cuál es el lenguaje de programación más eficiente para diseñar algoritmos médicos?