关于并查集(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




