关于斐波那契数列计算引发的效率思考

斐波那契数列的算法如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值