Cómo implementar consultas mínimas de rango bidimensional con una complejidad de O (1) por consulta

Algunas personas mencionan que es una buena copia y pegue desde aquí. Encuentre el elemento máximo en cualquier submatriz de matriz, pero antes de decir eso, verifíquelo. Usuario sudoer esta también es mi cuenta.

_______________________________________________________

Un enfoque de algoritmo de tabla dispersa : –

Tiempo de precomputación : O( N x M x log(N) x log(M))

Tiempo de consultaO(1)

Para comprender este método, debe tener conocimiento de cómo encontrar RMQ utilizando un algoritmo de tabla disperso.

Podemos usar [math] 2D [/ math] Algoritmo de tabla dispersa para encontrar la consulta mínima de rango.

Lo que hacemos en One Dimension: –

preprocesamos RMQ para sub matrices de longitud [matemática] 2 ^ k [/ matemática] usando programación dinámica. Mantendremos una matriz M[0, N-1][0, logN] donde M[i][j] es el índice del valor mínimo en la matriz secundaria que comienza en i .

Para calcular M[i][j] debemos buscar el valor mínimo en la primera y segunda mitad del intervalo. Es obvio que las piezas pequeñas tienen una longitud [matemática] 2 ^ (j – 1) [/ matemática], por lo que el pseudocódigo para el cálculo es: –

if (A [M [i] [j-1]] <A [M [i + 2 ^ (j-1) -1] [j-1]])
M [i] [j] = M [i] [j-1]
más
M [i] [j] = M [i + 2 ^ (j-1) -1] [j-1]

Aquí A es una matriz real que almacena valores. Una vez que tenemos estos valores preprocesados, vamos a mostrar cómo podemos usarlos para calcular RMQ (i, j) . La idea es seleccionar dos bloques que cubran completamente el intervalo [i..j] y encontrar el mínimo entre ellos. Deje k = [log(j - i + 1)] . Para calcular RMQ (i, j) podemos usar la siguiente fórmula: –

si (A [M [i] [k]] <= A [M [j – 2 ^ k + 1] [k]])
RMQ (i, j) = A [M [i] [k]]
más
RMQ (i, j) = A [M [j – 2 ^ k + 1] [k]]

Para 2 dimensiones: –

De manera similar, también podemos extender la regla anterior para 2 Dimension, aquí preprocesamos RMQ para la submatriz de longitud [matemática] 2 ^ K, 2 ^ L [/ matemática] usando programación dinámica y mantenemos una matriz M[0,N-1][0, M-1][0, logN][0, logM] . Donde M[x][y][k][l] es el índice del valor mínimo en la submatriz que comienza en [x , y] y tiene una longitud de 2^K, 2^L respectivamente.

El seudocódigo para el cálculo M[x][y][k][l] es: –

M [x] [y] [i] [j] = GetMinimum (M [x] [y] [i-1] [j-1], M [x + (2 ^ (i-1))]] [y ] [i-1] [j-1], M [x] [y + (2 ^ (j-1))] [i-1] [j-1], M [x + (2 ^ (i-1 ))] [y + (2 ^ (j-1))] [i-1] [j-1])

Aquí la función GetMinimum devolverá el índice del elemento mínimo de los elementos proporcionados. Ahora que hemos preprocesado, veamos cómo calcular RMQ (x, y, x1, y1) . Aquí [x, y] punto inicial de la submatriz y [x1, y1] representan el punto final de la submatriz significa el punto inferior derecho de la submatriz. Aquí tenemos que seleccionar cuatro bloques de submatrices que cubran completamente [x, y, x1, y1] y encontrar el mínimo de ellos. Dejar

k = [log(x1 - x + 1)] & l = [log(y1 - y + 1)] . Para calcular RMQ (x, y, x1, y1) podemos usar la siguiente fórmula:

