Introducción

1

Patrones de arreglos: ventana deslizante y dos apuntadores

2

Arrays y Strings: Manipulación y Complejidad Temporal

Dos Apuntadores

3

Optimización de Algoritmos con Dos Apuntadores

4

Ordenación Lexicográfica en Idioma Alienígena

5

Algoritmos de Ordenación en Python: Guía Práctica Paso a Paso

6

Playground: Verifying Alien Dictionary

7

Creación de Mapas y Diccionarios en JavaScript

8

Fusionar Listas Ordenadas con Python

9

Ordenamiento de listas con apuntadores y complejidad O(n+m)

10

Playground: Merge Two Sorted Lists

11

Fusión de listas ordenadas en Python

12

Problema: Calcula el contenedor con más agua

13

Optimización de algoritmos: cálculo eficiente de áreas máximas

14

Playground: Container with Most Water

15

Programación Orientada a Objetos con Java

16

Algoritmo para Trapping Rainwater en Python

17

Transformación de Números Negativos a Positivos en Listas Python

18

Uso de Dos Punteros en Algoritmos Python

Ventana Deslizante

19

Patrón Ventana-Deslizante: Análisis de Datos Sucesivos

20

Subcadenas más largas sin caracteres repetidos

21

Longitud máxima de subcadena sin caracteres repetidos

22

Playground: Longest Substring Without Repeating Characters

23

Cadena sin caracteres repetidos en Python

24

Optimización de búsqueda binaria en Python

25

Programación Dinámica: Algoritmos y Aplicaciones Prácticas

Búsqueda Binaria

26

Búsqueda Binaria: Algoritmo Eficiente en Listas Ordenadas

27

Búsqueda Binaria en Arrays Rotados

28

Búsqueda Binaria en Arreglos Rotados

29

Playground: Search in Rotated Arrays

30

Búsqueda Binaria en Arrays Rotados usando C++

31

Búsqueda eficiente en matrices ordenadas MxN

32

Búsqueda Binaria en Matrices 2D Ordenadas

33

Playground: Search 2D Array Matrix

34

Búsqueda Binaria en Matrices con Python

Próximos pasos

35

Estructuras de Datos Lineales Avanzadas

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Búsqueda Binaria en Matrices 2D Ordenadas

32/35
Recursos

¿Cómo encontrar un número en una matriz 2D ordenada?

Cuando se trata de buscar en matrices 2D ordenadas, el conocimiento clave es el uso de la búsqueda binaria. Este método es esencial para realizar búsquedas eficientes en arreglos de datos que de otra manera requerirían recorrido completo y por ende, mayor tiempo de procesamiento. Pero, ¿cómo se puede implementar este enfoque para obtener resultados óptimos?

¿Qué es la búsqueda binaria?

La búsqueda binaria es un algoritmo que permite encontrar un valor específico en una lista ordenada dividiendo repetidamente el rango de búsqueda a la mitad. Esto reduce considerablemente el número de elementos que deben verificarse, haciendo el proceso mucho más eficiente comparado con una búsqueda lineal que analizaría cada elemento uno por uno.

¿Por qué es importante el orden en la matriz?

El orden en la matriz es fundamental para aplicar búsqueda binaria. Si los datos no están ordenados, el algoritmo no podría reducir eficientemente el rango de búsqueda. Por ejemplo, en matrices ordenadas:

  • Las filas están en orden ascendente de izquierda a derecha.
  • Las columnas están en orden ascendente de arriba hacia abajo.

Estas propiedades aseguran que al seleccionar un punto medio se pueda decidir en qué dirección moverse, similar a como se haría en una lista unidimensional.

¿Cómo implementar la búsqueda en una matriz ordenada?

La estrategia en una matriz bidimensional aprovecha el orden automático por filas y por columnas:

  1. Búsqueda en filas: Empieza evaluando las filas. Comienza desde el último número de la fila (mayor valor) y decide, mediante búsqueda binaria, en qué fila podría estar el número objetivo.
  2. Búsqueda en la fila seleccionada: Una vez identificada la posible fila, aplica búsqueda binaria en esa fila para localizar el valor.

Ejemplo de implementación en Python

A continuación, un ejemplo de cómo podría codificarse este tipo de búsqueda en una matriz bidimensional en Python.

