最近测试了下并查集,发现之前写的效率不是很高。一定要进行路径压缩的情况下,查询的均摊效率才接近反阿卡曼函数,可以约等于常数,这里并没有统计权值,速度会略慢,但是也比较快了,而且省了一些空间。
class UnionSet
{
private int[] parent;
private int groupNum;
public UnionSet(int n)
{
parent = new int[n];
for (int i = 0; i < n; ++i)
{
parent[i] = i;
}
groupNum = n;
}
public int Find(int i)
{
while (i != parent[i])
{
parent[i] = parent[parent[i]];
i = parent[i];
}
return i;
}
public void Unite(int a, int b)
{
int x = Find(a);
int y = Find(b);
if (x == y) return;
parent[x] = y;
groupNum--;
}
public bool InSameSet(int a, int b)
{
return Find(a) == Find(b);
}
public int GetGroups()
{
return groupNum;
}
public Dictionary<int, List<int>> GetEachGroup()
{
Dictionary<int, List<int>> res = new Dictionary<int, List<int>>();
for (int i = 0; i < parent.Length; ++i)
{
int gid = Find(parent[i]);
if (!res.ContainsKey(gid))
res.Add(gid, new List<int>());
res[gid].Add(i);
}
return res;
}
}
另外安利下《算法》第四版,那本橙色的,写的真的不错。很多数据结构都是深受启发,并根据他们的代码进行优化。不过到现在我也没有理清楚红黑树的删除。