Cómo maximizar la suma de las diferencias absolutas en los índices correspondientes de dos matrices sobre todas sus permutaciones posibles

Aquí hay una solución con complejidad O (N).

En primer lugar, si tomamos la primera matriz ordenada en orden creciente y la segunda matriz ordenada en orden decreciente, tales permutaciones nos darán una respuesta óptima. Puede leer el comentario de Arjun Arul para obtener una explicación de por qué funciona: cuando la primera matriz se ordena en orden creciente, después de mejorar la segunda matriz de forma iterativa, terminará con la segunda matriz ordenada en orden decreciente.

Por lo tanto, queremos ordenar dos matrices e invertir una de ellas … Bueno, es imposible lograr una complejidad mejor que NlogN para exactamente esta idea. Intentemos modificarlo un poco.

¿Cómo se ve la solución óptima? Hay algún prefijo, para el cual a [i] b [i], por lo que tenemos que tomar a [i] con más y b [i] con menos.

Tratemos de dividir todos los elementos en dos grupos según el signo que deberían tener en la suma resultante.

Imaginemos que ya conocemos el valor de a [i] yb [i] para nuestro “punto especial” (después de lo cual a [i] se vuelve más grande que b [i]) , y también todos a [i] y b [i ] son ​​distintos. En este caso, sabemos que todos los valores de a [j] tal que a [j] <= a [i] se tomarán con signo menos (pertenecen a un prefijo, donde tenemos a [j] a [i] se tomará con un signo más. Buenas noticias: en tal caso, podemos resolver nuestro problema en O (N), porque para cada elemento podemos determinar su suma resultante al compararlo con un elemento especial de la matriz correspondiente. Malas noticias: no sabemos cómo encontrar valores para un punto crucial, además es posible que algunos elementos de nuestra matriz sean iguales.

Ahora algún algoritmo de selección debería ayudarnos. Puede usar cosas como el enésimo elemento para encontrar una mediana de matriz en O (N) y también reorganizarla de tal manera que todos los elementos a la izquierda de la mediana no sean más grandes que los elementos a la derecha. Vamos a aplicarlo para encontrar medianas de matrices a [] yb [] y compararlas. Con esta información, podemos determinar si el prefijo para el cual a [i] <= b [i] tiene una longitud de al menos N / 2 o es menor. Ahora supongamos que es más que N / 2. En este caso, podemos tomar el sufijo de nuestras matrices y encontrar medianas allí nuevamente (así sabremos que el “punto especial” es al menos 3 * N / 4 elementos desde el principio o en algún lugar entre N / 2 y 3 * N / 4 ; no olvide que para la segunda matriz estamos usando un comparador diferente para ordenar los elementos en orden decreciente) . Se puede hacer en operaciones N / 2, porque ahora estamos trabajando con matrices que son dos veces más cortas. Podemos continuar haciendo este tipo de búsqueda binaria para encontrar la posición exacta en la que a [i] se hace más grande que b [i]: tomará N + N / 2 + N / 4 + N / 8 + … = EN). También sabemos que en un momento dado todos los elementos de un [] a la izquierda desde nuestro punto especial no son más grandes que el elemento en una posición interesante, y todos los elementos a la derecha no son más pequeños que el elemento interesante. Por lo tanto, todos los elementos de un prefijo se tomarán con el signo menos, y todos los elementos de un sufijo se tomarán con el signo más 🙂 Y para b [], los elementos del prefijo se tomarán con un signo más, y los elementos del sufijo se tomarán con un signo menos .

Primero debe notar que permutar una sola matriz [math] b [/ math] cubrirá todos los casos posibles. Entonces, arreglamos la matriz [math] a [/ math] y luego tratamos de encontrar una permutación de [math] b [/ math] para maximizar [math] \ sum_ {i = 0} ^ {N-1} | a_i – b_i | [/ math].

En otras palabras, tenemos que asignar cada elemento de la matriz [matemáticas] b [/ matemáticas] a un elemento de la matriz [matemáticas] a [/ matemáticas] y viceversa, donde cada asignación [matemáticas] b_i [/ ​​matemáticas] a un [math] _j [/ math] tiene un costo de [math] | b_i – a_j | [/ math].

Este problema se conoce como problema de asignación que se puede resolver en [matemática] O (N ^ 3) [/ matemática] utilizando el algoritmo húngaro.

Esto se puede modelar como flujo máximo popular, con el gráfico que tiene 2 * n vértices uno para cada índice en cada matriz y un peso de borde igual a la diferencia absoluta entre el índice correspondiente.

También modelado como problema de coincidencia bipartita máxima. Entonces, para gráficos no ponderados como este se reduce al problema de asignación y se puede resolver usando el algoritmo húngaro con complejidad de O (n ^ 3).

La mejor complejidad de O (n ^ 2 log n + n ^ 2) se puede lograr con la ayuda del algoritmo de Dijkstra y los montones de Fibonacci.

More Interesting

¿Qué tipo de clasificación es esta?

¿Dónde puedo encontrar problemas difíciles de algoritmo / estructura de datos?

¿Cuál es la mejor forma / algoritmo para detectar un patrón en una serie de tiempo?

¿Qué es el "peso" en el algoritmo de Facebook?

¿Cuál es la diferencia entre las estructuras de datos de std :: vector y std :: deque?

¿Tengo que estudiar matemáticas discretas, algoritmos y estructura de datos para convertirme en un buen desarrollador de Android?

¿Cuál es el algoritmo perfecto para extraer la forma, el color, la textura y los bordes de las partes cilíndricas en MATLAB en preparación para el aprendizaje supervisado?

Estoy buscando algunas clases que me darían consejos sobre el enfoque. ¿Debo tomar el diseño del sistema, el algoritmo o la preparación de la estructura de datos?

¿Es posible desarrollar un algoritmo que pueda hacer predicciones perfectas en el mercado de valores?

¿Cuál es un ejemplo de un buen algoritmo que se puede usar para unir a diferentes usuarios dentro de un determinado radio en cualquier ubicación según sus preferencias?

¿Hay un problema DP estándar similar a SPOJ Farida?

Si podemos ordenar datos usando SQL, ¿por qué necesitamos estudiar diferentes algoritmos de ordenación?

¿Cómo funciona la matriz internamente en Java?

Cómo implementar el algoritmo

Cuando trato de entender una técnica como la memorización o lo que sea, me enfrento a muchos dolores y no lo entiendo de inmediato. Necesito intentarlo varias veces. ¿Es normal o debo obtener algoritmos y técnicas con al menos uno o 2 aciertos?