并查集的优化措施
来源:互联网 发布:云计算都招聘什么岗位 编辑:程序博客网 时间:2024/06/05 09:13
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MaxN 10000int a[MaxN];int find(int X){if(a[X]!=X)return find(a[X]);elsereturn X;//找根节点 }void Union(int x,int y){int x1,x2;x1=find(x);x2=find(y);//找两个集合所在元素的根节点 if(x1!=x2)a[x1]=x2;//合并根节点,即合并集合 } int main(){int N;scanf("%d",&N);int i;for(i=1;i<=N;i++)a[i]=i;// 建立N个集合,每个数组中的元素代表这个数组下标的父节点,如果下标与元素相同//说明这个节点为根节点 return 0;}
这是基础的并查集,效率略低,如果树的高度过高就会很慢
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MAXN 1000typedef int ElementType;typedef int SetName;typedef ElementType SetType[MAXN];void Union(SetType S,SetName Root1,SetName Root2)//这里假设Root1 , Root2均为根不同集合的根节点,根节点里的数字代表集合的个数 {if(S[Root1]<S[Root2]){S[Root2]+=S[Root1];S[Root1]=Root2;} else{S[Root1]+=S[Root2];S[Root2]=Root1;}} //优化后的合并方法,实现了小树并到大树里,可以有效减少Find的搜索次数 SetName Find(SetType S,ElementType X){if(S[X]<0)return X;elsereturn S[X]=Find(S,S[X]);//路径压缩 } int main(){int N;scanf("%d",&N);SetType S;int i ; for(i=1;i<=N;i++)S[i]=-1;//初始化N个集合,并将根节点赋值为负数,符号后面的数字代表了集合的元素个数// 例如 S[1]=-2代表了下标为1的位置的节点是一个根节点,且此集合中有两个元素 return 0;}
这是优化后的,
思路出自中国大学MOOC陈越何欣铭的数据结构课堂讲课
http://www.icourse163.org/learn/ZJU-93001#/learn/content?type=detail&id=1002635019&cid=1002891124
1 0
- 并查集的优化措施
- 并查集的优化
- 并查集优化
- 并查集的链表优化
- 并查集的“并优化”(leader合并)和“查优化”(路径压缩)
- J2ME 的优化措施
- MySQL的优化措施
- frindship(优化并查集)
- 并查集及优化
- hdu1512 & zoj2334Monkey King (左偏树 + 并查集(非优化的朴素并查集))
- 一个并查集问题的优化(CDOJ 203)
- 并查集的迭代优化-食物链
- kruskal-边的贪心(并查集优化)-3
- 算法:并查集的实现及简单优化
- 并查集的优化---路径压缩与启发式合并
- 正则表达式的优化措施
- 博客站的优化措施
- CUDA 优化的一些措施
- protected-broadcast 规范使用系统应用组件自定义广播
- hud 1428 漫步校园 优先队列+记忆化搜索
- 进程调度时机与进程切换分析
- 利用Anaconda简单安装scrapy框架
- CodeForces
- 并查集的优化措施
- 编译过程的一些知识,针对C/C++
- 获取最小的未被占用的串口号
- 二叉树的遍历初学
- 对集群进行集中管理
- 二叉树的中序遍历
- C++ 让人迷惑的复制构造函数和赋值运算符的区别
- Tarjan求割点——HDU 4587
- Permission is only granted to system apps