我说的是union-find-disjoint 数据结构。互联网上有很多关于如何实现这一点的资源。到目前为止,我已经了解了两种联合优化技术。第一个是通过变量 Rank 来“平衡”树,它表示最深节点的深度,因此是 find() 的上限。第二个优化是:设置一个对象的父节点为头节点,同时调用find()(设置中还包含了对象的父节点,所以变成了级联优化)。
但是,当实现同时使用它们两者时,它们通常会不加思索地将两者合并在一起。具体来说,GeeksforGeeks(仅作为示例,没有任何个人内容)这样做。这不会导致排名“损坏”和 O(log n) 复杂性吗?
例如,如果我有一长串节点(5 到 4 到 3 到 2 到 1 到 0,这是头部)并且我调用 find() 到 2,则排名保持 5,即使它应该是 3。