Esta lección se tradujo automáticamente al español y aún no ha sido revisada por una persona. Si algo suena raro, la versión en inglés es la definitiva.
Imagine una IA monitoreando una transmisión de video en vivo en busca de actividad sospechosa. No puede volver a ver la grabación completa cada segundo; necesita deslizar una ventana de atención a lo largo de la transmisión, manteniendo un registro del contexto suficiente. Eso es exactamente lo que hacen los patrones dos punteros y ventana deslizante para datos secuenciales.
Ambas técnicas convierten los escaneos O(n²) de fuerza bruta en elegantes pases O(n).
Coloque dos referencias en una secuencia y muévalas según una regla. Hay dos sabores principales.
Comience con un puntero en cada extremo y muévalos hacia adentro. Perfecto para datos ordenados.
Problema clásico: suma de pares: Dada una matriz ordenada, encuentre dos números que se sumen a un objetivo.
function pairSum(arr, target):
left = 0
right = arr.length - 1
while left < right:
sum = arr[left] + arr[right]
if sum == target: return (left, right)
if sum < target: left += 1
else: right -= 1
return null
Debido a que la matriz está ordenada, mover left hacia la derecha aumenta la suma y mover right hacia la izquierda la disminuye, lo que garantiza que nunca nos perderemos un par válido.
Ambos punteros avanzan, pero a diferentes velocidades. Útil para particionamiento o detección de ciclos.
Ejemplo: eliminar duplicados in situ: Un puntero lento marca la posición de escritura; un puntero rápido escanea hacia adelante.
function removeDuplicates(arr):
slow = 0
for fast in 1..arr.length - 1:
if arr[fast] != arr[slow]:
slow += 1
arr[slow] = arr[fast]
return slow + 1
Inicia sesión para unirte al debate
En la técnica convergente de dos punteros en una matriz ordenada, ¿qué se debe hacer cuando la suma actual es menor que el objetivo?
Una ventana deslizante mantiene una subsecuencia contigua de tamaño k (fijo) o de longitud variable, actualizando los agregados de forma incremental en lugar de volver a calcularlos desde cero.
Deslice una ventana de exactamente k elementos a lo largo de la matriz.
Ejemplo: suma máxima de k elementos consecutivos:
function maxSubarraySum(arr, k):
windowSum = sum(arr[0..k-1])
best = windowSum
for i in k..arr.length - 1:
windowSum += arr[i] - arr[i - k]
best = max(best, windowSum)
return best
Cada paso agrega el nuevo elemento que ingresa a la ventana y resta el que sale: O (1) por movimiento.
Expanda la ventana para incluir más datos y luego redúzcala cuando se infrinja una restricción.
Ejemplo: subcadena más larga sin caracteres repetidos:
function longestUnique(s):
seen = {}
left = 0
best = 0
for right in 0..s.length - 1:
if s[right] in seen and seen[s[right]] >= left:
left = seen[s[right]] + 1
seen[s[right]] = right
best = max(best, right - left + 1)
return best
| Patrón | Caso de uso de IA | |---------|------------| | Ventana fija | Detección de anomalías en las últimas k lecturas del sensor | | Ventana variable | Encontrar el intervalo de texto más corto que contenga todas las palabras clave de consulta (motores de búsqueda) | | Punteros convergentes | Controles eficientes del vecino más cercano en dimensiones de incrustación ordenadas | | Punteros en la misma dirección | Fusionar listas de resultados ordenados de múltiples modelos de recuperación |
¿Qué patrón elegirías para encontrar el subconjunto más pequeño cuya suma excede un valor dado?
¿Cuál es la complejidad de tiempo típica que se logra al convertir un bucle anidado de fuerza bruta en una solución de dos punteros o de ventana deslizante?