Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/07/2011, 13:27
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: ideas para mejorar velocidad de código nofibonacci.

Bueno. No fue tan complicado :).

Para poder lograr construir un algoritmo mas eficiente hay que saber un poco de analisis de algoritmos. Aunque sea lo mas basico.

En este caso tu algoritmo es bonito.
Pero el cuello de botella es que tienes ciclos anidados.
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.

Despues de de analizar un poco el programa logre obtener una solucion donde solo se utiliza un ciclo.

Código:
#include <cstdlib>
#include <iostream>

using namespace std;



int vector[300000];
int main()
{
	int numero,j,i,N;
	numero=0;
	i=0;
	j=2;
	
	
	cin>>N;
	vector[0]=1;
	vector[1]=2;
	for(i=3; i<N; i++)
	{
		if(i==vector[j-2]+vector[j-1])
		{
			vector[j]=i;
			j++;
		}
		else
			cout<<i<<" ";
	}
	return 0;
}
Si vez el codigo es mas sencillo aun.

El chiste es ir imprimiendo tooodos los numeros menos los de la serie de fibonacci.
Entonces solo necesitamos revisar que el numero que vamos a imprimir no sea de la serie, y si lo es, pues lo almacenamos para asi tener el siguiente valor de la serie y estarlo probando.
Pruebalo, seguramente correra en un factor lineal en vez de cuadratico, lo cual acelera muuucho a la hora de probar casos de incluso mas de 30000.

Podria pensar en otro tipo de algoritmos para intentar acelerarlo mas, pero ya seria un incremento insignificante en velocidad y gran incremento en complejidad, por lo que no valdria la pena.

Espero te sea de ayuda.

SAludos