路径压缩优化并查集的时间复杂度

路径压缩优化并查集大家一定很熟练了,那么它的复杂度是多少呢?O(mα(n))O(m\alpha(n))O(mα(n))

的确,很多人都是这么说的,但是事实上它的复杂度是O(mlog⁡1+m/nn)O(m\log_{1+m/n}n)O(mlog1+m/nn)的,并且能找到一种方法卡到这样的复杂度。

要卡并查集,首先要构造一种树——二项树。这种二项树还与普通的不太一样。

定义:在给定jjj的情况下,二项树TkT_kTk定义如下:

  • k≤jk\leq jkjTkT_kTk是一个点。
  • k>jk>jk>jTkT_kTkTk−1T_{k-1}Tk1的根结点增加一棵Tk−jT_{k-j}Tkj的子树。

img

这棵树非常有意思,我们可以展开Tk−jT_{k-j}Tkj,接着展开Tk−2jT_{k-2j}Tk2j……

另外,也可以展开Tk−1T_{k-1}Tk1,接着展开Tk−2T_{k-2}Tk2……

img

容易发现,图5看起来像图4的路径压缩之后的结果,但是不完全一样。

如果首先按照图5的方式展开jjj棵子树,再按图4展开,可以得到

img

此时,如果在根节点上再加一个点,jjj次访问T1T_1T1TjT_jTj,那么路径压缩后可以得到图5外加一个点作为根的儿子。

也就是说,这棵二项树路径压缩后约等于没有路径压缩……只是将原来作为根结点父亲的那个点变成了儿子。

至于TkT_kTk的点数,通过数学归纳法可以发现不会超过(j+1)k/j−1(j+1)^{k/j-1}(j+1)k/j1个。

假设m≥nm\geq nmn,令j=mn,i=log⁡j+1n2+1,k=ijj=\frac{m}{n},i=\log_{j+1}\frac{n}{2}+1,k=ijj=nm,i=logj+12n+1,k=ij,那么TkT_kTk的点数不超过n2\frac{n}{2}2n。接下来做n2\frac{n}{2}2n组操作,每次加入一个点作为根结点的父亲,然后对T1T_1T1TjT_jTj逐个查询,每次查询的长度是i+1i+1i+1,同时查询的次数显然不超过mmm。因此总操作次数为n2j(i+1)\frac{n}{2}j(i+1)2nj(i+1),即O(mlog⁡1+m/nn)O(m\log_{1+m/n}n)O(mlog1+m/nn)

图片取自康复计划#4 快速构造支配树的Lengauer-Tarjan算法

转载于:https://www.cnblogs.com/Canopus-wym/p/10376053.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值