族谱网 头条 人物百科

斐波那契堆

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:555
转发:0
评论:0
结构斐波那契堆是由一组最小堆有序树构成的。每个节点的度数为其子节点的数目。树的度数为其根节点的度数。斐波那契堆中的树都是有根的但是无序。每个节点x包含指向父节点的指针p[x]和指向任意一个子结点的child[x]。x的所有子节点都用双向循环链表链接起来,叫做x的子链表。子链表中的每一个节点y都有指向它的左兄弟的left[y]和右兄弟的right[y]。如果节点y是x仅有的子节点,则left[y]=right[y]=y。斐波那契堆中所有树的根节点也用一个双向循环链表链接起来。使用一个指针指向斐波那契堆中最小元素。操作建立一个新的斐波纳契堆每个结点x的域父节点p[x]指向任一子女的指针child[x]——结点x的子女被链接成一个环形双链表,称为x的子女表左兄弟left[x]右兄弟right[x]——当left[x]=right[x]=x时,说明x是独子。子女的个数degree[x]布尔值域ma...

结构

斐波那契堆是由一组最小堆有序树构成的。每个节点的度数为其子节点的数目。树的度数为其根节点的度数。

斐波那契堆中的树都是有根的但是无序。每个节点x包含指向父节点的指针p[x]和指向任意一个子结点的child[x]。x的所有子节点都用双向循环链表链接起来,叫做x的子链表。子链表中的每一个节点y都有指向它的左兄弟的left[y]和右兄弟的right[y]。如果节点y是x仅有的子节点,则left[y]=right[y]=y。

斐波那契堆中所有树的根节点也用一个双向循环链表链接起来。

使用一个指针指向斐波那契堆中最小元素。

操作

建立一个新的斐波纳契堆

每个结点x的域

父节点p[x]

指向任一子女的指针child[x]——结点x的子女被链接成一个环形双链表,称为x的子女表

左兄弟left[x]

右兄弟right[x]——当left[x] = right[x] = x时,说明x是独子。

子女的个数degree[x]

布尔值域mark[x]——标记是否失去了一个孩子

对于一个给定的斐波那契堆H,可以通过指向包含最小关键字的树根的指针min[H]来访问,这个结点被称为斐波那契堆中的最小结点。如果一个斐波那契堆H是空的,则min[H] = NIL. 在一个斐波那契堆中,所有树的根都通过left和right指针链接成一个环形的双向链表,称为堆的根表。于是,指针min[H]就指向根表中具有最小关键字的结点。

创建一个空的斐波那契堆,过程MAKE-FIB-HEAP 分配并返回一个斐波那契堆对象H;

插入一个节点

创建一个仅包含一个节点的新的斐波纳契堆,然后执行堆合并。

查找最小的节点

由于用一个指针指向了具有最小值的根节点,因此查找最小的节点是简单的操作。

合并两个斐波纳契堆

简单合并两个斐波纳契堆的根表。即把两个斐波纳契堆的所有树的根首尾衔接并置。

释放(删除)最小的节点

分为三步:

查找最小的根节点并删除它,其所有的子节点都加入堆的根表,即它的子树都成为堆所包含的树;

需要查找并维护堆的最小根节点,但这耗时较大。为此,同时完成堆的维护:对堆当前包含的树的度数从低到高,迭代执行具有相同度数的树的合并并实现最小树化调整,使得堆包含的树具有不同的度数。这一步使用一个数组,数组下标为根节点的度数,数组的值为指向该根节点指针。如果发现具有相同度数的其他根节点则合并两棵树并维护该数组的状态。

对当前堆的所有根节点查找最小的根节点。

降低一个节点的键值

对一个节点的键值降低后,自键值降低的节点开始自下而上的迭代执行下述操作,直至到根节点或一个未被标记(marked)节点为止:

如果当前节点键值小于其父节点的键值,则把该节点及其子树摘下来作为堆的新树的根节点;其原父节点如果是被标记(marked)节点,则也被摘下来作为堆的新树的根节点;如果其原父节点不是被标记(marked)节点且不是根节点,则其原父节点被加标记。

如果堆的新树的根节点被标记(marked),则去除该标记。

删除节点

