斐波那契数列、堆
来源:互联网 发布:access2007数据库引擎 编辑:程序博客网 时间:2024/06/06 03:01
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
第0项是0,第1项是第一个1。这个数列从第二项开始,每一项都等于前两项之和。
在数学上,斐波纳契数列被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
性质:
1、斐波那契数列又称黄金分割数列,原因是当n趋于无穷大时,后一项与前一项的比值接近1.618,也就是小数部分等于0.618,或者前一项与后一项的比值接近0.618。
2、从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。
求斐波那契数列算法可看笔记“递归与循环”,尽量用循环来实现(效率高)!!!
应用例子:
1、有一根长为L的铁丝截成k段,每段长度不小于1(可以为小数),并且任意三段都不能拼成三角形,求k最大值。
先把截断的铁丝排序:n1<=n2<=n3<=....<=nk,
能拼成三角形等价于3条铁丝中任2条的和大于第3条,也就是两条小的边的和要大于第3条边,所以,不能拼成三角形,意味着任2条小边的和不能大于比它们大的边,也就是ni+n(i+1)<=n(i+2),因为如果ni+n(i+1)比n(i+2)小,那ni+n(i+1)肯定比n(i+2)后面的边要小,同样如果n(i+2)比ni+n(i+1)大,那一定前面任两条边的和要大。
所以题目中的条件转化为:
n1+n2<=n3;n2+n3<=n4;....;n(k-2)+n(k-1)<=nk,且n1+n2+n3+...+nk=L,
要想分成更多段,那n1首先要尽量小,取1,n2也取1,n3也尽量小,取2,以此类推,化成了
n1=1,n2=1,n(i+2)=n(i+1)+ni
也就是按照斐波那契数列关系分割铁丝
2、有一个n级台阶,每步可以走1级或2级,求走完这n级台阶一共有多少种走法。
n=1:1种走法;
n=2:2种走法;
n>2:
如果第一步走1级,则还剩下n-1级,如果第一步走2级,则还剩下n-2级,总的走法等于这两者相加,设剩下n-1级共有f(n-1)种走法,剩下n-2级共有f(n-2)种走法,则f(n)=f(n-1)+f(n-2)。
可见满足斐波那契数列:1,2,3,5,8,13....(从1开始,且第2个是2,不是1),可用循环来求。
斐波那契堆
斐波那契堆(Fibonacci heap)是堆中一种,它和二项堆一样,也是一种可合并堆;可用于实现合并优先队列。斐波那契堆比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。
插入操作:
插入操作非常简单:插入一个节点到堆中,直接将该节点插入到'根链表的min节点'之前即可;若被插入节点比'min节点'小,则更新'min节点'为被插入节点。斐波那契堆的根链表是'双向链表',这里将min节点看作双向联表的表头。在插入节点时,每次都是将节点插入到min节点之前(即插入到双链表末尾)。合并操作:
合并操作和插入操作的原理非常类似:将一个堆的根链表插入到另一个堆的根链表上即可。简单来说,就是将两个双链表拼接成一个双向链表。所以斐波那契堆的合并操作时间复杂度是一个常数,故为O(1)。
取出最小节点:
抽取最小结点的操作是斐波那契堆中较复杂的操作。
减小节点值:
减少斐波那契堆中的节点的键值,这个操作的难点是:如果减少节点后破坏了'最小堆'性质,如何去维护呢?下面对一般性情况进行分析。
增加节点值:
增加节点值和减少节点值类似,这个操作的难点也是如何维护'最小堆'性质。思路如下:
删除节点:
删除节点,采用操作是:'取出最小节点'和'减小节点值'的组合。
0 0
- 斐波那契数列、堆
- 斐波那契数列数列计算
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 树--红黑树
- 【BZOJ3754】Tree之最小方差树
- Python2.x urllib
- iOS block的用法
- nginx 防火墙、权限问题
- 斐波那契数列、堆
- JSP EL表达式详细介绍
- iOS UI10_tableView的编辑
- ajax传输json到后台
- QT正则表达式
- redhat JDK-1.8安装
- 二项树与二项堆
- SQL 截取某字段第一个特殊字符(#为示例)前的所有字符,若字段里没有特殊字符(#号)则取全部字段
- refresh的停车场 (栈+队列)