¿Cómo se puede calcular el número de inversiones entre dos matrices en O (N log N)?

Nota: Esta solución calcula la inversión para una matriz. Para calcular las inversiones de dos matrices diferentes, vea mi comentario a continuación.

  1. Combine la matriz de clasificación A y cree una copia (matriz B)
  2. Tome A [1] y encuentre su posición en la matriz B ordenada mediante una búsqueda binaria. El número de inversiones para este elemento será uno menor que el número índice de su posición en B ya que cada número menor que aparece después del primer elemento de A será una inversión.
    2a. acumule el número de inversiones para contrarrestar la variable num_inversions.
    2b. eliminar A [1] de la matriz A y también de su posición correspondiente en la matriz B
  3. vuelva a ejecutar desde el paso 2 hasta que no haya más elementos en A.

Aquí hay un ejemplo de ejecución de este algoritmo. Matriz original A = (6, 9, 1, 14, 8, 12, 3, 2)
1: fusionar ordenar y copiar en la matriz B
B = (1, 2, 3, 6, 8, 9, 12, 14)
2: Tome A [1] y búsqueda binaria para encontrarlo en la matriz B
A [1] = 6
B = (1, 2, 3, 6 , 8, 9, 12, 14)
6 está en la cuarta posición de la matriz B, por lo tanto, hay 3 inversiones. Sabemos esto porque 6 estaba en la primera posición en la matriz A, por lo tanto, cualquier elemento de menor valor que aparezca posteriormente en la matriz A tendría un índice de j> i (ya que i en este caso es 1).
2.b: Eliminar A [1] de la matriz A y también de su posición correspondiente en la matriz B (se eliminan los elementos en negrita).
A = ( 6, 9, 1, 14, 8, 12, 3, 2) = (9, 1, 14, 8, 12, 3, 2)
B = (1, 2, 3, 6, 8, 9, 12, 14) = (1, 2, 3, 8, 9, 12, 14)
3: Vuelva a ejecutar desde el paso 2 en las nuevas matrices A y B.
A [1] = 9
B = (1, 2, 3, 8, 9, 12, 14)
9 ahora está en la quinta posición de la matriz B, por lo tanto, hay 4 inversiones. Sabemos esto porque 9 estaba en la primera posición en la matriz A, por lo tanto, cualquier elemento de menor valor que aparezca posteriormente tendría un índice de j> i (ya que i en este caso es nuevamente 1). Eliminar A [1] de la matriz A y también de su posición correspondiente en la matriz B (se eliminan los elementos en negrita)
A = ( 9 , 1, 14, 8, 12, 3, 2) = (1, 14, 8, 12, 3, 2)
B = (1, 2, 3, 8, 9 , 12, 14) = (1, 2, 3, 8, 12, 14)
Continuar en esta línea nos dará el número total de inversiones para la matriz A una vez que se complete el ciclo.
El paso 1 (clasificación de fusión) tomaría O (n * log n) para ejecutarse. El paso 2 se ejecutaría n veces y en cada ejecución realizaría una búsqueda binaria que lleva a O (log n) a ejecutarse para un total de O (n * log n). El tiempo total de ejecución sería O (n * log n) + O (n * log n) = O (n * log n)

Ver aquí Contando inversiones en una matriz

para i = 1 a N:
ans = ans + Set.get_number_of_greater (b [i])
Set.insert (a [i])

Todo lo que tienes que hacer usando una de las siguientes estructuras para implementar “Set”:

  • Árbol fenwick
  • Árbol de segmento
  • Árbol de búsqueda binaria
  • Treap, Splay Tree

Verifique mi código para ver una pregunta muy similar aquí: la respuesta de Kaustubh Saha a ¿Cómo calculo el número de inversiones en una lista que contiene números sin clasificar que oscilan entre 1 y 100,000? Los números se dan en un archivo separado.

Puede usar una variación de Merge-Sort para calcular el número de inversiones en una matriz.

Adjunto una infografía útil sobre esto. También puede consultar otras preguntas de la entrevista sobre estructuras de datos y algoritmos desde mi blog.

