Dada una matriz de números naturales , donde es una constante, quiero responder en consultas de la forma: "¿cuántas veces aparece en la matriz entre los índices y "?
La matriz debe ser preprocesada en tiempo lineal. En particular, me gustaría saber si hay una reducción en la consulta mínima de rango.
Esto es equivalente a RMQ en el caso donde y desea consultar el número de unidades dentro de un intervalo. Así que podemos usar es . No pude responder mi propia pregunta debido a los límites de SE.
Respuestas:
Como es constante, podemos almacenar el recuento de cada elemento en el rango para en en tiempo y espacio. La observación principal es que puede hacer una matriz bidimensional en tiempo , luego consultar rangos al encontrar la diferencia en los índices en tiempo constante.k 0..m 0≤m<n 0..n O(nk)=O(n) O(nk) i,j
count[pos][elem] = occurences of 'elem' in the indices 0..pos
Preprocesamiento
Consulta
(asume que i, j son ambos límites inclusivos)
Si la matriz también se actualiza durante todo el proceso de consulta, puede usar árboles Fenwick (índice binario) en lugar de la matriz. Esto le permite actualizar en y consultar en .k O(logn) O(logn)
count
Disculpas por cualquier problema con esta respuesta, es mi primera.
fuente