Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Diseño de algoritmos
• Es una labor creativa.
3.- Combinar las soluciones obtenidas en el paso anterior para construir la solución del
problema original.
Características deseables
• Los subproblemas deben ser independientes, es decir, que no exista traslape entre
ellos. De lo contrario, el tiempo de ejecución de estos algoritmos será exponencial.
• El reparto de la carga entre los subproblemas, debe ser de forma equilibrada, las
operaciones que descomponen el problema en otros más sencillos y las operaciones
que combinan las soluciones parciales deben ser bastante eficientes.
• El número de subproblemas que se generen no debe ser grande.
EJEMPLOS DE DIVIDE Y VENCERÁS
Las torres de Hanoi
• Consiste en pasar los discos, uno por uno (o uno a la vez), del poste A, al poste B con la condición de no poner
un disco más grande sobre otro más pequeño.
• Se puede utilizar el poste C como auxiliar. http://www.softschools.com/games/logic_games/tower_of_hanoi/
Figura 1
EJEMPLOS DE DIVIDE Y VENCERÁS
• Si intentamos describir la solución del problema para una torre de 4 o más discos, la
descripción resultaría muy complicada, sin embargo, si aplicamos el enfoque de
divide y vencerás, entonces la solución es mucho más clara.
• El problema de pasar los n discos más pequeños de A a B se reduce a lo siguiente:
considerar el problema como dos problemas de tamaño n-1. Primero se mueven los
n-1 discos más pequeños del poste A al C, dejando el n-esimo disco en el poste A. Se
mueve este disco de A a B y, finalmente se mueven los n-1 discos más pequeños de
C a B. El movimiento de los n-1 discos más pequeños se efectuará por medio de la
aplicación recursiva del método, pero utilizando el poste no ocupado como auxiliar.
EJEMPLOS DE DIVIDE Y VENCERÁS
• En la Figura se ilustra como pasar los n-1 discos al poste auxiliar C, de tal forma que el disco más
grande queda libre para ponerlo hasta abajo del poste B.
• En la Figura 2 se ilustra el paso del disco más grande al poste B. Ahora, el problema se reduce a pasar
los n-1 discos del poste C al B, lo cual se hace de manera similar a la secuencia presentada en la
Figura 1.
Figura 2
EJEMPLOS DE DIVIDE Y VENCERÁS
• La solución es sencilla de entender con este enfoque, aunque se complica al llevarla a la práctica
conforme aumenta el número de discos a mover de A a B. El tiempo de ejecución de este algoritmo
es el siguiente.
• El tiempo de ejecución T(n) para pasar n discos del poste A al poste B es la suma del tiempo T(n-1)
para pasar n-1 discos de A a C, más el tiempo T(1) para pasar el disco n a B, más el tiempo T(n-1)
para pasar los n-1 discos de C a B. El caso base se presenta cuando solo hay que mover un disco.
EJEMPLOS DE DIVIDE Y VENCERÁS
• El funcionamiento de los algoritmos que siguen la técnica de Divide y Vencerás descrita
anteriormente se refleja en el esquema general que presentamos a continuación:
EL MÉTODO MERGESORT (ORDENAMIENTO POR MEZCLA, FUSIÓN)
• Es una aplicación clásica de la estrategia para resolución de algoritmos "divide y vencerás".
• Se basa en la idea de que secuencias ordenadas se pueden unir (o hacerles un merge) en tiempo
lineal.
• Se van separando los arreglos hasta llegar a pedazos de longitud 2, que se pueden ordenar fácilmente.
• Su desventaja es que trabaja sobre un array auxiliar lo cual tiene dos consecuencias:
Uso de memoria extra y trabajo extra consumido en las copias entre arreglos (aunque es un trabajo
de tiempo lineal).
EL MÉTODO MERGESORT
Primera Etapa
• La primera etapa consiste en dividir el problema hasta llegar a un tamaño que resulta más fácil de
resolver
EL MÉTODO MERGESORT
Segunda Etapa
• Luego se va armando (combinando) los resultados parciales
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Código del Algoritmo
EL MÉTODO MERGESORT
Análisis del ordenamiento
• El ordenamiento por mergesort es un ejemplo clásico de las técnicas usadas para analizar programas
recursivos.
• Asumimos n es potencia de 2 de modo que siempre dividimos la entrada en dos mitades. Para n = 1
el tiempo es constante, luego lo denotaremos por 1.
• En otro caso el tiempo de ordenar n números es igual al tiempo de realizar dos ordenamientos
recursivos de tamaño n=2, más el tiempo de fusión que es lineal.
EL MÉTODO MERGESORT
Análisis del ordenamiento
• El ordenamiento por mergesort es un ejemplo clásico de las técnicas usadas para analizar programas
recursivos.
• Asumimos n es potencia de 2 de modo que siempre dividimos la entrada en dos mitades. Para n = 1
el tiempo es constante, luego lo denotaremos por 1.
• En otro caso el tiempo de ordenar n números es igual al tiempo de realizar dos ordenamientos
recursivos de tamaño n=2, más el tiempo de fusión que es lineal.
EL MÉTODO QUICKSORT
• Es el algoritmo de ordenación ascendente de elementos de un arreglo más rápido
(en la práctica) conocido.
• Su tiempo de ejecución promedio es O(N log(N)).
• Para el peor caso tiene un tiempo O(N^2), pero si se codifica correctamente las
situaciones en las que sucede el peor caso pueden hacerse altamente improbables.
• En la práctica, el hecho de que sea más rápido que los demás algoritmos de
ordenación con el mismo tiempo promedio O(N log(N)) está dado por un ciclo
interno muy ajustado (pocas operaciones).
• Al igual que el algoritmo de ordenación por intercalación (mergesort), el algoritmo
de ordenación rápida es fruto de la técnica de resolución de algoritmos "divide y
vencerás".
• Se basa en cada recursión, dividir el problema en subproblemas más pequeños,
resolverlos cada uno por separado (aplicando la misma técnica) y unir las soluciones.
EL MÉTODO QUICKSORT
Pasos para la implementación
Ejemplo 2: Implementación
EL MÉTODO QUICKSORT
Análisis eficiencia de algoritmo quicksort
• La eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.
• Coste en tiempo en el caso mejor. El coste en este caso es (n log n) y corresponde a remplazar k por n/2 en la
recurrencia anterior. En este caso estaríamos dividiendo el vector en dos subvectores del mismo tamaño e
intuitivamente es la forma más rápida de ordenar el vector.
• Coste en tiempo en el caso promedio. El coste en este caso es (n log n). Para calcularlo se ha de suponer una
distribución de probabilidad de las entradas. Es común suponer en este caso que todas las permutaciones del vector
de entrada son equiprobables y que por tanto todos los elementos tienen igual probabilidad (1/n) de ser el pivote.
• Coste en tiempo en el caso peor. El caso peor de quick–sort sucede cuando el vector de entrada est´a ordenado
creciente o decrecientemente. En este caso se divide el vector en un subvector de tamaño 1 y otro de tamaño n −
1. Intuitivamente parece que que no estamos reduciendo suficientemente el tamaño del problema pues hemos de
ordenar un vector casi del mismo tamaño del original. Reemplazando este valor de k (k = 1) en la recurrencia
anterior puede verse que el coste en este caso es (n^2).
EL MÉTODO QUICKSORT
Análisis eficiencia de algoritmo quicksort
• La mejor forma de ilustrar y calcular la complejidad del algoritmo es considerar el número de comparaciones
realizadas teniendo en cuenta circunstancias ideales.
• Supongamos que n (número de elementos de la lista) es una potencia de 2, n = 2^k (k = log2 n).
• Supongamos que el pivote es el elemento central de cada lista, de modo que quicksort divide la sublista en dos
sublistas aproximadamente iguales.
• En la primera exploración o recorrido hay n − 1 comparaciones. El resultado de la etapa crea dos sublistas
aproximadamente de tamaño n/2.
• En la siguiente fase, el proceso de cada sublista requiere aproximadamente n/2 comparaciones. Las comparaciones
totales de esta fase son 2(n/2) = n.
• La siguiente fase procesa cuatro sublistas que requieren un total de 4(n/4) comparaciones, etc.
• Eventualmente, el proceso de división termina después de k pasadas cuando la sublista resultante tenga tamaño 1.
• El número total de comparaciones es aproximadamente:
EL MÉTODO DE BÚSQUEDA BINARIA
• El algoritmo de búsqueda binaria es un ejemplo claro de la técnica divide y vencerás, se utiliza
para búsquedas en el diccionario o en un directorio telefónico.
• Se requiere que los elementos dentro del arreglo en donde se hará la búsqueda se encuentren
ordenados, ya sea de manera ascendente o descendente.
• El algoritmo recursivo tiene un tiempo de ejecución mayor que el de los no recursivos, aunque
del mismo orden O(log(n)). Además tiene mayor complejidad espacial, debido a que requieren
más memoria (para guardar la pila de recursión).
EL MÉTODO DE BÚSQUEDA BINARIA
Enfoque recursivo: