consolidate函数
操作细节:
- 停止条件
《算法导论》的伪代码中有这样一行:
“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“辖域”定义相冲突。
故我们的终止条件是合理的(最优性可根据极端情况容易证明)。