Div y Conquista: Contando Inversiones, Puntos en el Plano, Karatsuba & Puntos Extremos en Polígonos Flashcards
Explique el Problema de Contar Inversiones
Sean:
- Un conjunto de
n
elementos - Dos listas ordenadas de los
n
elementos
Queremos tener una medida de semejanza / diferencia entre las dos listas.
Contar Inversiones: Explique el concepto de Diferencias entre las Preferencias
Llamaremos A y B a las listas de preferencias.
Utilizaremos el orden de aparición de los elementos de A
para identificar las diferencias: 1, 2, ... , n
.
Por otro lado estará B, que posiblemente estará “fuera de órden”: 2, 1, 5, ... , n
.
Si B
está en orden, se dice que representa el mismo orden de preferencia que A
.
Explique qué se quiere saber en el problema de Contar Inversiones
Queremos saber qué tan lejos está B
de estar ordenada de forma ascendente.
Si bi < b(i + 1)
para todo i
, entonces A = B
.
Contar Inversiones: ¿En qué condiciones dos elementos están invertidos?
Dos elementos bi
, bj
con i < j
están invertidos si bi > bj
.
Contar Inversiones: ¿Qué complejidad tiene calcular la cantidad de inversiones con fuerza bruta?
Con fuerza bruta, calcular la cantidad de inversiones es O(n^2)
, porque se compara cada posición con todas las siguientes.
Contar Inversiones: ¿Cuál es la forma óptima de contar la cantidad de inversiones entre A y B?
La forma óptima es usando un merge sort, que alamacena la cantidad de inversiones necesarias para ordenar la lista B.
Explique el pseudocódigo para contar inversiones con Merge Sort
El código tiene dos partes:
ordenar_contar
merge_contar
- Para la función de
ordenar_contar
, tenemos:
a. Sea L el arreglo con los elementos de B b. L1 = primer mitad del arreglo L a procesar c. L2 = segunda mitad del arreglo L a procesar d. Llamar a la función `ordenar_contar` para L1. Devuelve r1 (#inversiones) y L1_ord, L1 ordenado. e. Llamar a la función `ordenar_contar` para L2. Devuelve r2 (#inversiones) y L2_ord, L2 ordenado. f. Llamar a la función `merge_contar` para L1_ord y L2_ord. Devuelve r (#inv) y L (ordenado). g. Devolver (r1+r2+r, L)
- Para la función de
merge_contar
, tenemos:
a. Un contador de inversiones y L una lista vacía b. Dos contadores i y j de posición para la lista A y B c. Mientras i < |A| y j < |B|: a = A en posición i b = B en posición j Si a > b: Guardar elemento a en la posición i+j de L i ++ De lo contrario: Guardar el elemento b en la posición i+j j++ inversiones += |A| - i d. Para los elementos entre i y |A| - 1: agregarlos a L[i+j] e inversiones +=|B|. e. Para los elementos entre j y |B| - 1: agregarlos a L[i+j]. f. Retornar la cantidad de inversiones y la lista L
¿Qué complejidad tiene Contar Inversiones con Merge Sort?
Cada problema de n
elementos se deivide en 2 subproblemas de n/2 elementos.
- La unión de los resultados se construye recorriendo los
n
elementos => O(n).
=> La relación de recurrencia es:
T(n) = 2 T(n/2) + O(n)
Usando el teorema maestro, nos queda T(n) = O(n logn)
Explique el problema de Puntos Más Cercanos en el Plano
Sean:
- P un conjunto de ´n´ puntos en el plano
-
d(p1,p2)
la función distancia entrep1
yp2
. - Queremos encontrar los puntos más cercanos en P.
Puntos Más Cercanos en el Plano: ¿Cuál es la complejidad por fuerza bruta?
Si quisiéramos solucionar esto por fuerza bruta, calcularíamos la distancia entre cada punto y el resto de ellos, y nos quedaríamos con los dos de menor distancia.
Teniendo n
puntos, la complejidad es O(n^2)
.
Puntos Más Cercanos en el Plano: ¿Cuáles son los preliminares a tener en cuenta?
Asumiremos:
- No existen puntos repetidos o que compartan coordenadas en
x
oy
. Cada apunto es único. - Existe
Px
, que almacena los puntos ordenados de acuerdo a la coordenadax
; yPy
, para hacer lo mismo con respecto a la coordenaday
.
Puntos Más Cercanos en el Plano: Explique la división en subproblemas.
Vamos a llamar Q al set de puntos que se encuentran en la mitad izquierda del eje x, y R al set de puntos que se encuentran en la mitad derecha.
- Para cada Q, calcularemos Qx y Qy.
- Para cada R, calcularemos Rx y Ry.
- Para cada punto q en Q y r en R, almacenaremos en qué posición aparece en Qx, Qy y Rx, Ry.
Esto podemos hacerlo en O(n) usando P, Px y Py.
Puntos Más Cercanos en el Plano: ¿Cómo se resuelve de forma recursiva? ¿Cuál es la complejidad? ¿Qué posible problema existe?
El problema base es un set de 2 o 3 puntos.
- Vamos a subdividir los problemas en 2 partes.
- Vamos a juntar los problemas comparando los pares de puntos retornados por cada subproblema, y quedándonos con el que tenga menor distancia.
La complejidad es de O(n logn).
Un posible problema es que la distancia mínima podría darse entre dos puntos de distintos espacios. Para esto debemos comparar los puntos de un lado con los del otro, lo cual nos da una complejidad de O(n^2), que es igual que la complejidad en fuerza bruta.
Puntos Más Cercanos en el Plano: Explique la Solución Eficiente con División y Conquista
Siendo n la cantidad de elementos, creamos Q con puntos de P de 1 hasta n/2 y R con puntos de P desde n/2 a n
- Llamamos
x*
a la coordenada más a la derecha en Q. - Llamamos L a la línea vertical en x*, tal que L separa a Q de R.
- Vemos que si la distancia mínima está entre un punto entre Q y R, entonces tiene que ser menor a δ.
δ = min (δq, δr). Ambos δq y δr son la distancia más chica entre dos puntos, en cada parte Q y R.
- Nos interesa conocer qué puntos S están a una distancia menor a δ de L. Podemos obtenerlos recorriendo P en O(n).
- Subdividimos el espacio en celdas de
δ/2 x δ/2
, tal que sólo puede existir un punto o ninguno en cada celda. - Como cada punto de S está en una celda, podemos comparar cada punto únicamente con otros puntos de S que estén en celdas cercanas. Recorriendo de menor a mayor en orden del eje y, comparo únicamente con las celdas que están hasta 3 filas más arriba que la actual (15 celdas en total).
Este proceso es O(n), en vez de ser un O(n^2). - Una vez que obtenemos el par de puntos del conjunto S que está a menor distancia, comparamos con δ:
a. Si es menor, devolvemos ese par de puntos.
b. Si no, devolvemos el mínimo entre δq y δr. - Se sigue de forma recursiva hasta que se alcanza el nivel más alto y se devuelve el par de puntos con menor δ para todo el plano.
Karatsuba: Explique el problema
Sean X e Y números enteros de n
bits cada uno, queremos calcular su multiplicación. La idea es mejorar la complejidad con el método tradicional (multiplicación bit a bit), que es O(n^2).