Según yo, el número de inversiones se puede encontrar usando el método Divide and Conquer.

Paso 1: Divida la matriz 1 en dos mitades. Calcule la inversión izquierda, así como la inversión derecha (que sea InV1 + InV2). Ahora, al mismo tiempo, clasifique la mitad izquierda de la matriz secundaria y la matriz derecha de forma recursiva.

Paso 2: Cuando tenemos dos sub-matrices ordenadas, combine las dos sub-matrices y descubra el número total de inversiones divididas (deje que sea spInV3). Así, el número total de inversión es (InV1 + InV2 + spInV3). Let (InV1 + InV2 + spInV3 = x)

Paso 3: haga lo mismo para la segunda matriz hasta que obtenga la matriz combinada 2 que le dará las inversiones totales para esa matriz, es decir, inversión izquierda de la matriz 2 + inversión derecha de la matriz 2 + inversión dividida de la matriz 2. Deje que esta suma sea igual a y.

Paso 4: Ahora que nos quedan dos matrices que descienden de la fusión de las dos matrices secundarias en cada caso. Haga una ordenación por fusión entre estas dos matrices y calcule nuevamente el número de inversiones divididas. Esta subrutina de fusión tomará un tiempo de ejecución de O (n). Calcule el número de inversiones divididas (que sea z).

El número total de inversiones son: x + y + z.

¡Espero que esto ayude! ¡Gracias! 😀

¡Es una especie de fusión! (mantenga el contador para todos los casos donde la derecha es menor que la izquierda en el paso de fusión, es decir, el número de todos los elementos entre ellos).

Código de Referencia: Inversions.java

Tenemos que usar alguna estructura de datos que pueda usarse para actualizar y obtener operaciones en tiempo O (log n). Obtener operación significa: obtener la suma en el rango [l, r].

Entonces, resolvamos este problema para el prefijo e intentemos agregar un elemento en nuestra estructura y volver a calcular la respuesta.

En cuanto a mí, la mejor estructura para él: el árbol Fenwick.

La misma pregunta se responde en este enlace.
Cuenta inversiones en dos matrices

More Interesting

¿Por qué no puede haber un algoritmo de clasificación que tenga el mejor y el peor caso de N tiempo de ejecución (por ejemplo, lineal)?

¿Cómo podría encontrar la métrica correcta que se utilizará para los vecinos más cercanos u otros algoritmos basados ​​en similitudes?

¿Cómo se puede calcular la mediana de una gran variedad de enteros sin mantener todos los valores en la memoria?

¿Cuál sería un algoritmo eficiente para ordenar millones de líneas de cadenas / enteros en un archivo?

Cómo recorrer un trabajo de búsqueda binaria e imprimirlo en orden

¿Es cierto que dado cualquier gráfico con N vértices es un subgrafo inducido del subconjunto gráfico (N). ¿Cómo puedes probarlo o refutarlo?

Cómo explicar el concepto de un algoritmo a un niño

¿Por qué mi método de generador aleatorio no funciona en Java?

En un gráfico no dirigido, ¿cuál es el grado de un vértice con un bucle automático?

¿Cuál es el mejor algoritmo de detección de colisión de vehículos?

Cómo llegar a la lógica para construir un método de impresión inversa que imprima los nodos en una lista vinculada usando un enfoque recursivo usando Java

¿Por qué alguien no puede encontrar un algoritmo para la detección de imágenes que funcione mejor que SIFT (Scale Invariant Feature Transform)? ¿De dónde viene exactamente el problema?

Mientras practico la programación, muchas veces no puedo escribir código para un algoritmo o pseudocódigo, incluso después de entender el algoritmo claramente en papel. ¿Cómo supero este problema?

¿El mismo algoritmo pertenece a algo, incluyendo política, mecánica cuántica, arte, deportes e ingeniería?

¿Qué es el algoritmo k-Nearest Neighbour? ¿Qué tipo de problemas puede resolver este algoritmo? ¿Qué tipo de matemática se requiere?