RMQ (x, y, x1, y1) = GetMinimum (M [x] [y] [k] [l], M [x1 – (2 ^ k) + 1] [y] [k] [l], M [x] [y1 – (2 ^ l) + 1] [k] [l], M [x1 – (2 ^ k) + 1] [y1 – (2 ^ l) + 1] [k] [l] );

Pseudocódigo para la lógica anterior: –

# recuerde el índice de almacenamiento de la matriz ‘M’ de la matriz real ‘P’, de modo que para comparar valores en la función GetMinimum compare los valores de la matriz ‘P’ no de la matriz ‘M’
SparseMatrix (n, m) {

para i = 0 a 2 ^ i <= n:
para j = 0 a 2 ^ j <= m:
para x = 0 a x + 2 ^ i -1 <n:
para y = 0 a y + (2 ^ j) -1 <m:
si i == 0 y j == 0:
M [x] [y] [i] [j] = Par (x, y) # almacenar x, y
más si i == 0:
M [x] [y] [i] [j] = GetMinimum (M [x] [y] [i] [j-1], M [x] [y + (2 ^ (j-1))]] [i ] [j-1])
más si j == 0:
M [x] [y] [i] [j] = GetMinimum (M [x] [y] [i-1] [j], M [x + (2 ^ (i-1))] [y] [i -1] [j])
más
M [x] [y] [i] [j] = GetMinimum (M [x] [y] [i-1] [j-1], M [x + (2 ^ (i-1))]] [y ] [i-1] [j-1],
M [x] [y + (2 ^ (j-1))] [i-1] [j-1], M [x + (2 ^ (i-1))] [y + (2 ^ (j-1) ))] [i-1] [j-1]);
}

RMQ (x, y, x1, y1) {
k = log (x1 – x + 1)
l = log (y1 – y + 1)
ans = GetMinimum (M [x] [y] [k] [l], M [x1 – (2 ^ k) + 1] [y] [k] [l], M [x] [y1 – (2 ^ l) + 1] [k] [l], M [x1 – (2 ^ k) + 1] [y1 – (2 ^ l) + 1] [k] [l]);
devuelve P [ans-> x] [ans-> y] # ans-> x representa el número de fila retenido en ans y de forma similar ans-> y representa el almacén de columnas en ans
}

He escrito un blog en Codeforces explicando la consulta mínima de rango 2D.

Después del tiempo de preprocesamiento de O (n * m * logn * logm) podemos responder a cada consulta en O (1)

Hacer clic

More Interesting

¿Se puede demostrar que es imposible volver a un entero inicial mayor que uno si aplica un algoritmo de multiplicar por tres y agregar uno cuando es impar y dividir por dos si es par?

Cómo resolver CCC2016S4

No puedo desempeñarme bien en los concursos de programación, incluso después de practicar mucho. ¿Qué debería hacer ahora? ¿Debo dejar de hacer programación competitiva?

¿Cómo podemos generar k enteros aleatorios únicos en el rango [1 ... n] con igual probabilidad?

Tiene una lista vinculada en la que cada nodo es otra lista vinculada. ¿Cómo encuentra el elemento Kth más exclusivo entre todos los nodos en el momento más óptimo?

¿Cuáles son algunos de los buenos problemas de retroceso?

¿Cuál fue tu algoritmo favorito del que aprendiste mucho?

¿Qué algoritmo de ML debo usar para una aplicación de selección de automóviles basada en Tinder?

¿Qué es una función recursiva elemental?

¿Cómo podemos almacenar los enlaces de una lista vinculada en una matriz dinámica?

¿Qué tipo de algoritmo de Machine Learning debería usar para un robot que ve?

¿Puede Quantum Computing acelerar las redes neuronales y los algoritmos genéticos?

¿Existe un algoritmo existente para la siguiente pregunta? Si no, ¿cuál es la respuesta?

¿Qué es un algoritmo para darme sistemáticamente todas las combinaciones de elementos r de una matriz de elementos K?

¿Existen algoritmos en R que permitan clasificar una variable binaria basada en un conjunto de cadenas (texto)?