Increiblemente complicado!

leorou
05 de Julio del 2006
Buenas gente, espero me ayuden en esta.
Les cuento que estuve analizando por todos lados (mayormente en internet) el hecho de medir el tiempo de un algoritmo cualquiera e implemente en mi codigo un cronometro con System.currentTimeMillis() para medir el metodo de clasificacion por inserción directa. Hasta ahi bastante bien.

El problema se me vino cuando tuve que medir el tiempo del quicksort. No saben el trabajo que me esta dando el bendito QuickSort. Los tiempo (obviamente como no podia ser de otra manera) dan 0 ya que es el algoritmo mas rapido.

El problema es que yo tengo que mostrar un valor que no sea 0, ya que 0 no es una medida de tiempo valida a la hora de decir el tiempo de un algoritmo de clasificacion.

Luego, probé ordenar el conjunto de datos varias veces hasta que no me de 0, y luego promediarlo con la cantidad de veces que se corrio, pero nada; el valor que tira es 0 (hasta encontre la manera de tirar varios numeros despues de la coma con el NumberFormat y el setMinimunFractionDigits, por lo que pueden ver que no me daba por vencido) pero adivinen que resultó........0.0000000!!!!! esta bien que sea rapido, pero de ahi a que no se pueda tomar el tiempo ya es demasiado!!!!.......

Asique como ultimo recurso, luego de haber intentado de mil formas distintas e investigado por cualquier lado, acudo en ayuda de un grupo tan culto como este.

Desde ya muchas gracias,
Leo.

drjustice
05 de Julio del 2006
Hola Leo:
Creo que la respuesta que buscas es bastante lógica. Si bien al correr el QuickSort no cambia el resultado de currentTimeMillis() es porque obviamente el ordenamiento se produce dentro del primer milisegundo.
No creo que sea posible obtener una medida temporal menor a un milisegundo (una fracción de milisegundo), pero por lo menos sabes que el ordenamiento se obtiene en un tiempo intermedio entre 0 y 1 milisegundo.

Quizas podrías probar con una mayor cantidad de datos a ordenar... algo así como generar unos 100000 numeros aleatorios y correr los ordenamientos... Creo que de esa manera podrías obtener resultados mas lógicos (y visibles por supuesto).

Espero que te haya ayudado en algo.
Slds

rubece
05 de Julio del 2006
Puedes expresar el tiempo en nanosegundos con la función System.nanoTime() en vez de milisegundos. He hecho una prueba con el siguiente programa:

public class Ejemplo {
public static void main(String[] args) {
long tiempo1 = System.currentTimeMillis();
long tiempo2 = System.currentTimeMillis();
System.out.println(tiempo2 - tiempo1);
long tiempo3 = System.nanoTime();
long tiempo4 = System.nanoTime();
System.out.println(tiempo4 - tiempo3);
}
}

La salida que me da es esta:
0
1397

Supongo que esto será mejor que lo que tenías antes. Que te vaya bien. Hasta luego.