关于斐波那契堆的灵感

consolidate函数

操作细节:

  1. 停止条件

《算法导论》的伪代码中有这样一行:

for each node w in the root list H”

那么最常见的错误为写一个常规for循环:

for(Node* p=min->right; p!=min; p=p->right){/*函数体*/}

但是如果在合并过程中min被合并为其他节点的子节点,这样的循环将无限持续下去,显然是一个大bug。

那么正确而且最优的停止条件应该是 :

遍历root list时在辅助数组A中发现与其度数相等的node竟是他自己

证明也比较容易理解:

假设root list 中原来有 m 个节点,沿root list移动 n 次后遇到停止条件,那么必然会发生 m-n 次相同度数节点的合并,即触发 m-n 次Union函数。
每一次触发Union函数相当于将一个节点划入辅助数组A的” 辖域 “,显然直接把节点放进A中也是将其划入“辖域”,那么根据终止条件可知最后所有节点都在”辖域“之内。
如果此时root list 中还有度数相同的点,显然与A“辖域”定义相冲突。

故我们的终止条件是合理的(最优性可根据极端情况容易证明)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值