并查集
用树形结构来表示元素和所属子集的关系
find算法:
int UFSets::Find(int x)
{
if(parent[x]<0)
return x;
else
return Find(parent[x]);
}
Union操作
为了得到两个集合的并,只要将表示其中一个集合的树的根节点置为另一个集合的树的根节点的子女即可。
Union的加权规则
如果以i为根的树中节点个数小于以j为根的树中节点个数,则让j成为i的父。加权后树的高度不超过 ⌊ l o g 2 m ⌋ \lfloor log_{2}m\rfloor ⌊log2m⌋
int UFSets::WeightedUnion(int Root1,int Root2)
{
int r1=Find(Root1),r2=Find(Root2),temp;
if(r1!=r2)
{
temp=parent[r1]+parent[r2];
if(parent[r2]<parent[r1])
{
//让r1接在r2下面
parent[r1]=r2;
parent[r2]=temp;
}
else
{
//让r1接在r2下面
parent[r2]=r1;
parent[r1]=temp;
}
}
}
应用:等价类划分
字典
一对<key,value>对的集合
不同元素的key各不相同
跳表
0级链是包含所有元素的有序链表,第 2 1 , 2 ∗ 2 1 , 3 ∗ 2 1 . . . 2^{1},2*2^{1},3*2^{1}... 21,2∗21,3∗2