You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于并查集(disjoint-set data structure)按秩合并(union by rank)算法中“每个节点的秩至多为⌊lg(n)⌋”的证明疑问

关于并查集(disjoint-set data structure)按秩合并(union by rank)算法中“每个节点的秩至多为⌊lg(n)⌋”的证明疑问

嘿,我来帮你拆解这两个疑惑点,一步步捋清楚就明白了~

第一个不等式:为什么 $\lfloor \lg(a)\rfloor + 1 \leq \lfloor \frac{\lg(n + 1)}{2} \rfloor + 1$?

哦对了,这里大概率是输入时的小失误——原证明里的正确形式应该是 $\lfloor \lg\left(\frac{n+1}{2}\right) \rfloor$(对数的真数是 $(n+1)/2$,不是把 $\lg(n+1)$ 除以2),不然逻辑上会说不通。咱们按正确的形式来解释:

当合并两个秩相等的集合时,设它们的大小分别为 $a$ 和 $b$,必然满足 $a + b = n+1$(合并后总节点数是 $n+1$)。我们不妨假设 $a \leq b$(对称情况,不影响结论),那 $a$ 的最大值就是 $(n+1)/2$(当 $a=b$ 时取到)。

因为对数函数 $\lg(x)$ 是单调递增的,所以 $\lg(a) \leq \lg\left(\frac{n+1}{2}\right)$。两边同时取向下取整($\lfloor \cdot \rfloor$),不等号方向保持不变,就得到 $\lfloor \lg(a)\rfloor \leq \lfloor \lg\left(\frac{n+1}{2}\right) \rfloor$。最后两边加1,就有了 $\lfloor \lg(a)\rfloor + 1 \leq \lfloor \lg\left(\frac{n+1}{2}\right) \rfloor + 1$。

第二个问题:$\lfloor \lg\left(\frac{n+1}{2}\right) \rfloor + 1$ 是否等于 $\lfloor \lg(n+1) \rfloor$?

答案是肯定的,咱们来推导一下:
根据对数的运算法则,$\lg\left(\frac{n+1}{2}\right) = \lg(n+1) - \lg2 = \lg(n+1) - 1$(因为 $\lg2=1$)。

对于任意实数 $x$,$\lfloor x - 1 \rfloor = \lfloor x \rfloor - 1$(向下取整后减1,整数部分刚好减1,小数部分不影响)。所以:
$$\lfloor \lg\left(\frac{n+1}{2}\right) \rfloor + 1 = \lfloor \lg(n+1) - 1 \rfloor + 1 = (\lfloor \lg(n+1) \rfloor - 1) + 1 = \lfloor \lg(n+1) \rfloor$$

举几个例子验证下:

  • 当 $n+1=5$ 时,$\lg5≈2.32$,$\lg(5/2)=\lg2.5≈1.32$,$\lfloor1.32\rfloor+1=1+1=2$,而 $\lfloor2.32\rfloor=2$,相等;
  • 当 $n+1=3$ 时,$\lg3≈1.58$,$\lg(3/2)=\lg1.5≈0.58$,$\lfloor0.58\rfloor+1=0+1=1$,$\lfloor1.58\rfloor=1$,也相等。

这样整个推导链就通顺啦:$\lfloor \lg(a)\rfloor + 1 \leq \lfloor \lg\left(\frac{n+1}{2}\right) \rfloor + 1 = \lfloor \lg(n+1) \rfloor$,也就证明了合并后的秩不超过 $\lfloor \lg(n+1) \rfloor$。

备注:内容来源于stack exchange,提问作者Hugh Mann

火山引擎 最新活动