启发式合并简介

什么是启发式合并

启发式合并, 就是把n个大小为1的集合合并为一个大小为n的集合的一种方法. 其复杂度为\(O(n\log n)\)

这种方法被广泛应用在各种毒瘤数据结构(树套树)中.....

当然, 集合合并操作的顺序是给定的(可以理解为强制在线)....(否则不就是\(O(n)\)了吗)...

启发式合并方法

启发式合并的算法很简单, 就是当要合并两个集合 \(s1, s2\)时, 将大小较小的合并至大小较大的

//伪代码
if(|s1| < |s2|) 
    for all x in s1: s2.insert(x);
    clear(s1);
else 
    for all x in s2: s1.insert(x);
    clear(s2);

复杂度分析

为啥这个优化有这么好的效果呢?

复杂度证明: 考虑贡献法.

一个元素从一个集合被加入另一个集合时, 所在集合的规模至少扩大一倍. 如果没有分离操作且元素数目有限, 合并的次数是O(log n)的.

因为有n个元素, 所以复杂度O(n log n)

将其复杂度式写为 \(T(n) = \max_{k\in[1, n]}(T(k)+T(n-k)+\min(k, n-k)\ )\)

通过以上证明, 所有类似这样的递归式, 其解都是 \(O(n\log n)\)

转载于:https://www.cnblogs.com/Eroad/p/9637546.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值