斐波那契数列的算法如下:
int FibonacciFunc(int val)
{
if(0 == val)
return 0;
else if(1 == val)
return 1;
return FibonacciFunc(val - 1) + FibonacciFunc(val - 2);
}
算法上并不复杂,就是一个递归。但是递归一直在调用自己,这就要涉及到建栈和销栈,开销是很大的,特别当需要不断的调用这个递归做运算的时候,那消耗的资源、占用的时间,将不能被忽视。突然看到这个问题,开始考虑如何减少这个开销。当然,这个思考的方案与斐波那契数列中隐藏的矩阵思想无关。我们考虑一个概率的问题。一般处理实际情况的时候,有很多数据将会是重复的,会有一定的出现概率,我们就从这一点入手。
1、可调配的资源够多的前提下:
链表是最好的选择
typedef struct _FIBONACCI_VAL_MAP
{
int item ; //项
int val; //值
struct _FIBONACCI_VAL_MAP *next;
}FIBONACCI_VAL_MAP;
每次在计算之前,查找链表是否有命中数据。如果没有命中就计算数据,并且插入到列表的开头。
等到程序运行的时间足够长,那么几乎实际情况中的值都能在链表中找到。此时性能的瓶颈将会出现在链表查找上。比如用树来查找?进一步优化一下?不管是链表查找核实后优化后的树查找。都比之前的的递归消耗在建栈销栈上,链表查找更多的是消耗在寄存器的取值赋值。这两者消耗的时间不是一个数量级的
2、资源少的情况:
那就数组吧固定好数组的大小,
typedef struct _FIBONACCI_VAL_MAP
{
int item ;
int val;
}FIBONACCI_VAL_MAP;
FIBONACCI_VAL_MAP Target_Map[10];
查找的方案如之前的链表的查找,命中的成员与首位互换。未命中的添加到首位,之前的数据都后移,自动丢弃最后一位(命中概率最低)。
3、其他的优化方案还没有想到。空手套前辈们的白狼。手动滑稽.jpg