并查集(DSU)

并查集(DSU),全称为Disjoint Set Union,是算法导论中的一种数据结构,用于处理不相交集合。其优化策略包括按秩合并和路径压缩,这两者能有效降低算法复杂度。尽管不使用优化策略时时间复杂度较高,但在实际应用中,由于数据规模限制,可以近似看作线性时间复杂度。平摊代价分析表明,在最坏情况下,这些操作的平均复杂度仍然较低。
摘要由CSDN通过智能技术生成

并查集的英文是Disjoint Set Union, 因此又称(DSU)

算法导论里的 不相交集合的数据结构  章节指的就是这个。




并查集有两种优化策略:

1.按秩合并 Union by Rank

2.路径压缩 Path Compression


使用与不使用这些策略的时间复杂度分析如下:




在实际应用中,人类现有甚至未来的数据几乎不可能让该算法复杂度过高。  因此可以把该算法复杂度当成近乎线性来使用。








平摊代价指的是在最坏情况下,这些操作的平均复杂度。


C语言中的并查集(Disjoint Set Union,DSU)是一种数据结构,常用于解决不相交集合的问题,如图的连通性检测、找出给定元素的根节点等。它维护了一组元素,每个元素都有一个代表它的“根”或“祖先”,通过合并操作可以把两个集合合并成一个。 下面是一个简单的C语言并查集的示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct DSU { int* parent; // 存储每个元素的根索引 int size; // 每个集合的大小 } DSU; // 初始化并查集 DSU* create_set(int n) { DSU* dsu = (DSU*)malloc(sizeof(DSU)); dsu->parent = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { dsu->parent[i] = i; dsu->size = n; } return dsu; } // 查找根节点(路径压缩) int find_root(DSU* dsu, int node) { if (dsu->parent[node] != node) { dsu->parent[node] = find_root(dsu, dsu->parent[node]); } return dsu->parent[node]; } // 合并两个集合 void union_set(DSU* dsu, int node1, int node2) { int root1 = find_root(dsu, node1); int root2 = find_root(dsu, node2); // 如果根节点不同,合并它们 if (root1 != root2) { if (dsu->size[root1] < dsu->size[root2]) { dsu->parent[root1] = root2; dsu->size[root2] += dsu->size[root1]; } else { dsu->parent[root2] = root1; dsu->size[root1] += dsu->size[root2]; } } } // 主函数演示 int main() { DSU* ds = create_set(5); printf("Initial sets: \n"); for (int i = 0; i < 5; i++) { printf("%d -> %d\n", i, find_root(ds, i)); } union_set(dsu, 0, 2); union_set(dsu, 3, 4); printf("\nAfter merging: \n"); for (int i = 0; i < 5; i++) { printf("%d -> %d\n", i, find_root(ds, i)); } return 0; } ``` 这个例子中,我们首先创建了一个包含5个元素的并查集。在`main`函数中,我们展示了如何初始化并查找每个元素的根,以及如何合并两个集合。运行这个程序,你可以看到合并操作后的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值