On the Complexity of the Matching Problem of Regular Expressions with Backreferences
Este artículo establece la complejidad computacional detallada de la coincidencia de expresiones regulares con referencias hacia atrás demostrando cotas inferiores condicionales bajo las hipótesis de SETH y detección de triángulos, al tiempo que presenta un algoritmo mejorado de para referencias hacia atrás de un solo uso.
Artículo original bajo licencia CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta es una explicación generada por IA del artículo a continuación. No ha sido escrita ni avalada por los autores. Para mayor precisión técnica, consulte el artículo original. Leer descargo de responsabilidad completo
La Gran Imagen: El Atasco de Tráfico de las "Regex"
Imagina que eres un guardia de seguridad en un club (el sistema informático). Tienes una lista de reglas (una Expresión Regular) sobre quién puede entrar.
- Reglas Simples: "Solo personas con camisas rojas". Esto es fácil de verificar. Miras una camisa, dices "¿Roja? Sí, pasa". Toma la misma cantidad de tiempo si la fila tiene 10 personas o 10,000.
- El Problema (ReDoS): A veces, los hackers diseñan una fila específica de personas que engaña al guardia para que realice una cantidad masiva de trabajo innecesario. En lugar de revisar a una persona y pasar a la siguiente, el guardia empieza revisando a la Persona A, luego a la Persona B, luego a la Persona A de nuevo, luego a la Persona C, luego a la Persona A otra vez... hasta que el guardia colapsa por agotamiento. Esto se llama un ataque de Denegación de Servicio (ReDoS).
En el mundo real, esto ha provocado que sitios web masivos como Stack Overflow y Cloudflare se caigan. El artículo señala que incluso una lentitud "cuadrática" (donde revisar 100 personas toma 10,000 pasos) es suficiente para colapsar un sistema.
El Villano: "Referencias hacia atrás"
Las reglas estándar son simples. Pero los motores modernos de "Regex" tienen una característica súper poderosa llamada Referencias hacia atrás.
La Analogía:
Imagina una regla que dice: "Encuentra una palabra, recuérdala y luego asegúrate de que la misma palabra exacta aparezca de nuevo más adelante".
- Ejemplo: "Encuentra una palabra, llámala 'X'. Luego, encuentra 'X' de nuevo."
- Si la entrada es
manzana ... manzana, funciona. - Si la entrada es
manzana ... plátano, falla.
Esta característica es increíblemente útil para los programadores, pero hace que el trabajo del "guardia" sea mucho más difícil. El guardia tiene que recordar lo que vio antes y compararlo constantemente con lo que está viendo ahora. El artículo pregunta: ¿Podemos construir un guardia que sea lo suficientemente rápido para manejar estas reglas complejas sin cansarse?
Los Hallazgos del Artículo: Lo Bueno, Lo Malo y Lo Feo
Los autores investigaron exactamente qué tan difícil es resolver estos problemas de emparejamiento. Lo desglosaron en dos lados: Dificultad (Por qué es difícil) y Algoritmos (Cómo solucionarlo).
1. Las Malas Noticias: Algunas Reglas son Imposibles de Acelerar
El artículo demuestra que para ciertos tipos de reglas complejas, no hay "bala mágica" para hacerlas rápidas.
- El Problema del "Triángulo": Mostraron que si tienes una regla que usa dos variables (como recordar dos palabras diferentes y verificarlas más adelante), resolverlo es tan difícil como encontrar un triángulo en un gráfico gigante de una red social. Si pudieras resolver la regla rápidamente, podrías resolver el problema del gráfico rápidamente. Dado que los expertos en gráficos creen que el problema del gráfico es inherentemente lento, el problema de la regla también debe ser lento.
- El Problema de los "Vectores Ortogonales": Para reglas con aún más variables, demostraron que el tiempo requerido crece exponencialmente con el número de variables. Es como intentar encontrar una combinación específica de llaves en una cerradura; cuantas más llaves tengas, más imposible se vuelve forzarlo rápidamente.
Conclusión: Si tu regla es demasiado compleja (usando muchas características de "recuerda esto"), no puedes construir un motor rápido para ella. Siempre te darás contra un muro.
2. Las Buenas Noticias: Una Solución "Casi Lineal" para Casos Simples
Sin embargo, el artículo encontró un punto dulce. Se centraron en un tipo específico y común de regla:
- El Patrón "ABCBD": "Encuentra una palabra (A), luego una palabra (B), luego una palabra (C), luego la misma palabra B exacta de nuevo, luego una palabra (D)".
- Ejemplo del mundo real: "Encuentra un nombre de usuario, luego una contraseña, luego un mensaje, luego el mismo nombre de usuario de nuevo, luego una firma."
Los autores descubrieron que, aunque esto parece complicado, se puede resolver muy eficientemente.
- La Vieja Forma: Los métodos anteriores eran como revisar cada combinación posible en una biblioteca, lo que tomaba un tiempo (cuadrático). Si el libro tenía 1,000 páginas, tomaba 1,000,000 de pasos.
- La Nueva Forma: Los autores construyeron un nuevo algoritmo que toma aproximadamente de tiempo.
- La Analogía: Imagina que la biblioteca está organizada con un sistema de índice mágico (usando Árboles de Sufijos y Bosques de Factorización). En lugar de leer cada página, el guardia puede saltar directamente a las secciones relevantes. Si el libro tiene 1,000 páginas, el nuevo método toma aproximadamente 10,000 pasos (o incluso menos), lo cual es una mejora masiva.
Cómo Funciona el Nuevo Algoritmo (Los "Trucos de Magia")
Para lograr esta velocidad, los autores utilizaron varias técnicas ingeniosas, que describen en el artículo:
- El Árbol de Sufijos (El Mapa): Construyeron un mapa gigante de la cadena de entrada. Este mapa muestra cada posible final de la cadena. Ayuda al guardia a ver instantáneamente: "Oh, esta palabra 'B' aparece aquí, y también aparece allá".
- Descomposición Pesada-Ligera (El Sombrero de Selección): Dividieron el mapa en caminos "pesados" (caminos muy comunes) y caminos "ligeros" (caminos raros). Solo realizan el trabajo pesado en los caminos raros, ahorrando tiempo.
- Periodicidad (El Ritmo): Notaron que cuando una palabra se repite (como "B...B"), la cadena a menudo tiene un ritmo o un patrón. Usaron matemáticas para predecir estos patrones en lugar de revisar cada letra individual.
- Bosques de Factorización (El Índice): Esta es una estructura de datos que actúa como un índice súper rápido, permitiendo al guardia verificar si un fragmento de texto coincide con una regla en tiempo constante, sin importar cuán largo sea el texto.
Resumen de la Conclusión
- ¿Podemos detener todos los ataques ReDoS? No. Si una regla es demasiado compleja (demasiadas variables de "recuerda esto"), está matemáticamente probado que será lenta.
- ¿Podemos arreglar las reglas complejas más comunes? ¡Sí! Para el caso específico donde una regla recuerda una palabra y la verifica una vez más tarde (el patrón "ABCBD"), los autores crearon un nuevo motor que es casi tan rápido como las reglas simples.
- ¿Por qué importa esto? Le dice a los ingenieros de software: "No uses demasiadas referencias hacia atrás, o serás lento. Pero si las usas de esta manera específica y común, ahora puedes usar nuestro nuevo método para mantener tu sistema seguro y rápido".
El artículo esencialmente traza una línea en la arena: Aquí es donde el límite de velocidad es inquebrantable, y aquí es donde encontramos una forma de conducir más rápido.
¿Ahogado en artículos de tu campo?
Recibe resúmenes diarios de los artículos más novedosos que coincidan con tus palabras clave de investigación — con resúmenes técnicos, en tu idioma.