Ver Mensaje Individual
  #7 (permalink)  
Antiguo 11/08/2011, 14:24
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: ideas para mejorar velocidad de código nofibonacci.

Hola,

Cita:
Iniciado por Instru Ver Mensaje
... Para poder lograr construir un algoritmo mas eficiente hay que saber un poco de analisis de algoritmos. Aunque sea lo mas basico. ...
... Una de las primeras cosas que hay que intentar cambiar para hacer un algoritmo mas eficiente es quitar en lo mas que se pueda los ciclos anidados. ...
Esos dos enunciados son posiblemente lo mejor que haya leido de programación en mucho tiempo.

Cita:
Iniciado por Instru Ver Mensaje
int vector[300000];
...
{
if(i==vector[j-2]+vector[j-1])
{
[/CODE]
Posiblemente no es necesario guardar toda la lista, simplemente los últimos dos valores, y en cada ciclo se hace una suma y dos restas por lo que se agrega un par de ciclos de procesador.

Cita:
Iniciado por sam90 Ver Mensaje
... Ademas si te fijas tarda casi lo mismo que el otro codigo. Yo creo que la gran diferencia de tiempo se esta perdiendo en el hecho de escribir en pantalla.
Definitivamente es cierto, un lenguaje más complejo siempre conlleva mas operaciones, cout hace muchas operaciones internamente, (comparado con el int 21 de assembler).

Cita:
Iniciado por sam90 Ver Mensaje
Código C:
Ver original
  1. for (i = 4 ; i < N ; i++)
  2.   if ( (i != 3 && i != 5 && i != 8 && i != 13 && i != 21 && i != 34 && i != 55 && i != 89 && i != 144 )  && (i != 233 &&  i != 377 && i != 610 && i !=987 && i !=1597 && i !=2584 && i !=4181 && i !=6765 && i !=10946 &&  i != 17711 && i != 28657 && i != 46368 && i != 75025 && i != 121393 && i != 196418 && i != 317811 ))
  3.       cout << i << " ";
Por cada ciclo se van a realizar tantas comparaciones que no creo que optimize mucho el código, cuando vaya por el 28657 se van a realizar mínimo 10 'not equals' por cada número, lo cual no creo que sea eficiente.

Cita:
Iniciado por sam90 Ver Mensaje
... Desde Qbasic que notaba esa letencia si imprimia en pantalla mientras calculaba cosas. Asi que creo que debe ser el problema de las llamadas al sistema para imprimir en pantalla lo que lo deben demorar. ...
Definitivamente un print de QBasic no ejecuta una interrupción de video simplemente, internamente realiza muchas operaciones.

Ahora bien ... no sé si yo no entendí algo .. pero realmente optimizado sería 'ALGO' así, a menos que yo no haya entendido el problema:

Código C:
Ver original
  1. int a = 1;
  2.     int b = 2;
  3.  
  4.     int i;
  5.     int p = a + b;
  6.  
  7.     for (i = p; i < 300; i++) {
  8.         if (i == p) {
  9.             a = b;
  10.             b = i;
  11.             p = a + b;
  12.         } else {
  13.             printf ("%d\n", i);
  14.         }
  15.     }

Se usa poca memoria y se cambian los valores solamente cuando es el siguiente de la serie, además no se suma ni resta en cada ciclo, solamente cuando encuentra un número de la secuencia, posiblemente me ahorro mucho con el printf, pero ya es cuestion de usar el cout, para obtener la misma velocidad de antes. Si las variables se almacenan en registros del procesador, el código va a ser sumamente rápido.

Saludos,