Foros del Web » Programación para mayores de 30 ;) » Java »

Tiempo utilizado en ordenar un array

Estas en el tema de Tiempo utilizado en ordenar un array en el foro de Java en Foros del Web. Hola a todos, Tengo un servlet que tiene un array y lo que hago es ordenarlo. Tengo una plataforma de desarrollo y otra de producción. ...
  #1 (permalink)  
Antiguo 27/06/2006, 01:41
 
Fecha de Ingreso: febrero-2006
Mensajes: 20
Antigüedad: 18 años, 2 meses
Puntos: 1
Tiempo utilizado en ordenar un array

Hola a todos,

Tengo un servlet que tiene un array y lo que hago es ordenarlo. Tengo una plataforma de desarrollo y otra de producción. Lo estoy problando en 2 maquinas diferentes. En una de las máquinas (que tiene menos procesador que el otro) tarda 2 segundos mientras que en el otro (que es tiene más memoria RAM y más procesador) tarda 23 segundos.

Los array tienen 7000 elementos. El código es el siguiente:

///////////////////////////////////////////////////////////////////////////*///////////////////////////////
java.util.Date datTiempoInicio, datTiempoFin;
java.util.Calendar calTiempoInicio = Calendar.getInstance();
java.util.Calendar calTiempoFin = Calendar.getInstance();
long intTiempoUtilizado;
datTiempoInicio = new java.util.Date();
calTiempoInicio.setTime(datTiempoInicio );


if (astrName.length > 1) {
//ordenacion de los arrays: astrName[intFilaArray]
int i, pasadas;
String strTemp;
double dblIntensityTemp;
double dblBackgroundTemp;
int intComparacion;
for (pasadas = 1; pasadas < astrName.length; pasadas++) {
for (i = 0; i<astrName.length - 1; i++) {
intComparacion = astrName[i].compareTo(astrName[i+1]);
if (intComparacion > 0) {
strTemp = astrName[i];
astrName[i] = astrName[i + 1];
astrName[i + 1] = strTemp;


dblIntensityTemp = adblIntensity1[i];
adblIntensity1[i] = adblIntensity1[i + 1];
adblIntensity1[i + 1] = dblIntensityTemp;


dblIntensityTemp = adblIntensity2[i];
adblIntensity2[i] = adblIntensity2[i + 1];
adblIntensity2[i + 1] = dblIntensityTemp;


dblBackgroundTemp = adblBackground1[i];
adblBackground1[i] = adblBackground1[i + 1];
adblBackground1[i + 1] = dblBackgroundTemp;


dblBackgroundTemp = adblBackground2[i];
adblBackground2[i] = adblBackground2[i + 1];
adblBackground2[i + 1] = dblBackgroundTemp;
} // end if (intComparacion > 0)
} //end for i
} //end for pasadas


} // end if (astrName.length > 1)


datTiempoFin = new java.util.Date();
calTiempoFin.setTime(datTiempoFin );


intTiempoUtilizado = Math.abs( (calTiempoFin.getTimeInMillis() -
calTiempoInicio.getTimeInMillis()) / (1000) );
System.out.println("(ProcessFile) Time = " + intTiempoUtilizado );


///////////////////////////////////////////////////////////////////////////*/////////////////////


¿Puede ser algo de la configuración que tengo diferente?
¿puede ser algo del metodo compareTo?
Necesito ayuda, please.

Gracias.
  #2 (permalink)  
Antiguo 27/06/2006, 02:55
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
depende de otros factores tambien: hay otros procesos corriendo al mismo tiempo? Usas la misma JVM? He notado que en Java 1.5 hay cierta mejora con respecto al rendimiento.
  #3 (permalink)  
Antiguo 27/06/2006, 03:19
 
Fecha de Ingreso: octubre-2005
Mensajes: 53
Antigüedad: 18 años, 6 meses
Puntos: 1
Buenas,

por que no utilizas otro algoritmo?? por lo que veo parece que estas utilizando el algoritmo de la burbuja no? y ese algoritmo es de orden cuadratico..

por que no utilizas el metodo sort() que proporciona Java? seguro que ganaras en rendimiento..

saludos.
  #4 (permalink)  
Antiguo 27/06/2006, 07:26
 
Fecha de Ingreso: febrero-2006
Mensajes: 20
Antigüedad: 18 años, 2 meses
Puntos: 1
Hola,
Yo no puedo utilizar el metodo Arrays.sort() ya que tengo los arrays interralacionados (fila con fila de cada array), es decir, si cambio cambio el orden del array astrName lo tengo que cabiar tambien en el adblBackground1, adblBackground2, adblIntensity1 y adblIntensity2.

ANTES de ordenar:

astrName adblBackground1 adblBackground2 adblIntensity1 adblIntensity2
-------- ---------------- --------------- ------------- -------------
"green" 4 8 7 5
"red" 6 7 6 7
"blue" 9 5 9 1
"black" 10 6 8 2

DESPUES DE ORDENAR debería de quedar así:

astrName adblBackground1 adblBackground2 adblIntensity1 adblIntensity2
-------- ---------------- --------------- ------------- -------------
"black" 10 6 8 2
"blue" 9 5 9 1
"green" 4 8 7 5
"red" 6 7 6 7

La ordenación siempre es por astrName sólo se cambia las posiciones del resto de arrays si han cambiado las de astrName. Si cambio la posicion 1 en astrName las cambio también en el resto de arrays.

Alguien me puede decir si existe una forma para hacer esto?

Gracias.
  #5 (permalink)  
Antiguo 27/06/2006, 07:48
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
podrias poner los atributos en un objeto (color, numero1, numero2,...), y luego defines las reglas que definen el orden (en el objeto tienes que implementar la interface Comparable) , y luego le puedes pasar un array de esos objetos al metodo sort.
  #6 (permalink)  
Antiguo 27/06/2006, 08:38
 
Fecha de Ingreso: febrero-2006
Mensajes: 20
Antigüedad: 18 años, 2 meses
Puntos: 1
Podrías ponerme un pequeño ejemplo de como puedo hacerlo, por favor?

Gracias.
  #7 (permalink)  
Antiguo 27/06/2006, 11:41
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
class LaClase implements Comparable {
String color;
int numero1;
int numero2;

//inserta constructores, setters, getters, toString(), etc...

/**
Este es el metodo del la interface
*/
int compareTo(Object o){
//ejemplo, en tu caso creo que lo ordenas por el color, alfabeticamente
LaClase tempClase = (LaClase)o;
if (this.numero1>tempClase.numero1)
return 1;
if (this.numero1<tempClase.numero1)
return -1;
if (this.numero1==tempClase.numero1)
return 0;

}

}

luego creas los objetos con los parametros respectivos, los pones en un array, y luego pasas el array al Arrays.sort()

...

o puedes implementar tu propio quicksort....

Mas info: http://java.sun.com/j2se/1.3/docs/ap...omparable.html

Ciao,

Willie
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:57.