18

Divide y Vencerás

Embed Size (px)

DESCRIPTION

Apuntes de Algoritmia sobre el esquema "Divide y vencerás" con ejemplos típicos explicados

Citation preview

Page 1: Divide y Vencerás

Chapter �

Divide � Conquer

��� Divide � Conquer

En este m�odulo vamos a estudiar una t�ecnica muy poderosa para el diseniode algoritmos conocida por la frase �Dividir para conquistar�� Los algoritmosde este tipo se caracterizan por estar diseniados siguiendo estrictamente lassiguientes fases�

� Dividir Se divide el problema en partes mas pequenias�

� Conquistar Se resuelven recursivamente los problemas mas chicos�

� Combinar Los problemas mas chicos se combinan para resolver el grande�

Los algoritmos que utilizan este principio son en la mayor�ia de los casos net�amente recursivos� La t�ecnica es sumamente �util� hay muchos problemas paralos cuales aplicar un algoritmo de tipo Divide � Conquer permite resolver elproblema en forma mas sencilla y e�ciente�

��� Merge Sort

El algoritmo de Merge Sort es un ejemplo cl�asico de algoritmo que utiliza elprincipio de dividir para conquistar� El algoritmo permite ordenar un vectoren forma mas e�ciente que los m�eodos de sort vistos hasta el momento como elburbujeo y el sort por inserci�on� Si el vector tiene mas de dos elementos se lodivide en dos mitades� se invoca recursivamente al algoritmo y luego se hace unmerge de las dos mitades ordenadas�

Page 2: Divide y Vencerás

Algorithm � MergeSort�A�p�r�� Ordena un vector desde p hasta r�

if p � r thenq � �p� r���MergeSort�A�p�q�MergeSort�A�q���r�Merge�A�p�q�r�

end if

El tiempo que insume este algoritmo queda de�nido por la siguiente recurren�cia�

T �n� �

�� si n � ��T �n� � � ��Merge� sino

�Para calcular la recurrencia necesitamos el algoritmo que realiza el merge�

An�alisis del algoritmo Merge Puede verse claramente que el algoritmo demerge requiere de dos pasadas a los vectores a mergear� una para realizar elmerge y otra para copiar del vector auxiliar al vector original� El tiempo delalgoritmo de merge es T �n� � �n por lo tanto�

Merge � T �n� � ��n�

� Por lo que la recurrencia del algoritmo de MergeSort es�

T �n� �

�� si n � ��T �n� � � n sino

Esta es una recurrencia conocida� Aplicando el teorema maestro podemos ob�tener que MergeSort � ��n logn� Lo cual mejora el orden de los algoritmos desort que habiamos estudiado que es cuadr�atico�

Page 3: Divide y Vencerás

Algorithm �� Merge�A�p�q�r�� Mergea A�p�q� �� A�q���r�

�� Usamos el array auxiliar B�p�r� ��int B�p�r�i� k� pj � q � �while i q and j r doif A�i� A�j� thenB�k� � A�i�i� i� �

elseB�k� � A�j�j � j � �

end ifk � k � �

end while�� Copiamos elementos que quedaban de la parte izquierda ��while i q doB�k� � A�i�i� i � �k � k � �

end while�� Copiamos elementos que quedaban de la parte derecha ��while j r doB�k� � A�j�j � j � �k � k � �

end while�� Copiamos desde el vector auxiliar ��for i � p to r doA�i� � B�i�

end for

Page 4: Divide y Vencerás

����� Propiedades

El algoritmode MergeSort es un algoritmode sort que presenta algunas propiedadesinteresantes� En primer lugar el orden del algoritmo es ��n logn�� y esto ocurretanto en el peor caso� como en el mejor caso� como en el caso medio ya que eltiempo que insume el algoritmo no depende de la disposici�on inicial de los ele�mentos del vector� En segundo lugar es un algoritmo que requiere de un espacioextra de almacenamiento para poder funcionar� A los algoritmos que realizanel sort dentro del vector mismo se los denomina algoritmos de sort �in�situ��Claramente el algoritmo de MergeSort no pertenece a esta familia�

����� Optimizaciones y trucos

