jueves, 21 de febrero de 2013

Actividad 2 - Algoritmo Paralelo (QuickSort)

Una de las más importantes utilidades de los multi-computadores es su uso en la computación algorítmica para obtener velocidad y eficacia. Se propone el diseño e implementación de un algoritmo paralelo que implemente las metodologías de Divide y Vencerás aplicado al QuickSort.
Divide y Vencerás 
La estrategia Divide y Vencerás consiste en descomponer un problema en subproblemas más simples del mismo tipo, resolverlos de forma independiente y una vez obtenidas las soluciones parciales combinarlas para obtener la solución del problema original. 


QuickSort
El ordenamiento rápido (quicksort en inglés) es un algoritmo creado por el científico británico en computación C. A. R. Hoare basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.(fuente)

El algoritmo trabaja de la siguiente forma:
  • Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
  • Re-situar los demás elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que él, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementación deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponderá en la lista ordenada.
  • La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
  • Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.
Como se puede suponer, la eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.
  • En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos sublistas de igual tamaño. En este caso, el orden de complejidad del algoritmo es O(n·log n).
  • En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de O(n²). El peor caso dependerá de la implementación del algoritmo, aunque habitual mente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero principal mente depende del pivote, si por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento del array, y el array que le pasamos está ordenado, siempre va a generar a su izquierda un array vacío, lo que es ineficiente.
  • En el caso promedio, el orden es O(n·log n).
No es extraño, pues, que la mayoría de optimizaciones que se aplican al algoritmo se centren en la elección del pivote.
La implementación del método Divide y Vencerás sobre el algoritmo de QuickSort, quedaría representada por la siguiente imagen:


Donde: 

  1. Tendremos un arreglo de números inicial.
  2. Seleccionaremos el primer número de la lista el cual sera nuestro pivote.
  3. Un nuevo proceso acomodara los números menores al pivote en un nuevo arreglo y los mayores al pivote en otro arreglo.
  4. Crearemos nuevos procesos para los siguientes arreglos, siguiendo esta metodología hasta llegar a las "hojas" de nuestro árbol.
  5. Al terminar, los procesos devolverán su correspondiente resultado ya ordenado al proceso principal el cual únicamente los acomodara y dará un resultado.
En la práctica, este algoritmo se maneja de forma iterativa, nosotros buscamos mejorar el tiempo de respuesta en este de por si rápido algoritmo de ordenamiento por medio de la paralelización.


2 comentarios: