En el siguiente código, se asume que los métodos de ordenación publicados se encuentran en una clase de nombre "Algoritmos" y que se ha importado el paquete java.lang.reflect. El método ejecutarMetodo recibe como parámetro el nombre del método de la clase Algoritmos que implementa el algoritmo de ordenación requerido, así como el vector a ordenar, y devuelve el tiempo en segundos que tardó la ejecución del mismo.
public static double ejecutarMetodo(String nombreMetodo, int[] v) { try { Method m = Algoritmos.class.getMethod(nombreMetodo, v.getClass()); double t1 = System.currentTimeMillis(); m.invoke(null, v); double t2 = System.currentTimeMillis(); return (t2-t1)/1000.0 ; } catch(Exception x) { System.out.println(x.getMessage()); System.exit(0); return 0; } }
Para probar el funcionamiento de esta característica se puede crear una clase diferente, en este caso la clase TestReflect que se puede ejecutar desde la línea de comandos para recibir una lista de métodos de ordenación que se van a probar con tamaños de vector desde 1 en potencias de 2. A continuación se muestra el código de implementación de la clase TestReflect. Para efectos de prueba se incluyeron dos nombres de método por default, en caso de que la clase no se ejecute desde la línea de comandos:
public class TestReflection { public static void main(String[] args) { String[] tmp = {"ordenacionInsercion", "ordenacionRapida"}; if(args.length==0) args = tmp; int n=1; while(n<Integer.MAX_VALUE) { System.out.printf("%,12d ", n); for(String algoritmo: args) { int[] v = Algoritmos.crearVector(n); System.out.printf("%,12f ",Algoritmos.ejecutarMetodo(algoritmo, v)); } System.out.println(); n*=2; } } }
En este caso en particular, los resultados para los dos algoritmos probados, con tamaños de vector por encima de 1,024 son los siguientes:
1.024 0,001000 0,000000 2.048 0,004000 0,000000 4.096 0,013000 0,001000 8.192 0,053000 0,000000 16.384 0,219000 0,002000 32.768 0,863000 0,005000 65.536 3,377000 0,010000 131.072 13,468000 0,019000 262.144 54,277000 0,041000 524.288 220,892000 0,085000
Del análisis de estos datos se puede detectar fácilmente que el incremento en el tiempo requerido para ordenar un vector es aproximadamente cuatro veces mayor cuando el tamaño del vector aumenta al doble, mientras que para el de ordenación rápida, el incremento es ligeramente superior al doble. Ambas observaciones se corresponden con lo esperado según el análisis de su complejida.
No hay comentarios.:
Publicar un comentario