El orden del algoritmo de MergeSort no se puede mejorar� lo que si podemoshacer es aplicar algunas mejorar para que los factores constantes que inciden enel tiempo que insume el algoritmo sean menores� Uno de los trucos mas utilizadosconsiste en evitar el tener que copiar todo el vector auxiliar en el original cadavez que se hace el procedimiento de Merge� Esto se logra utilizando dos vectoresde tamanio "n#� En los niveles pares de la recursi�on Mergeamos desde A haciaB� En los niveles impares mergeamos desde B hacia A� Si la cantidad de niveleses en total impar hacemos una copia de mas para volver a tener los datos en elvector original pero lo que se ahorra es siempre mas de este gasto extra�

Otra mejora habitual consiste en no aplicar MergeSort si el tamanio del vectores mas chico que un n�umero constante de elementos� por ejemplo ��� en ese casose aplica un sort por inserci�on o cualquier otro� Como la cantidad de elementoses constante esto solo agrega una cantidad constante de tiempo al algoritmo yen general permite obtener una mejora en el rendimiento�

Un detalle importante del algoritmo de MergeSort es el siguiente� En el pro�ceso de Merge debido a comparamos A�i� A�j� tenemos como consecuenciaque cuando los elementos son iguales copiamos desde la lista izquierda primeroy luego desde la derecha� Podr�iamos haber copiado desde la derecha primeroy el resultado ser�ia el mismo ya que si los n�umeros o lo que sea que estamosordenando son iguales o tienen la misma clave no importa en que orden aparecenen el vector ordenado� Sin embargo frecuentemente ordenamos un conjunto dedatos por mas de una clave� si los elementos del vector ya estaban ordenadospor alguna otra clave es importante que al ordenarlo por otra clave cuando lanueva clave es igual mantengamos el orden de la clave anterior� Esto se lo�gra precisamente copiando primero de la parte izquierda del vector al mergear�A los algoritmos de sort que preservan el orden original de los elementos quetienen claves iguales se los denomina estables� La estabilidad es una propiedadbastante deseable en los algoritmos de sort�

Por ultimo es conveniente analizar s�i es posible implementar el algoritmode MergeSort "in�situ#� es decir sin utilizar espacio auxiliar de memoria� La

Page 5: Divide y Vencerás

respuesta es que si es posible pero nadie sabe como hacerlo sin destruir porcompleto la e�ciencia del algoritmo�

����� Resumen MergeSort

� T �n� � ��n logn�� Mejor� peor y caso medio son iguales�

� Es estable�

� Requiere de un vector auxiliar para realizar el sort�

��� El problema de la selecci�on

Supongamos que tenemos un vector A de tamanio n originalmente desordenado�De�nimos el rango de un elemento del vector como la posici�on que el elementoocupar�ia si el vector estuviese ordenado� De esta forma el elemento mas chicotiene rango �� el segundo rango �� etc� Aunque no afecta en absoluto la res�oluci�on del problema supongamos tambien que todos los elementos del vectorson distintos entre si� El problema de la selecci�on consiste en encontrar el ele�mento cuyo rango es k� En particular a veces interesa obtener el elemento cuyorango es k � n

� que es la mediana del conjunto de datos� A este problema se losuele llamar tambien problema de la mediana�

El problema de la selecci�on puede resolverse en forma super�sencilla ordenandoel vector A y devolviendo A�k�� Como vimos hasta el momento esto puedehacerse en ��n logn�� Sin embargo podemos conjeturar que ordenar el vectorno es del todo e�ciente porque obtenemos todos los rangos cuando en realidadsolo nos interesa uno en particular� Intuitivamente la soluci�on usando sort esine�ciente� Queremos encontrar un algoritmo que nos permita encontrar elelemento cuyo rango es k en tiempo menor que ��n logn�� Como veremos lasoluci�on a este problema no es para nada trivial�

����� Cribas � � �

Hemos introducido este problema debido a que presenta un caso muy particulardentro de los algoritmos de tipo Divide and Conquer� En los algoritmos Divideand Conquer dividimos el problema en m problemas mas chicos para luegoresolverlos y combinar las soluciones de ambos� Una criba se presenta cuandom � �� Las cribas se aplican a problemas en los cuales estamos interesados enobtener un elemento determinado dentro de un conjunto de elementos de tamanion� Este tipo de algoritmos trabaja eliminando un cierto conjunto de elementosdel conjunto sabiendo que ninguno de ellos es el elemento buscado� el algoritmose aplica recursivamente hasta que queda un �unico elemento en el conjunto� elelemento buscado�

Page 6: Divide y Vencerás

El algoritmo que vamos a describir funciona de la siguiente manera� Recibeun vector A�dos numeros p y r que indican desde donde hasta donde buscar en elvector �inicialmente p � � y r � n� y un numero k que es el rango que queremosencontrar en el vector� El algoritmo selecciona un elemento del vector que sedenomina pivot �p�� decidir cual es el pivot es importante� pero por el momentosupongamos que el pivot es elegido de alguna manera� Luego particiona el vectoren tres partes� A�p��q��� contiene todos los elementos menores que el pivot� A�q�es el pivot� A�q����r� contiene todos los elementos mayores que el pivot� Dentrode los vectores A�p��q��� y A�q����p� los elementos pueden estar en cualquierorden� El ranking del pivot en cualquier fase del algoritmo es q � p � �� sik � q � p � � entonces el pivot es el elemento buscado� Si k � q � p � �aplicamos el algoritmo recursivamente a A�p��q��� si k � q�p� � aplicamos elalgoritmo recursivamente a A�q����p�� esto queda ejempli�cado en la ilustraci�on�

Notemos que el algoritmo satisface los principios que enunciabamos sobre unacriba� elimina ciertos elementos y luego se invoca recursivamente con el resto�Cuando el pivot es el buscado tenemos suerte y eliminamos todos los dem�aselementos� sino seguimos buscando� Tenemos a�un que resolver el problema de

Page 7: Divide y Vencerás

Algorithm � Seleccion��A�p�r�k�� Selecciona de A�p��r� el "k#esimo elemento

if p � r thenreturn A�p�

elsex� ElegirP ivot�A� p� r�q � Particionar�A� p� r� x�xrank � q � p� qif k � xrank then

return xelseif k � xrank then

return Seleccion��A�p�q���k�else

return Seleccion��A�q���r�k�q�end if

end ifend if

seleccionar el pivote y ademas el de particionar el vector� Supongamos por elmomento que ambas cosas pueden hacerse en ��n�� Nos queda por averiguarque tan e�ciente es nuestra criba� es decir cuantos elementos eliminamos cadavez� Si el pivote es el elemento mas chico o mas grande del vector eliminamossolamente un elemento� el mejor caso ocurre cuando el pivot es un elementomuy cercano al medio en cuyo caso eliminamos la mitad del vector y podemosescribir la siguiente recurrencia�

T �n� �

�� si n � �T �n� � � n sino

Resolviendo por el teorema mestro tenemos que el algoritmo es ��n�� es decirque en el mejor caso insume una cantidad de tiempo lineal� Si el pivot queelegimos es malo de todas formas el algoritmo se va a mantener dentro del ordenlineal� por ejemplo�

T �n� � � si n � �

T �n� � T ���n

���� � n sino

Tambien da como resultado ��n�� por lo tanto podemos decir que el algoritmoes ��n�

����� Eligiendo el pivote

Como vimos aun eligiendo el pivote malamente el algoritmo tiende a ser lineal�sin embargo cuanto mejor elijamos el pivote mejor va a funcionar� Otra de lascosas que sabemos es que el pivote debe ser elegido en ��n� para que valga larecurrencia que hab�iamos planteado anteriormente�

Page 8: Divide y Vencerás

Como garantizar un buen pivote Uno de los problemas mas duros enel algoritmo de selecci�on consiste en encontrar un pivote de forma tal quepodamos asegurar que el pivote seleccionado siempre funcionar�a relativamentebien� Floyd� Tarjan� Pratt y Rivest encontraron un algoritmo que garantiza quen� q n� � lo cual es mas que su�ciente para aseverar la validez del pivote�

El algoritmo de Floyd�Pratt�Rivest�Tarjan

Primer paso� dividir en grupos de En primer lugar se particiona elvector en grupos de elementos� Por ejemplo A������A��������A��������etc� Lacantidad de grupos es m � dn� e Todos los grupos tendran elementos salvo el�ultimo que puede tener menos� Esto puede hacerse facilmente en tiempo ��n��

Segundo paso� computar la mediana de cada grupo En segundo lugarse computa la mediana de cada grupo� Como todos los grupos tienen tamanioconstante� no necesitamos un algoritmo e�ciente para encontrar la mediana�podemos aplicar burbujeo a cada grupo y luego elegir el elemento del medio decada vector ordenado� Esto tarda una cantidad de tiempo constante ���� y serepite m � dn� e veces� por lo tanto este paso insume tiempo ��n�� Una vezcalculadas las m medianas se las copia a un vector auxiliar B�

Tercer paso� Hallar la mediana de las medianas El tercer paso consisteen hallar la mediana de las m medianas anteriores� para esto tenemos que llamaral algoritmo Seleccion� en forma recursiva de la forma Seleccion��B� ��m� k�donde m � dn� e y k � bm�

� c� El elemento resultante� la mediana de medianases el que se elige como pivot� Debemos demostrar ahora que el pivot no dejamenos de n� elementos a izquierda o derecha de el�

Teorema El rango del pivote x es por lo menos n� o a lo sumo n� en elvector A

Demostraci�on Vamos a probar que el rango de x es por lo menos n� � la otraparte es exactamente sim�etrica� Para demostrar esto tenemos que probar quehay al menos n� elementos menores que x� Para evitar problemas causados porlas funciones piso y techo supongamos que n el tamanio del vector es multiplode de forma tal que m � n�� Debido a que x es la mediana de las medianaspodemos a�rmar que por lo menos la mitad de las medianas de los gruposson menores o iguales que x� Y en cada grupo de medianas �de tamanio �hay tres elementos que son menores o iguales a su mediana� Por lo tanto hay��n����� � n��� � n� elementos que son menores o iguales a x en elvector� La ilustraci�on permite entender esta demostraci�on en forma mas simple�

Page 9: Divide y Vencerás

An�alisis de algoritmo Aplicando el algoritmo de Floyd�Rives�Tarjan�Prattpara calcular el pivote sabemos que por lo menos eliminamos a �� de los elemen�tos en cada llamada� sin embargo tenemos que recalcular el orden del algoritmo�La llamada recursiva a Seleccion��� � �� se hace para no mas de n� elementos�pero para lograr esto dentro de ElegirP ivote tenemos que volver a llamar aSeleccion��� � �� para el vector B �el que tiene las medianas de los grupos de �y sabemos que B tiene n� elementos� Todo lo demas como hemos mostrado sehace en ��n�� El tiempo que insume el algoritmo lo podemos calcular resolviendola siguiente recurrencia�

T �n� �

�� si n � �T �n�� � T �n� � � n sino

Esta es una recurrencia realmente rara que involucra una mezcla de fracciones�n�� y �n� �� Por lo que resulta imposible aplicar el teorema maestro� elm�etodo iterativo es tambien de resoluci�on compleja por lo que sabiendo quepretendemos que el algoritmo sea lineal vamos a tratar de aplicar el metodo desutituci�on para demostrarlo�

Teorema� Existe una constante c tal que T �n� n�

Demostraci�on por inducci�on en n Sea n � �� T �n� � ��por lo tantoT �n� cn si c � �

Page 10: Divide y Vencerás

Hip�otesis inductiva� T �n�� cn� para n� � nQueremos probar que T �n� cnPor de�nicion sabemos que T �n� � T �n�� � T �n� � � nComo n� y n� son ambos menores que n podemos aplicar la hip�otesis

inductiva obteniendo�

T �n� cn

� c

n

� n � cn�

� � n

T �n� cn��

��� n � n�

��c

��� ��

Por lo tanto c ���c������ Despejando c vemos que se cumple para c � ���Como necesitabamos c � � y ahora necesitamos c � ��� Podemos decir que conc � ��� T �n� cn Por lo que queda demostrado�

A prop�osito� Esta demostraci�on era un ejercicio de uno de los apuntes an�teriores� espero que la resoluci�on sea igual o muy parecida a la planteada porUd�

Algunos podran preguntarse porque el algoritmode F loyd� etc � � � utiliza gruposde elementos� ocurre que por la demostraci�on anterior el algoritmo funcionapara n � y por eso eligieron n � �

����� Particionando

El otro problema que nos restaba resolver sobre el algoritmo �Seleccion��� escomo particionar el vector una vez elegido el pivote� Este procedimiento lovamos a dejar para mas adelante ya que no hay tiempo ni espacio su�ciente enesta clase�

��� Problemas no tan simples� Como multiplicar

dos n�umeros

El problema de multiplicar dos n�umeros consiste en encontrar un algoritmo e��ciente que permita multiplicar dos n�umeros de gran cantidad de d�igitos� Estetipo de problema se presenta hoy en muchos algoritmos criptogr�a�cos o de gen�eraci�on de numeros aleatorios que deben resolver multiplicaciones entre numerosde muchos d�igitos� Sumar dos numeros no es problema ya que resulta sencillohacerlo en tiempo ��n�� Sin embargo el m�etodo tradicional para multiplicardos numeros que todos hemos aprendido en la escuela primaria insume tiempo��n��� queremos averiguar si no hay un algoritmo mas e�ciente� Sorprendente�mente dicho algoritmo existe�

Page 11: Divide y Vencerás

����� Dividir para conquistar la multiplicaci�on

Trataremos de aplicar el paradigma de Dividir para Conquistar al problema decomo multiplicar dos n�umeros para ver si podemos obtener un algoritmo quesea mejor que ��n���

Aplicando el paradigma de dividir para conquistar hacemos lo siguiente� seandos numeros A y B de n d�igitos cada uno �si tienen distinta cantidad de d�igitoscompletamos con ceros�� Dividimos el numeroA en sus n�� d�igitos mas signi�cativos�wy sus n�� d�igitos menos signi�cativos�x� Hacemos lo mismo con B obteniendoy y z� De acuerdo a la partici�on que hicimos sabemos que A � w � ��n�� � x yB � y � ��n�� � z� Una vez realizada la partici�on podemos realizar la multiplic�aci�on de acuerdo al siguiente esquema�

Como vemos podemos hacer el producto de la forma�

Seam � n��

mult�A� b� � mult�w� y����m � �mult�w� z� � mult�x� y����m � mult�x� z�

La operaci�on de multiplicar por ��m consiste simplemente en shiftear el n�umerom posiciones y por lo tanto no es realmente una multiplicaci�on� las sumas im�plican sumar numeros de n�� d�igitos y cuesta por lo tanto ��n� cada una�Podemos expresar entonces el producto entre dos n�umeros como productosde numeros de la mitad de d�igitos de los originales mas una cantidad constantede sumas y shifts de costo ��n�� Por lo tanto el costo del algoritmo se puede

Page 12: Divide y Vencerás

calcular a partir de la siguiente recurrencia�

T �n� �

�� si n � � T �n� � � n sino

Aplicando el teorema maestro vemos que a � b � � k � � y a � bk por lo queestamos en el caso uno y el orden es ��nlog �� � ��n��� Desafortunadamenteno hemos podido� aun� mejorar el algoritmo� Pese a no haber podido mejorar elalgoritmo podemos apreciar un detalle importante� la parte cr�itica del algoritmoes la cantidad de multiplicaciones de n�umeros de tamanio n��� El numero desumas� siempre y cuando sea constante� no afecta el orden del algoritmo� Porlo tanto nuestro objetivo va a ser reeemplazar algunas multiplicaciones por unacantidad constante de sumas� Obviamente no podemos multiplicar mediantesumas sucesivas puesto que la cantidad de sumas depender�ia de n y no ser�iaconstante�

����� El m�etodo de Gauss

La clave para mejorar el algoritmo reside en un truco algebraico descubierto porGauss� Gauss encontro lo siguiente�

C � mult�w� y�

D � mult�x� z�

E � mult��w�x�� �y�z���C �D � �wy�wz�xy�xz��wy�xz � �wz�xy�

Finalmente tenemos

mult�A�B� � C � ���m �E � ��m �D

En total hacemos multiplicaciones� sumas y � restas de n�umeros de n��digitos� ademas se requieren algunos corrimientos� El tiempo del algoritmoaplicando el truco de Gauss es el siguiente�

T �n� �

�� si n � �T �n��� � n sino

�Aplicando el teorema maestro nuevamente tenemos a � � b � � y k � �� Locual nos da T �n� � ��nlog �� ��n�������

Debemos analizar si esto es realmente una mejora� Este algoritmo arrastra unacantidad grande de factores constantes como el overhead debido a la recursi�on ylas operaciones aritm�eticas adicionales� pero debido a nuestros conocimientos delorden de los algoritmos sabemos que a partir de un cierto n el nuevo algoritmoser�a mejor ya que el tradicional tiene una tasa de crecimiento mayor� Por ejemplosi suponemos que en el algoritmo de Gauss las constantes son veces mayoresque en el algoritmo simple tenemos �n����� versus n��� y el n a partir del cualGauss es mejor es �� si las constantes fuesen �� veces mayores tendriamosn � ���� En de�nitiva en general para multiplicar n�umeros de gran cantidadde d�igitos el algoritmo mejorado resulta superior�

Page 13: Divide y Vencerás

��� El problema de los puntos mas cercanos� Se gunda parte

El problema de los n�umeros mas cercanos en el plano� recordemos consist�ia endado un conjunto de puntos encontrar la pareja de puntos tal que su distanciaes m�inima�

Para este problema dispon�iamos de una soluci�on iterativa de orden ��n���tal vez podamos aplicar nuestros conocimientos en algoritmos de tipo Dividirpara Conquistar para resolver el problema en forma mas e�ciente�Tenemos queaplicar las tres fases del paradigma� dividir� conquistar y combinar�

Dividir� Recordemos que los puntos se suponian almacenados en un vectorP � Si P contiene pocos puntos� entonces simplemente aplicamos el algoritmo defuerza bruta iterativo que conoc�iamos gasta el momento �Tarda una cantidad detiempo constante�� Si hay mas de n puntos entonces trazamos una linea vertical lque subdivide la listaP en dos conjuntos de aproximadamente el mismo tamanio�P l y Pr�

Conquistar� Recursivamente aplicamos el procedimiento en ambas lisas� porlo que obtenemos �l y �r distancias m�inimas para los dos conjuntos� De ambasdistancias obtenemos � � min��l � �r��

Combinar� Lamentablemente � no no es el resultado �nal� ya que podr�iadarse que la linea l que hemos elegido pasa justo entre los dos puntos que estana distancia m�inima� Debemos chequear si no hay dos puntos� uno a cada lado

Page 14: Divide y Vencerás

de la l�inea� cuya distancia sea menor a �� En primer lugar observemos que nonecesitamos chequear todos los puntos� si un punto esta a mayor distancia del que � entonces seguro no hay un vecino del otro lado de la l�inea que puedaformar una distancia menor que �� Creamos una lista P � de puntos que est�an amenos de � de cada lado de l� Determinamos entonces la distancia m�inima paralos puntos de P � que llamaremos �� y devolvemos el m�inimo entre � y �� comoresultado� En realidad no devolvemos la distancia sino los dos puntos que estana dicha distancia uno del otro�

El problema consiste en analizar como encontrar la distancia m�inima en P ��lo cual requiere un poco de astucia� Para optimizar el algoritmo queremosencontrar la distancia m�inima en P � en tiempo ��n� vamos a demostrar que estopuede hacerse suponiend que los puntos de P � estan ordenados por la coordenaday� luego tendremos que resolver como ordenar los puntos�

