AIUnlimited
🌳

Fundamentos de IA

🌱
AI Seeds

Empieza desde cero

🌿
AI Sprouts

Construye bases

🌳
AI Branches

Aplica en la práctica

🏕️
AI Canopy

Profundiza

🌲
AI Forest

Domina la IA

🔨

Maestría en IA

✏️
AI Sketch

Empieza desde cero

🪨
AI Chisel

Construye bases

⚒️
AI Craft

Aplica en la práctica

💎
AI Polish

Profundiza

🏆
AI Masterpiece

Domina la IA

📘

Práctica de IA

📖
Entendiendo modelos open-source

Fundamentos y recursos para modelos open-source

🎯
Del problema a la tarea del modelo

Convertir problemas de negocio en tareas de modelos

⚡
Ejecutando tu primer modelo

Mira tus primeros resultados en 30 minutos

🔧
Fine-tuning y evaluación

Ajusta modelos y evalúa el rendimiento

🚀
Sistemas de aplicación

Construye aplicaciones IA del mundo real

🎨
IA generativa

Explora modelos AIGC open-source

🤖
Agentes

Aprende frameworks Agent y herramientas MCP

📐
Fundamentos complementarios

Fundamentos LLM y evaluación

🎓

Claude Academia

🤖
Claude 101

Learn AI basics with Claude

💻
Claude Code 101

Code with Claude as your pair programmer

🤝
Introduction to Claude Cowork

Collaborate with Claude on complex projects

⚙️
Claude Platform 101

Build apps with the Claude API

Laboratorio

7 experimentos cargados
🧬Sandbox de Red Neuronal🤖¿IA o Humano?🥋Dojo de Prompt Engineering🏁Carrera de Algoritmos🧠Trivia de IA🏗️Lienzo de diseño de sistemas
🎯Entrevista simuladaEntrar al Laboratorio→
🚀

Desarrollo profesional

🚀
Plataforma de Entrevistas

Comienza tu camino

🌟
Dominio Conductual

Domina las habilidades blandas

💻
Entrevistas Técnicas

Supera la ronda de código

🤖
Entrevistas de IA y ML

Dominio en entrevistas de ML

🏆
Oferta y Más Allá

Consigue la mejor oferta

Empezar
AIUnlimited

Licencia MIT

沪ICP备18025655号-11

Aprender

  • Fundamentos de IA
  • Práctica de IA
  • Claude Academia
  • Laboratorio
  • Desarrollo profesional

Comunidad

  • Acerca de
  • Preguntas Frecuentes

Soporte

  • Términos de Servicio
  • Política de Privacidad
  • Contacto
Académicos de IA e Ingeniería›✏️ AI Sketch›Lecciones›Patrones de Búsqueda Binaria
🔍
AI Sketch • Intermedio⏱️ 17 min de lectura

Patrones de Búsqueda Binaria

Búsqueda binaria clásica: una revisión rápida

La búsqueda binaria reduce a la mitad el espacio de búsqueda en cada paso. En una matriz ordenada de n elementos, encuentra un objetivo en tiempo O(log n).

def binary_search(nums, target):
    lo, hi = 0, len(nums) - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1

Simple, pero el verdadero poder de la búsqueda binaria va mucho más allá de las matrices ordenadas.

El concepto de espacio de búsqueda

La búsqueda binaria funciona siempre que tenga una condición monótona en un rango. La "matriz" ni siquiera necesita existir; solo necesita un rango [lo, hi] y una función que cambie de False a True (o viceversa) en algún límite.

Search space:  [lo .................. hi]
Condition:      F  F  F  F  T  T  T  T
                          ^-- answer
🤯
La búsqueda binaria se publicó por primera vez en 1946, pero la primera versión libre de errores no se escribió hasta 1962: ¡16 años de errores uno por uno!

Búsqueda binaria en respuesta

En lugar de buscar en una matriz, busque en el espacio de respuesta. Pregunte: "¿Puedo lograr el resultado X?" En caso afirmativo, pruebe con uno más pequeño; Si no, prueba con uno más grande.

Ejemplo: Koko comiendo plátanos

Koko tiene n montones de plátanos y h horas. Encuentra la velocidad mínima para comer para que termine a tiempo.

def min_speed(piles, h):
    lo, hi = 1, max(piles)
    while lo < hi:
        mid = (lo + hi) // 2
        hours = sum((p + mid - 1) // mid for p in piles)
        if hours <= h:
            hi = mid      # speed works, try slower
        else:
            lo = mid + 1  # too slow, go faster
    return lo

El espacio de respuesta es [1, max(piles)] y la condición es monótona: mayor velocidad siempre significa menos horas.

Lección 7 de 100% completado
←Heaps y Colas de Prioridad

Discusión

Iniciar sesión unirse a la discusión

Búsqueda binaria que reduce el espacio de respuestas para una velocidad mínima de alimentación
Búsqueda binaria de respuesta: reduzca el rango de velocidad factible en cada iteración.

Matriz ordenada rotada

Una matriz ordenada girada en algún pivote: [4, 5, 6, 7, 0, 1, 2]. La mitad siempre está ordenada. Compare mid con lo para decidir qué mitad, luego verifique si el objetivo cae en la mitad ordenada.

[4, 5, 6, 7, 0, 1, 2]
 L        M        R
Left half [4..7] is sorted.
Target 1 not in [4..7] → search right.
🧠Verificación Rápida

En una matriz ordenada rotada [3,4,5,1,2], ¿qué mitad se ordena cuando mid=2 (valor 5)?

Primera y última aparición

Para encontrar la primera ocurrencia, cuando alcances el objetivo, no te detengas: establece hi = mid y sigue buscando hacia la izquierda. Para el último, establezca lo = mid + 1 y busque a la derecha.

Este par de búsquedas también le proporciona el recuento de un objetivo: last - first + 1.

Elemento pico

Un elemento más grande que ambos vecinos. Incluso en una matriz sin clasificar, la búsqueda binaria funciona: si nums[mid] < nums[mid + 1], el pico está a la derecha; de lo contrario, está a la izquierda. O(log n).

🤔
Think about it:¿Por qué la búsqueda de picos funciona con la búsqueda binaria aunque la matriz no esté ordenada? ¿Qué propiedad reemplaza el orden aquí?

Buscar en una matriz 2D

Si las filas están ordenadas y el primer elemento de cada fila es mayor que el último de la anterior, trate la matriz como una única matriz ordenada de m × n elementos. Asigne el índice k a la fila k // n, columna k % n.

Raíz cuadrada sin biblioteca

Encuentra el entero más grande x donde x * x ≤ n. Espacio de búsqueda: [0, n]. Búsqueda binaria clásica por respuesta.

def sqrt(n):
    lo, hi = 0, n
    while lo <= hi:
        mid = (lo + hi) // 2
        if mid * mid <= n:
            lo = mid + 1
        else:
            hi = mid - 1
    return hi

El patrón "Minimizar el máximo"

Problemas como "suma más grande de matriz dividida" o "capacidad para enviar paquetes en D días" le piden minimizar el peor de los casos. La respuesta es monótona: si la capacidad C funciona, también lo hace C+1. Búsqueda binaria en C.

🧠Verificación Rápida

Para 'Capacidad para enviar paquetes en días D', ¿cuál es el espacio de búsqueda para la búsqueda binaria?

La plantilla universal

lo, hi = min_possible, max_possible
while lo < hi:
    mid = (lo + hi) // 2
    if condition(mid):
        hi = mid        # mid works, try smaller
    else:
        lo = mid + 1    # mid fails, need larger
return lo

Ajuste hi = mid frente a lo = mid dependiendo de si busca el primer Verdadero o el último Verdadero.

🧠Verificación Rápida

¿Cuál es la complejidad temporal de la búsqueda binaria en un espacio de respuesta de tamaño S con una verificación de viabilidad O(n)?

🤔
Think about it:Cuando ves la frase "mínimo máximo posible" o "máximo mínimo posible" en el planteamiento de un problema, ¿qué te viene a la mente inmediatamente?

📚 Lecturas adicionales

  • NeetCode - Lista de reproducción de búsqueda binaria: problemas seleccionados, desde fáciles hasta difíciles
  • Manual de entrevistas técnicas - Búsqueda binaria - patrones, consejos y trampas
  • Plan de estudio de búsqueda binaria LeetCode - conjunto de problemas progresivos