并查集的优化措施
2017-04-16 11:05
197 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define MaxN 10000 int a[MaxN]; int find(int X) { if(a[X]!=X) return find(a[X]); else return 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 1000
typedef 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;
else
return 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
相关文章推荐
- 136_android布局优化措施
- Oracle存储过程编写经验和优化措施(转)
- group by与distinct效率分析及优化措施
- 存储过程编写经验和优化措施
- 存储过程编写经验和优化措施
- 存储过程编写经验和优化措施
- 高性能ASP.NET站点构建之简单的优化措施
- 优化Hibernate所鼓励的7大措施
- J2ME 的优化措施
- SQL Server存储过程编写和优化措施
- 优化Hibernate所鼓励的7大措施:
- Asp.Net 网站优化 数据库优化措施 使用主从库(下)
- 存储过程编写经验和优化措施
- 数据库性能优化措施
- 并查集实现-(秩优化+路径压缩+java)
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 存储过程编写经验和优化措施
- MySQL查询优化讲座之管理员的优化措施
- 最小生成树Kruskal算法与并查集及其优化
- 存储过程编写经验和优化措施