并查集的rank优化,就是把几个树合并在一起并且让矮树跟着高树,这样合并之后树的高度能做到最低,查找起来就更方便(个人理解是这样的)
然后看的网课讲优化后树高不超过⌊log2(n)⌋+1
课上没讲怎么得的,说数学归纳法能推(可能确实很简单,但对我来说真的费脑子😭)这里简单记录一下我是怎么想的:
不超过⌊log2(n)⌋+1,也就是最坏的情况下树高度为⌊log2(n)⌋+1,这里的n代表的是合并后结点的总个数。
想要“最坏”,其实就是每次合并树的时候树高都会增加,不会出现矮树跟着高树,合并后树高不增加的情况。所以,我的想法就是每次进行操作的两颗树树高相同,这样保证用最少的结点合并成最高的树,达成“最坏”
但是!就是这里,我有一个点之纠结了很久,就是对新加进来的树有要求吗?新加进来的树是不是应该结点数等于树高才算是最极端情况?后来我明白了咱们讨论的所有都是基于“rank优化”,也就是所有的树都是从一个结点开始进行基于rank优化的合并,所以每次合并的等高的两棵树应该是一模一样的,这就是真正的极端情况(这里说实话我认为理解起来很别扭,但是我只能建议别钻牛角尖,这东西的实际意义和推导过程不像数学题那么清晰,大致理解一下方便记忆就可以了)
然后就是具体画图具体推演:
最差情况树高是log2(n)+1,一般树高小于⌊log2(n)⌋+1,即向下取整即可,然后结点查找find操作的时间复杂度就是O(logn) ,完毕(这里log2(n)量级通常简写为logn,在此不多解释,网上有许多大神有相关说明)
最后,也是把自己最开始陷进去的错误思路记录一下,树高⌊log2(n)⌋+1与完全二叉树求树高的公式一样,所以最开始一直在想怎么和完全二叉树产生关联,但现在我个人认为这仅仅是推算后结果的巧合,与完全二叉树完全无关。
(这次这个问题真的困扰了我很久,网上也没怎么搜到相关的推导过程,不过b站的诸多视频和网课的老师给我点拨了思路,非常感谢。
另外,本人作为新人创作者,同时也是408考研大军中的一员,各位如果有任何有关408的问题都可以向我提问,评论私信都可以,我尽全力去解决,帮助大家也是帮助自己成长。)