Análisis de Algoritmos
ANÁLISIS Y MEDICIÓN DE TIEMPO DE EJECUCIÓN DE ALGORITMOS DE ORDENAMIENTO Facultad de Ingeniería Ingeniería de Sistemas y computación Universidad Del Quindío Jorge Iván Cadavid Martínez 18400476 da_vinci7782@yahoo.es Julián Andrés Méndez Mora 18400762 juliandresmm@hotmail.com Abstract—En este laboratorio lo que se pretendía era tomar varios tipos de algoritmos de ordenamiento, tales como el método de la Burbuja, el método de la Burbuja Mejorado y el método de Búsqueda Binaria y analizar su rendimiento y tiempo de ejecución, extraer y analizar las graficas generadas por la maquina virtual de java (JVM) y determinar así cuales son los métodos y algoritmos óptimos para cada tipo de tarea específica.
Incluso en la misma máquina, el mismo algoritmo tarda algunas veces mucho más tiempo en dar el resultado que otras, debido a factores como el tiempo que consumen las otras aplicaciones que se están ejecutando, o si hay suficiente memoria RAM en el momento de ejecutar el programa. Nuestro objetivo es comparar sólo los algoritmos , intentando sacar conclusiones independientes de la máquina.
Palabras Claves—Análisis, Tiempo De Ejecución, Método de la burbuja, Método de la burbuja mejorado, búsqueda binaria. I.
INTRODUCCIÓN
E
n esta sección vamos a estudiar algunas formas de medir la eficiencia de nuestros programas en Java,vamos a estudiar la complejidad de las operaciones usuales y el tiempo de ejecucion de algunos algotirmos de ordenamiento. Medir de forma precisa este tiempo no es una tarea trivial, y los resultados pueden variar sensiblemente de un ordenador a otro. La cantidad de factores que pueden influir en el tiempo de ejecución es muy larga:
Un mismo algoritmo se puede llamar con distintos datos de entrada. Nuestro objetivo es estudiar el tiempo de ejecución como función del “tamaño” de los datos de entrada . Para ello podemos usar dos alternativas: 1) Medir tiempos de ejecución de los programas con datos de entrada de distintos tamaños 2) Contar el número de operaciones que realiza el programa.
1. algoritmo usado. 2. sistema operative. 3. velocidad del procesador. 4. número de procesadores. 5. conjunto de instrucciones que entiende. 6.cantidad de memoria RAM,,caché, y velocidad de estas 7.coprocesador matemático, Fig 1. Vista general de un Microprocesador.
Análisis de Algoritmos
Comenzamos por medir el tiempo de ejecución de algunos algoritmos de forma empírica. Probando dos algoritmos que calculan el mismo objeto con datos de distinto tamaño nos haremos una idea de qué algoritmo es mejor para datos grandes. Para evitar que el resultado tenga en cuenta el efecto de los otros programas que se están ejecutando en nuestro ordenador en ese mismo momento, se recomienda no abrir mas programas o aplicaciones ,para que podamos medir los tiempos que el ordenador dedica exclusivamente a nuestro programa.
public class PruebaBurbuja { public static void main(String[] args) { int [] arreglo {93,9,8,7,6,5,4,12,11,3,15,45,37,22,27,18,33,43,28,76}; int [] arrTemp = new int [arreglo.length]; int nMuestras =1000; long prom = 0;
II PROCEDIMIENTO
Burbuja burbuja = new Burbuja();
A. El primer algoritmo que vamos a analizar es el del METODO DE LA BURBUJA, La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar.
for(int j=0 ; j<=10 ; j++){ for(int i=0; i<nMuestras;i++) { for(int a=0;a<arreglo.length;a++){ int temp =arreglo[a]; arrTemp[a]=temp; } //while(true){ long t1 = System.nanoTime(); burbuja.ordenador(arrTemp); long t2 = System.nanoTime(); long tf = t2-t1; prom = prom + tf; //}
public class Burbuja { public Burbuja() { // Constructor vacio } public void ordenador(int [] arreglo) { int aux; for(int i=0; i<arreglo.length-1;i++) { for(int j=0; j<arreglo.length-1; j++) { if(arreglo[j]>arreglo[j+1]) { aux=arreglo[j+1]; arreglo[j+1]=arreglo[j]; arreglo[j]=aux; } } } } }
} prom = prom / nMuestras; System.out.println(((double)prom/(double)1e3)); } System.out.print("Arreglo sin ordenar: "); for(int l=0 ; l<arreglo.length; l++) { System.out.print(" "+arreglo[l]); } System.out.print("\n"); System.out.print("Arreglo ordenado: "); for(int l=0 ; l<arreglo.length; l++) { System.out.print(" "+arrTemp[l]); } } }
=
Análisis de Algoritmos
B. GRAFICA OBTENIDA
C. El segundo algoritmo que vamos a analizar es el del METODO DE LA BURBUJA MEJORADO, Como ya sabemos mediante el método burbuja, dado un arreglo de n números, se requiere de n-1 pasos para dejar el arreglo ordenado. Se puede observar que en el primer paso el primer elemento mayor queda en la primera posición mayor (última si es que estamos ordenando de menor a mayor); en el segundo paso el segundo elemento mayor queda en la segunda posición mayor (penúltima); y así sucesivamente. Por esta razón el número de comparaciones, debería irse reduciendo en uno, en cada paso. Se puede observar además, que en muchos caso se consigue tener ordenado el arreglo, en un número menor de pasos a n-1, por lo cual el resto de los pasos serían innecesarios.
Fig 2. Grafica obtenida en la JVM del método de la burbuja.
Muestra 1 2 3 4 5 6 7 8 9 10 11
Tiempo 10,264 0,486 0,470 0,458 0,462 0,455 0,452 0,467 0,458 0,689 0,496
Considerando estos dos hechos se podría mejorar el método burbuja eliminando los pasos innecesarios y reduciendo las comparaciones con cada paso. Una manera sencilla de hacer esto sería detectando mediante algún registro si se han efectuado cambios o no, y reduciendo el número de comparaciones en cada paso.
public class BurbujaMejorada { int [ ] arreglo; public BurbujaMejorada() { } public void ordenador(int matriz[]) { int buffer; int i,j; for(i = 0; i < matriz.length; i++) { for(j = 0; j < i; j++) { if(matriz[i] < matriz[j]) { buffer = matriz[j]; matriz[j] = matriz[i]; matriz[i] = buffer; }
AnĂĄlisis de Algoritmos }
System.out.print(" "+arrTemp[l]);
} }
} } }
} D. GRAFICA OBTENIDA public class PruebaBurbujaMejorada { public static void main(String[] args) { int [] arreglo = {93,9,8,7,6,5,4,12,11,3,15,45,37,22,27,18,33,43,28,76 }; int [] arrTemp = new int [arreglo.length]; int nMuestras =1000; long prom = 0; BurbujaMejorada BurbujaMejorada();
burbuja2
=
new
for(int j=0 ; j<=10 ; j++){ for(int i=0; i<nMuestras;i++) { for(int a=0;a<arreglo.length;a++){ int temp =arreglo[a]; arrTemp[a]=temp; } //while(true){ long t1 = System.nanoTime(); burbuja2.ordenador(arrTemp); long t2 = System.nanoTime(); long tf = t2-t1; prom = prom + tf; //} } prom = prom / nMuestras; System.out.println(((double)prom/(double)1e3)); } System.out.print("Arreglo sin ordenar: "); for(int l=0 ; l<arreglo.length; l++) { System.out.print(" "+arreglo[l]); } System.out.print("\n"); System.out.print("Arreglo ordenado: "); for(int l=0 ; l<arreglo.length; l++) {
Fig 3 Grafica obtenida en la JVM del mĂŠtodo de la burbuja mejorada.
Muestra 1 2 3 4 5 6 7 8 9 10 11
Tiempo 9,991 0,599 0,606 0,595 0,569 0,593 0,589 0,472 0,332 0,498 0,570
Análisis de Algoritmos E. El tercer metodo que vamos a analizar es el metodo de BUSQUEDA BINARIA, Si los elementos sobre los que se realiza la búsqueda están ordenados, entonces podemos utilizar un algoritmo de búsqueda mucho más rápido que el secuencial, la búsqueda binaria. El algoritmo consiste en reducir paulatinamente el ámbito de búsqueda a la mitad de los elementos, basándose en comparar el elemento a buscar con el elemento que se encuentra en la mitad del intervalo y en base a esta comparación: Si el elemento buscado es menor que el elemento medio, entonces sabemos que el elemento está en la mitad inferior de la tabla. Si es mayor es porque el elemento está en la mitad superior. Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el elemento. Se puede aplicar tanto a datos en listas lineales (Vectores, Matrices, etc.) como en árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda binaria son: La lista debe estar ordenada en un orden especifíco de acuerdo al valor de la llave. Debe conocerse el número de registros. La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si es mayor está en el segundo. Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos: Se toma el elemento central y se divide el array en dos: {1,2,3,4}-5-{6,7,8,9} Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray: {1,2,3,4} Se vuelve a dividir el array en dos: {1}-2-{3,4} Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4} Se vuelve a dividir en dos: {}-3-{4} Como el elemento buscado coincide con el central, lo hemos encontrado. Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento
en una partida de ajedrez. La variante más simple del problema es la búsqueda de un número en un vector. public class BusquedaBinaria { public static int buscar( int [] arreglo, int dato) { int inicio = 0; int fin = arreglo.length - 1; int pos; while (inicio <= fin) { pos = (inicio+fin) / 2; if ( arreglo[pos] == dato ) return pos; else if ( arreglo[pos] < dato ) { inicio = pos+1; } else { fin = pos-1; } } return -1; } }
public class PruebaBusquedaBinaria { public static void main(String[] args) { int [] arreglo = {2,4,7,11,23,29,45,55,56,59,68,73,77,80,86,89,97,102 ,104,115};
int nMuestras =1000; long prom = 0;
for(int j=0 ; j<=10 ; j++){ for(int i=0; i<nMuestras;i++) { while(true){ long t1 = System.nanoTime(); int resultado BusquedaBinaria.buscar(arreglo, 115);
=
//if (resultado != -1) { // System.out.println ( "Encontrado en la posicion : "+ resultado); //} else {
Análisis de Algoritmos // System.out.println ( "El dato no se encuentra en el arreglo, o // el arreglo no esta ordenado." ); //} long t2 = System.nanoTime(); long tf = t2-t1; prom = prom + tf; } } prom = prom / nMuestras; System.out.println(((double)prom/(double)1e3));
III CONCLUSIONES
} } }
F. GRAFICA OBTENIDA
a s h a r d c o Fig 3. Grafica obtenida en la JVM del método de busqueda binaria.
Muestra 1 2 3 4 5 6 7 8 9 10 11
Tiempo 0,850 0,465 1,117 1,818 1,684 0,889 0,094 0,092 0,092 0,095 0,109
Teminado el laboratorio hemos analizado la eficiencia y tiempo de ejecucion de los tres tipos de algoritmos de busqueda y ordenamiento,por medio de la maquina virtual de java JVM, y hemos logrado profundizar mas es los conceptos y en la visualización del analisis preestablecidos,logrando entender los conceptos brindados por el profesor en el laboratorio,de lo cual podemos deducir lo siguiente: 1) El metodo de la burbuja y el metodo de la burbuja mejorado poseen caracteristicas de tiempo y desempeño muy similares,encontarndo unas cuantas variaciones de eficiencia. 2) El metodo de busqueda binaria presenta variaciones significativas con respecto a los dos anteriores,mostrando fluctuaciones y cambios bruscos en el tiempo de ejecucion. 3) Debemos tener en cuenta que según sea la necesidad del desarrolador o de la aplicación como tal,podemos utilizar deacuerdo a estos analisis preestablecidos,cual es el metodo que mas se acopla a las necesidades y requerimientos funcionales del proyecto. IV BIBLIOGRAFÍA http://artemisa.unicauca.edu.co/~nediaz/EDDI/cap 02.htm#ancla2_3 http://macabremoon0.tripod.com/id2.html http://www.programacionfacil.com/estructura_dat os_csharp:busqueda_binaria http://www.lsi.upc.edu/~duch/home/duch/analisis. pdf http://es.slideshare.net/evansbv/analisis-dealgoritmos