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

Código eficiente?

Estas en el tema de Código eficiente? en el foro de Java en Foros del Web. Buenas noches a todos. Tengo una consulta, tengo que hacer un tp para la facu, y en éste se pide basicamente cargar dos vectores enteros ...
  #1 (permalink)  
Antiguo 31/08/2012, 23:01
 
Fecha de Ingreso: abril-2008
Ubicación: Córdoba
Mensajes: 103
Antigüedad: 16 años
Puntos: 4
Información Código eficiente?

Buenas noches a todos.

Tengo una consulta, tengo que hacer un tp para la facu, y en éste se pide basicamente cargar dos vectores enteros a y b (arreglos primitivos, nada de usar ArrayList ni la clase Vector ni nada).

En un punto me pide generar un tercer vector con las repeticiones que hay entre el vector a y b.

Lo estaba resolviendo y quería saber si ésta es una forma eficiente y correcta de hacerlo:

Código Javascript:
Ver original
  1. public int[] getNumerosRepetidos(){
  2.         //Los primeros dos for sera para contar la cantidad de elementos repetidos que existen entre el arreglo a y b
  3.         int contadorRepetidos = 0;
  4.         for(int m=0; m < a.length; m++){ //Recorremos vector a
  5.             for(int k=0; k < b.length; k++){ //Recorremos vector b
  6.                 if(a[m] == b[k]){ //Si ambos son iguales
  7.                     contadorRepetidos++;
  8.                 }
  9.             }
  10.         }
  11.        
  12.         int[] resultados        = new int[contadorRepetidos];
  13.         int iteracionRepetido   = 0;
  14.         for(int m=0; m < a.length; m++){ //Recorremos vector a
  15.             forArregloB: for(int k=0; k < b.length; k++){ //Recorremos vector b
  16.                 if(a[m] == b[k]){ //Si ambos son iguales
  17.                     for(int l=0; l < resultados.length; l++){ //Recorremos vector de resultados
  18.                         if(resultados[l] == b[k]){ //Controlo que el numero no este en el arreglo de resultados para no duplicar datos
  19.                             continue forArregloB; //Si está, entonces no me hace falta buscar repeticiones con éste numero, asi que continúo
  20.                         }
  21.                     }
  22.                     resultados[iteracionRepetido] = a[m]; //Guardamos en los resultados en la posicion correspondiente
  23.                     iteracionRepetido++; //Sumamos uno a la posicion
  24.                 }
  25.             }
  26.         }
  27.        
  28.         return resultados;
  29.     }

Como debo declarar un vector Resultado, del cual no se con anticipación el tamaño que tendrá, primero debo recorrer con dos for la cantidad de elementos repetidos.

Luego con otros dos for lo que hago es guardar resultados, y un tercer for dentro de éstos, para comprobar que el elemento insertado en el vector resultados no se encuentre ya incluído.

¿Ésto es una forma eficiente de realizarlo? Me gusta programar de forma ordenada y sinceramente ésto de hacer tantos for me parece una "gronchada", pero no le encuentro otra manera.

Espero puedan ayudarme, muchas gracias.

Saludos

PD: Si aportan algo, por favor consideren que son arreglos primitivos, nada de usar clases como ArrayList o Vector como ya aclaré.
  #2 (permalink)  
Antiguo 01/09/2012, 05:12
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Código eficiente?

Muy eficiente no es, se pueden hacer algunas mejoras, pero dependerá de cómo sean los datos y exactamente qué quieres hacer.

Por ejemplo, primero recorres dos arrays para contar el número de elementos repetidos y poder crear el array devuelto. ¿Por qué no creas uno del tamaño del de menor tamaño y evitas el for? Tu actual algoritmo tampoco devuelve un array donde todas las posiciones estén ocupadas.

Otra posible mejora, si vas a comparar números del del 1 al 25, podrías generar un array de ese tamaño, y guardar los repetidos en su posición correspondiente, elimanarías el bucle for del tamaño y el de comprobar que no es un número repetido.

Como ya he dicho, depende de la naturaleza de los datos y de los resultados.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 01/09/2012, 19:32
 
Fecha de Ingreso: abril-2008
Ubicación: Córdoba
Mensajes: 103
Antigüedad: 16 años
Puntos: 4
Respuesta: Código eficiente?

En el primer caso, no defino el arreglo con la menor cantidad de elementos porque en el arreglo resultados me quedarían elementos con valor 0.

En el segundo caso, no se la cantidad de elementos repetidos, por lo tanto no puedo especular si son 1, 5, 25 o 50.

Por eso es que no se me ocurre como poder buscar la forma.

Igual lo que hice, fue declarar un arreglo resultados, mientras voy recorriendo en busca de elementos repetidos, le sumo 1 al tamaño, copio los elementos anteriores y le agrego el nuevo elemento.

Aún así, creo que tampoco es eficiente ésta forma porque por cada elemento que debo agregar estoy redeclarando y copiando los antiguos elementos al nuevo arreglo.

Un saludo !
  #4 (permalink)  
Antiguo 02/09/2012, 03:23
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Código eficiente?

Cita:
En el primer caso, no defino el arreglo con la menor cantidad de elementos porque en el arreglo resultados me quedarían elementos con valor 0.
Como ya te he dicho

Cita:
Tu actual algoritmo tampoco devuelve un array donde todas las posiciones estén ocupadas.
Aparte de que cuentas mal las repeticiones, por cada 5 en a, sumas el número de cincos en b.

int [] a = {5,4,5,3};
int [] b = {3,5,5};

Devuelve

[5, 3, 0, 0, 0]

Cita:
En el segundo caso, no se la cantidad de elementos repetidos, por lo tanto no puedo especular si son 1, 5, 25 o 50.
No me refería al número de repetidos, si no al rango de valores que se van a comparar. Si tus arrays solo continenen números del 0 al 9, te llegaría con un array de 10 posiciones. Pero tendrías el mismo "problema" de posiciones vacías, que es algo que no especificaste en el primer post.

Lo correcto sería usar Set, que para eso son arrays dinámicos (sin tamaño definido) y sin repetición, pero si uno de los requisitos es que uses arrays estáticos, cada vez que insertes un valor repetido aumentas contadorRepetidos, cuando acabes creas un nuevo array de ese tamaño y copias en él los valores distintos de 0 del array resultados, sería más eficiente que recorrer el producto cartesiano de dos arrays como haces ahora.

Para hacer un buen algoritmo, es muy recomendable hacer primero una lista con todas las limitaciones.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: enteros, primitivo, repetidos, arreglos
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 19:31.