Supongamos que los puntos de P � estan ordenados de acuerdo a su coordenaday� Consideremos un punto P ��i� en la lista ordenada� Cual es el punto mascercano a P ��i�� Podemos restringir la busqueda a los puntos que tienen �indicej mayor que i ya que el proceso lo vamos a hacer para todos los puntos �si elvecino mas cercano esta arriba� entonces esto ya fue analizado cuando buscamosel vecino de dicho punto�� Podr�iamos pensar que necesariamente el vecino mascercano es P ��i � ��� pero esto no es verdad� dos puntos que tienen distanciam�inima en cuanto a la coordenada y no necesariamente tienen distancia m�inimaen el plano� queremos saber que tan lejos tenemos que buscar hasta P ��i � ����

��

Page 15: Divide y Vencerás

P ��i � ��� tal vez podamos acotar la b�usqueda a una cantidad constante depuntos�

Resulta que podemos limitar la cantidad de puntos a buscar y ademas resultaque no nos hace falta analizar mas de � puntos en la lista P � para cada punto�Esto lo vamos a tener que demostrar�

Teorema� Si P ��i� y P ��j� �i � j� son la dupla mas cercana en P � y la distanciaentre ellos es menor que �� entonces j � i ��

Demostraci�on� Supongamos que P ��i� y P ��j� son la dupla mas cercana enP � y su distancia es menor que �� Por estar en P � estan a distancia menor que� de l� Por ser su distancia menor que � sus coordenadas y di�eren en menosde �� Por lo tanto ambos puntos residen en un rectangulo de ancho �� y altura� centrado en la l�inea l� Dividamos este rect�angulo en � cuadrados del mismotamanio de lado ���� Observemos que la diagonal de cada uno de esto cuadradostiene como longitud�

�p

��

�p�� �

Como cada cuadrado esta completamente a un lado de la linea l ningun cuadradopuede contener dos puntos de P ya que si los tuviera entonces ambos puntosestar�ian a distancia menor que � y � no ser�ia la distancia m�inima entre lasdistancias m�inimas a ambos lados de P � Por lo tanto puede haber a lo sumo �puntos de P � en este rect�angulo y por lo tanto j � i ��

Por lo tanto por cada P ��i� solo debemos chequear una cantidad constante den�umeros y por eso podemos buscar la distancia m�inima en P � en O�n��

El �unico asunto que nos queda pendiente es como ordenar los puntos de P ��dado que queremos hacerlo en O�n� nos vemos impedidos de usar un algoritmode sort gen�erico que tardaria O�n logn� en general�

Hay una soluci�on ingeniosa a este problema� Pre�ordenar los puntos� Enparticular almacenamos los puntos �redundantemente� en dos listas PX y PYordenando por las coordenadas x y y respectivamente� Esto lo hacemos llamandoa un algoritmo de sort dos veces antes de comenzar el algoritmo de dividir yconquistar�

Ya no necesitamos la lista P � cuando hacemos el split de P en P l y Pr loque hacemos es dividir PX y PY en Xl� Xr� Y l� Y r respectivamente� Esto esfacil de hacer en O�n�� Dado que las listas originales estan ordenandas las listasresultantes tambien lo estan� Para armar la lista P � simplemente extraemos loselementos de Y que est�an a distancia � de l y luego los copiamos a la lista Y �

en donde luego buscamos�

��

Page 16: Divide y Vencerás

Resumiendo Este es un resumen del algoritmo� Esta version devuelve ladistancia m�inima� es sencillo aplicar los cambios pertinentes para devolver lospuntos a dicha distancia�

� Presort� Dada la lista P � hacemos dos copias PX y PY � OrdenamosPX por la coordenada x de los puntos y la lista PY por la coordenada y�

� Parte Recursiva� DistMin�X�Y�

� Condici�on de corte� Si la cantidad de puntos es menor que entonces resolvemos el problema por fuerza bruta y devolvemos ladistancia m�inima � analizando todas las distancias posibles�

� Dividir� Sino� sea l la mediana de las coordenadas x de PX� Divi�dimos ambas listas PX y PY por esta linea� manteniendo el orden�creando Xl� Xr� Y l� Y r�

� Conquistar� �l � DistMin�Xl�Yl�� �r � DistMin�Xr�Yr��

