Foros del Web » Programando para Internet » Javascript »

Mayor rendimento en tratamiento de arrays

Estas en el tema de Mayor rendimento en tratamiento de arrays en el foro de Javascript en Foros del Web. Buenas, Tengo una duda técnica, a ver si me podéis ayudar: Estoy ordenando un array con una función general. Ésta acepta un parámetro para decidir ...
  #1 (permalink)  
Antiguo 03/01/2014, 12:48
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Mayor rendimento en tratamiento de arrays

Buenas,

Tengo una duda técnica, a ver si me podéis ayudar:

Estoy ordenando un array con una función general. Ésta acepta un parámetro para decidir si es de mayor a menor o de meno a mayor.

Entonces, se me ocurren dos alternativas:

Código Javascript:
Ver original
  1. //suponemos que los datos a comparar son datoA y datoB
  2. if(mayorAmenor){
  3.   r = '>='
  4. }else{
  5.   r = '<='
  6. }
  7.  
  8. if(eval('datoA'+r+'datoB')){
  9.   //datoA es mayor
  10. }

frente a una ordenación "estándar", digamos siempre de mayor a menor, y luego hacer:

Código Javascript:
Ver original
  1. //ordenas el array, guardado en miArray
  2.  
  3. if(menorAmayor){
  4.   miArray.reverse();
  5. }

Se que el "eval()" está mal visto, pero en este caso me va muy bien; por otra parte no se si consume más que el "reverse"... puesto que teóricamente el 50% de los casos puede necesitar un "reverse"...

¿Qué daría mayor rendimiento (es decir, no me vale eso de "el segundo porque no usa eval()")?

Saludos y gracias.
  #2 (permalink)  
Antiguo 03/01/2014, 17:10
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Mayor rendimento en tratamiento de arrays

creo que obtendrás mejor rendimiento y más eficiencia con es esto
Cita:
(function ord(r) {

console.log([0, 2, 4, 10, 3, 1].sort(function(f, s) {
if(r)
return f - s;
return s - f;

}));

})(false);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #3 (permalink)  
Antiguo 04/01/2014, 09:18
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Mayor rendimento en tratamiento de arrays

Cita:
Iniciado por IsaBelM Ver Mensaje
creo que obtendrás mejor rendimiento y más eficiencia con es esto
Ya, bueno... conozco la función sort...

El tema no es más que quiera en realidad ordenar el array, sino experimentar con JS haciendo cosas por mi cuenta (en mi opinión, la mejor manera de aprender).

Es decir, es como "auto-imponerse" ejercicios en los que tenga uno que exprimirse el coco, con tal que de salgan dudas como "¿qué es más eficiente, el dar la vuelta o el eval()?"

Desde mi punto de vista, veo que el "eval()" tiene un valor añadido, mientras que el hacer un orden fijo y luego mirar de invertir si es preciso puede ser más óptimo (sobretodo si no hay que darle la vuelta - en caso contrario haces n/2 pasos extra, donde "n" es la longitud del array).

De todas maneras gracias y un saludo.
  #4 (permalink)  
Antiguo 05/01/2014, 09:29
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Mayor rendimento en tratamiento de arrays

tu consulta no tiene respuesta. contrapones dos códigos sin relación alguna. por un lado evalúas dos valores y por otro reordenas una matriz

en el primero de los casos, el uso de eval() no es que esté desaconsejado, como puedes leer en la gran cantidad de literatura que hay en la web sobre esta función, sino que no es necesario. para evaluar dos valores
Cita:
if(mayorAmenor){
return a >= b;
}else{
return a < b;
}
buscándole tres pies al gato
Cita:
if(mayorAmenor){
return Math.min(a, b);
}else{
return Math.max(a, b);
}
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 06/01/2014, 11:04
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Mayor rendimento en tratamiento de arrays

Cita:
Iniciado por IsaBelM Ver Mensaje
tu consulta no tiene respuesta. contrapones dos códigos sin relación alguna. por un lado evalúas dos valores y por otro reordenas una matriz

en el primero de los casos, el uso de eval() no es que esté desaconsejado, como puedes leer en la gran cantidad de literatura que hay en la web sobre esta función, sino que no es necesario. para evaluar dos valores


buscándole tres pies al gato
Entiendo que en principio no se vea la relación entre los códigos... quizá obvié demasiado código.

Dejo el algoritmo que pretendo evaluar:

Código:
Array toSort; //array a ordenar, suponemos tiene datos (numéricos)
i = 0;
j = 0;
n = longitud(toSort);

de i=0 hasta n de 1 en 1
  max = i

  de j = i+1 hasta n de 1 en 1
    si array(j) >= array(max)
        max = j
    fin
  sigue

  intercambia(array(i), array(max))
sigue
Esto ordenaría de mayor a menor (descendente). No obstante se podría querer ordenar es ascendente, por lo que se podría añadir un parámetro tal que:

Código:
orden = '>=';

si ascendente
    orden = '<=';
fin
y luego evalular (eval()) la condición para obtener el orden deseado.

La contrapostura sería:

Código:
ordena

si ascendente
    cambia_orden(array);
fin
Espero que ahora se vea más clara la contraposición de los dos códigos.

Saludos y gracias por contestar.

Etiquetas: arrays, mayor, tratamiento
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 13:19.