二、查找优化 2.1 路径压缩 路径压缩是并查集中的一种优化技术,旨在减少查找(Find)操作的时间复杂度。 其核心思想是通过修改树的结构,使得每个节点在查找根节点的过程中,直接或尽可能接近根节点,从而缩短后续操作的路径长度。 什么意思呢?这里我们以前面的例子来说明: 查找优化.jpg 在这个例子中,我们通过路径压缩...
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个...
顾名思义,并查集是支持“合并”和“查询”操作的集合。 合并操作针对的是两个区域,是将在图论中称为非连通块的区域合并为一个连通块。 查询操作则是查找两个节点是否连通。 而对于无序性的集合来说,需要特别说明,并查集能够操作的是无向图,并不适用于有向图强连通性。 原理和结构 为了方便表示,我们用树这种数...
重点关注结整体形成一个树形结构,而不是树的形状等信息。 3.并查集的实现 3.1 初始化 对于并查集,一般采用数组来实现,其中元素为数组的索引,其父辈为数组索引对应内容。 在初始化中,将每个元素父辈设为自己,即自己形成一组,并对用一个rank数组记录以每个元素为根的树的层数,以方便后面并查集优化的实现。 UnionFind...
开始时每个节点都是以自己为根的单节点树,即parent[x] = x。如下初始化过程通常在main方法或并查集类(UnionFind)的构造方法中完成。 // 初始化 int[] parent = new int[isConnected.length]; for(int i = 0; i < isConnected.length; i++) { ...
查询操作通常基于并查集中已经建立的元素之间的关系,通过递归方式实现查询操作,每次查询时,首先判断当前元素是否为其自身的祖先。如果是,则直接跳出递归并返回当前元素的值。否则,将查找当前元素的父节点,并继续递归查询,直至找到祖先节点或确定两个元素不相连通。```cpp int find(int x) { if (f[x] == x...
并查集 rank 的优化上一小节介绍了并查集基于 size 的优化,但是某些场景下,也会存在某些问题,如下图所示,操作 union(4,2)。根据上一小节,size 的优化,元素少的集合根节点指向元素多的根节点。操作完后,层数变为4,比之前增多了一层,如下图所示:由此可知,依靠集合的 size 判断指向并不是完全正确的,更准确的是...
并查集及其优化 热心市民何先生 悉尼大学20级计算机系的学生 11 人赞同了该文章 简介 并查集(disjoint-set)是一种数据结构,用于处理一些元素的合并与查询问题。通常是解决连通性问题,因为连通性问题只要求程序能够判别给定的元素p,q是否相连,但并没有要求求出两者之间的通路上的连接(如果需要求路线的话,就需要用到图...
并查集的核心操作包括查询和合并。查询操作是找到一个节点的祖宗节点,也就是集合的编号。而合并操作则是将一个集合的根节点编号赋给另一个集合的根节点,以实现两个集合的合并。在查询过程中,我们采用了路径压缩技术来优化查询效率。路径压缩是指在查询过程中,将爬树过程中走过的节点的父节点都设置为祖宗节点,这样...
▲ 路径压缩的优化 上一期我们谈到了并查集中的路径压缩问题,现在来深入了解一下路径压缩算法。在并查集中,建立门派的过程类似于使用join函数将两个人连接起来,而谁成为谁的手下则是随机的。这样,最终的树状结构可能呈现出各种形态,包括一字长蛇阵等,这无疑会影响查找的效率。理想的情况是,所有人的直接上级都是...