把节点的键值调整为负无穷小,然后执行“降低一个节点的键值”算法,然后再执行“删除最小节点”算法。


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 斐波那契
斐波那契数列列奥纳多在《计算之书》中提出一个在理想假设条件下兔子成长率的问题,并自行求解此问题。所求得的各代兔子的个数可形成一个数列,也就是斐波那契数,不过列奥纳多不是最早提到数列的数学家,此数列最早是由印度数学家在第6世纪时所发现,但因为列奥纳多才使西方知道此一数列,因此而得名。斐波那契数的特点是每一个数都是前二个数的和。头二项是0和1,此数列的前几项如下:0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987...随着斐波那契数的增加,相邻二项斐波那契数相除的商会接近黄金比例(近似值为1:1.618或0.618:1)。位在比萨的斐波那契雕像重要著作LiberAbaci(计算之书,1202年)。PracticaGeometriae(1220年),几何学和三角学概论。Flos(1225年),JohannesofPalermo提出的问题的答案。Lib...
· 斐波那契数列
源起根据高德纳(DonaldErvinKnuth)的《计算机程序设计艺术》(TheArtofComputerProgramming),1150年印度数学家Gopala和金月在研究箱子包装物件长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契LeonardoFibonacci),他描述兔子生长的数目时用上了这数列:第一个月初有一对刚诞生的兔子第二个月之后(第三个月初)它们可以生育每月每对可生育的兔子会诞生下一对新兔子兔子永不死去假设在n月有兔子总共a对,n+1月总共有b对。在n+2月必定总共有a+b对:因为在n+2月的时候,前一月(n+1月)的b对兔子可以存留至第n+2月(在当月属于新诞生的兔子尚不能生育)。而新生育出的兔子对数等于所有在n月就已存在的a对表达式为求得斐波那契数列的一般表达式,可以借助线性代数的方法。高中的初等数...
· 罗波那
参考资料罗摩衍那
· 波吕斐摩斯
《奥德赛》中的传说在荷马的史诗《奥德赛》故事中,经历过特洛伊十年战的英雄奥德修斯于回家途中停泊独眼巨人聚居的西西里岛。他带着12个希腊人为了寻找补给来到一个巨大的洞穴,那里正是波吕斐摩斯的巢穴。奥德修斯在波吕斐摩斯的洞穴雅各布·乔登斯作品波吕斐摩斯回洞后发现了奥德修斯一群人,立刻用巨石封堵了洞口,随后残暴的摔死和吞食了其中几个人。奥德修斯悲痛万分之下想到了一个逃走的计划,他把没有勾兑的烈性葡萄酒给波吕斐摩斯喝,并告诉他自己的名字叫“没有人”(ουτις)。乘着波吕斐摩斯醉酒熟睡,奥德修斯带着剩下的人把巨人当作武器的橄榄树桩削尖磨锐,然后由几个人一起举起插入了波吕斐摩斯的独眼。失去眼睛的波吕斐摩斯大声痛呼,希望岛上其他的独眼巨人来帮忙,但他呼喊的“没有人攻击我”只被当成了玩笑,因此没有其他独眼巨人前来帮忙。第二天,波吕斐摩斯和往常一样把他洞里眷养的大羊放出洞外吃草,在洞口他一一摸着羊的脊背,...
· 詹波隆那
生平詹波隆那出生在佛兰德的杜埃(今属法国),年轻时在安特卫普师从建筑师、雕塑家JacquesduBroeucq,1550年前往意大利,到罗马学习。詹波隆那详细研究古代雕塑,也深受米开朗琪罗的影响,但是发展了自己的风格主义,较少强调情感,而较多强调优雅的外观、冷静的雅致和美。教宗庇护四世给了詹波隆那第一项重要的任命:博洛尼亚海神喷泉巨大的海神铜像和附属人物。詹波隆那大部分的创作期都住在佛罗伦萨,他在1553年在该市定居,成为美第奇家族的宫廷雕刻家,直到79岁时在佛罗伦萨去世-此后美第奇家族再也不让他离开佛罗伦萨,因为他们担心奥地利或西班牙得哈布斯堡王朝用永久职业来诱惑他。他埋葬在自己设计的佛罗伦萨圣母领报大殿的一个小礼拜堂内。作品詹波隆那最著名的作品之一是“墨丘利”,用一只脚保持身体平稳,上帝举起一只胳膊指向天空,手势借鉴了詹波隆那的maniera特有的古典手法。詹波隆那的几幅维纳斯建立了匀

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信