Consulta de mínimo en un rango (Range Minimum Query)
Se da un arreglo . Hay que responder consultas entrantes de la forma , que piden hallar el elemento mínimo en el arreglo entre las posiciones y inclusive.
RMQ puede aparecer en problemas de forma directa o aplicarse en otras tareas, p. ej. el problema del ancestro común más bajo (Lowest Common Ancestor).
Solución
Hay muchos enfoques posibles y estructuras de datos que se pueden usar para resolver la tarea RMQ.
Los que se explican en este sitio se listan a continuación.
Primero los enfoques que permiten modificaciones del arreglo entre las respuestas a las consultas.
- Descomposición por raíz cuadrada - responde cada consulta en , preprocesamiento en . Pros: una estructura de datos muy sencilla. Contras: peor complejidad.
- Árbol de Segmentos - responde cada consulta en , preprocesamiento en . Pros: buena complejidad temporal. Contras: mayor cantidad de código en comparación con las otras estructuras de datos.
- Árbol de Fenwick - responde cada consulta en , preprocesamiento en . Pros: el código más corto, buena complejidad temporal. Contras: el Árbol de Fenwick solo se puede usar para consultas con , así que no es aplicable a muchos problemas.
Y aquí están los enfoques que solo funcionan sobre arreglos estáticos, es decir, no es posible cambiar un valor del arreglo sin recomputar toda la estructura de datos.
- Tabla Dispersa - responde cada consulta en , preprocesamiento en . Pros: estructura de datos sencilla, excelente complejidad temporal.
- Árbol Sqrt - responde consultas en , preprocesamiento en . Pros: rápido. Contras: complicado de implementar.
- Union-Find / truco de Arpa - responde consultas en , preprocesamiento en . Pros: corto, rápido. Contras: solo funciona si todas las consultas se conocen de antemano, es decir, solo admite procesamiento offline de las consultas.
- Árbol cartesiano y algoritmo de Farach-Colton y Bender - responden consultas en , preprocesamiento en . Pros: complejidad óptima. Contras: gran cantidad de código.
Nota: el preprocesamiento es el procesamiento preliminar del arreglo dado construyendo la estructura de datos correspondiente para él.