def search_matrix(matrix, target):
    if not matrix or not matrix[0]:
        return False

    # Número de filas y columnas
    num_rows, num_cols = len(matrix), len(matrix[0])

    # Búsqueda binaria en filas
    row_begin, row_end = 0, num_rows - 1
    while row_begin <= row_end:
        row_mid = (row_begin + row_end) // 2
        if matrix[row_mid][0] <= target <= matrix[row_mid][-1]:
            break
        elif matrix[row_mid][0] < target:
            row_begin = row_mid + 1
        else:
            row_end = row_mid - 1
    else:
        return False

    # Búsqueda binaria en la fila encontrada
    row = row_mid
    col_begin, col_end = 0, num_cols - 1
    while col_begin <= col_end:
        col_mid = (col_begin + col_end) // 2
        if matrix[row][col_mid] == target:
            return True
        elif matrix[row][col_mid] < target:
            col_begin = col_mid + 1
        else:
            col_end = col_mid - 1

    return False

# Ejemplo de uso
matriz = [
    [1, 3, 5, 7],
    [10, 11, 16, 20],
    [23, 30, 34, 50]
]
print(search_matrix(matriz, 16)) # Debería devolver True

¿Qué beneficios ofrece la búsqueda binaria en matrices grandes?

  • Eficiencia: Reduce dramáticamente el número de comparaciones necesarias.
  • Ahorro en recursos: Menos operaciones se traducen en menor consumo de tiempo y recursos computacionales.
  • Aplicación práctica: Ideal para bases de datos de gran tamaño, permitiendo búsquedas rápidas en entornos con millones de registros.

¿Qué considerar al implementar este tipo de búsqueda?

  • Orden correcto: Asegúrate de que tanto filas como columnas estén ordenadas.
  • Gestión de bordes: Maneja adecuadamente casos de bordes o matrices vacías.
  • Pruebas exhaustivas: Implementa pruebas para validar el algoritmo con diferentes tamaños y configuraciones de matrices.

Explorar y entender estos algoritmos mejora no solo el rendimiento de búsquedas complejas, sino también la comprensión de cómo manipular y manejar eficientemente grandes volúmenes de datos. No dejes de explorar este y otros algoritmos eficientes que harán tus códigos más robustos y veloces.

Aportes 4

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La solución es hacer un binary search verticalmente, para después hacer uno horizontalmente, dentro de la fila que tiene el rango correcto del número que se esta buscando

  • Excelente explicación me ayudo a comprender mejor como optimizar.

Investigando lo que la profe pidió 🙆‍♂️:

  • Encontré que el Ray tracing utiliza 2D array, interesante.

  • Tuve un reto y fue que lo había hecho con list comprehension para el obtener la fila, el resultado final era O(m log n), y al pasarlo a binary search me embolaté un poco, y tengo que mejorar mis tiempos de resolución, pero bueno copilot me guío, con un bello O(log m*n):
Valeh, Que Yo Podria Tener un Software de Sensor de Temperaturas en una PLanta Industrial de Gas , Luego Yo quiero mantenner control total sobre la Temperatura de la tapa superior de mi Caldera no sobre pase cierto limite de T° como Tolerancia, por tanto que la supericicie del la cubierta superiror sea un rectangulo de base Rect y area = b*h donde b se divide en m pariticiones y h se divide en n paritciones asi guardo mis temperaturas en una Magtrix m*n de cordenadas ( i, j ) , mi Sensor Software debe ser capaz de encontrar la posicion dodnde la temperaturas sube alarmante fuera de mi rango de tolerancia\n Luego ubicar esta posicion lo mas rapido posible para enviar una aletrta al operario Industrial , la cubierta del Hervidor/Caldera se ubica de una forma que las temperaturas siempre estaran en orden ascendentes en vertical como horizontal por toda la supericie rectangular, \n esta seria una buena aproximancion para una parte del codigo que necesitase ubicar la psoicion de una determinada temperatura en tiempo O ( n + m ) ASAP \n

si solo aplanamos la matriz la complejidad sería
log (n+m)
lo cual sería mejor, dado que
log (n+m) < log m + log n
pero habría que considerar la complejidad de aplanar, que no sé cuál es