� Combinar� � � min��l � �r��Creamos la lista Y � copiando todos lospuntos de Y que estan a distancia menor que � de l� Para i desde �hasta la longitud de Y � y para j desde i � � hasta i � � calcular ladistancia entre Y ��i� y Y ��j�� Sea �� la distancia m�inima entre dichasdistancias� Devolver min��� ����

A partir de la descripci�on es f�acil programar el algoritmo�

����� An�alisis

Debemos analizar cuanto tiempo tarda el programa en su peor caso� en el casopromedio en an�alisis es muy complejo porque depende de cuantos puntos tieneP � en promedio y esto depende en cual es la distancia m�inima esperada en cadasublista� En el peor caso podemos suponer que P � tiene a todos los puntos� Lafase de pre�sort insume O�n logn�� Para analizar la parte recursiva planteamosla recurrencia�

T �n� �

�� si n �T �n��� � n sino

�Esta recurrencia ya es conocida y nos permite obtener que el algoritmo esO�n logn��

De esta forma obtenemos un algoritmo mas e�ciente que el algoritmo de fuerzabruta que era ��n���

��� Resumen y puntos clave

Wow!� estos fueron muchos de temas� El prop�osito de esta clase fue explicar unparadigma muy utilizado en el disenio de algoritmos� �Dividir para conquistar��mediante varios ejemplos hemos visto como en algunos casos este paradigma

��

Page 17: Divide y Vencerás

nos permite resolver un problema en forma e�ciente� La forma b�asica de unalgoritmo de tipo dividir para conquistar contiene los siguientes puntos�

� Condici�eon de corte� Controla en que momento se detiene la recurs�ividad� usualmente consiste en aplicar algun m�etodo no muy e�cientecuando el problema alcanza un tamanio chico�

� Dividir� Se divide el problema en n sub�problemas mas chicos�

� Conquistar� Aplicando recursivamente el algoritmo se resuleven los prob�lemas mas chicos�

� Combinar� Se combina la soluci�on de los problemas resueltos para en�contrar la soluci�on al problema original�

El algoritmo de MergeSort es un algoritmo de sort interno importante� queilustra claramente el paradigma�

El problema de la Seleccion o de la Mediana fue durante muchos anios de muydif�icil resoluci�on en forma e�ciente� el algoritmo que explicamos aqui permiteresolver el problema en forma e�ciente utilizando un algoritmo de tipo dividirpara conquistar� En este problema utilizamos una forma especial de algoritmos�Dividir para Conquistar� en la cual la cantidad de subproblemas es �� A estosalgoritmos se los conoce como cribas�

Otra aplicacion conocida del paradigma permite multiplicar dos numeros degran cantidad de d�igitos en forma mas e�ciente que el metodo tradicional� aquiutilizamos un truco algebraico sugerido por Gauss para reducir el numero demultiplicaciones que debiamos realizar�

Por ultimo vimos como pudimos aplicar este paradigma al problema de en�contrar los puntos a distancia m�inima en un plano en forma mas e�ciente quenuestra soluci�on anterior�

��� Ejercicios

�� Dado un vector A de n numeros encontrar un algoritmo que permita en�contrar el elemento mayoritario en A� es decir aquel que aparece con mayorfrecuencia en el vector�

�� Una compania petrolera ha construido n torres de extracci�on de petroleo enla patagonia� la compania desea construir un oleoducto de direcci�on Norte�Sur que permita trasnportar el petroleo extraido por las torres� Para esteproblema vamos a suponer que el oleoducto esta formado por una unicalinea recta� La empresa debe construir adem�as tramos perpendiculares aloleoducto que lleguen a cada torre� Describir un algoritmo que permita

Page 18: Divide y Vencerás

encontrar la mejor ubicaci�on para el oleoducto de forma tal de minim�izar la cantidad de kilometros a construir en tramos perpendiculares� Elalgoritmo debe ser lineal o mejor�

� El m�etodo de Floyd� Rivest� Pratt y Tarjan toma grupos de elementospara la selecci�on del pivote� Indicar que ocurrir�ia si se tomaran � o elementos para dicha selecci�on�

� Dados dos vectores X�n� y Y �n� ordenados dar un algoritmo de ordenO�logn� que permita calcular la mediana de los �n elementos en conjunto