ej2 semana7

ej2 semana7

de Rocio Bernadet Sebben -
Número de respuestas: 1

Hola, quería consultar si con modificar B por 2B en la llamada  (r, L) = Merge-and-Count(A, 2B) ya quedaría el algoritmo de este ejercicio, ya que en realidad solo pide que devuelva la cantidad de inversiones, y no necesariamente la lista con los bj originales ordenados. Sino había pensando que podía modificar la condición en el if de merge-and-count, poner 2bj en vez de bj. Nose si voy encaminanda o no, muchas gracias!! El algoritmo completo:


Merge-and-Count(A,B)

 Maintain a Current pointer into each list, initialized to point to the front elements 

Maintain a variable Count for the number of inversions, initialized to 0 

While both lists are nonempty: 

Let ai and bj be the elements pointed to by the Current pointer

 Append the smaller of these two to the output list

 If bj is the smaller element then

 Increment Count by the number of elements remaining in A 

Endif 

Advance the Current pointer in the list from which the smaller element was selected. 

EndWhile

Sort-and-Count(L) 

If the list has one element then there are no inversions 

Else 

Divide the list into two halves: 

A contains the first n/2 elements

 B contains the remaining n/2 elements 

(rA, A) = Sort-and-Count(A)

 (rB, B) = Sort-and-Count(B) 

(r, L) = Merge-and-Count(A, 2B)

 Endif 

Return r = rA + rB + r, and the sorted list

En respuesta a Rocio Bernadet Sebben

Re: ej2 semana7

de Juan Pablo Martinez Delbugio -
Buenas Rocio, disculpá la demora, el problema en esta solución es que la cantidad de veces que multiplicás por 2 un número puede ser la misma que la cantidad de veces que multiplicás por 2 otro número a su derecha, y terminás contando inversiones comunes en lugar de inversiones significativas. Mirá el siguiente ejemplo con la secuencia [1,3,2,4] que no tiene inversiones significativas! (aunque sí una inversión común)

Primer llamada
-----A = [1, 3]
-----B = [2, 4]
-----Llamada recursiva para [1, 3]:
----------A = [1]
----------rA = 0
----------B = [3]
----------rB = 0
----------se llama Merge-and-Count([1], [6])
---------------retorna 0, [1,6]
----------se retorna 0, [1,6]
-----Llamada recursiva para [2, 4]:
----------A = [2]
----------rA = 0
----------B = [4]
----------rB = 0
----------se llama Merge-and-Count([2], [8])
---------------retorna 0, [2,8]
----------se retorna 0, [2,8]
-----queda (rA,A) = (0, [1,6]) y (rB,B) = (0, [2,8])
-----se llama Merge-and-Count de ([1,6], [4,16])
----------retorna 1
-----retorna 1

Si observás, el problema es que el 3 se multiplica por 2 (por estar en la parte derecha de un subproblema), y el 2 se multiplica por 2 una vez también, entonces te queda la inversión 6-4 (cuando vos esperabas que sólo se multiplicara el 2, y no hubiera inversión porque te quedaba 3-4)

Saludos,
JP