您的位置:首页 > 其它

并查集的启发式合并

2017-10-16 21:01 316 查看
在原来刚接触并查集的时候,感觉确实很方便,也是认为并查集就那么点东西,简单方便,但是后来无意间发现了一个并查集的启发式合并,可以对并查集进行优化,它优化的理论是用一个数组来记录每个节点的深度,每一次合并都把节点向深度(高度)大的节点上进行合并,从而对最后的“生成树”深度进行了优化。受益匪浅,好长时间没写过博客了。。。emmm。。。

下面附带一个递归压缩路径找父节点的函数(其实很简单的那个)

rank 数组并没有给出,自己建立一个清零即可使用

int getf(int v) //查找他的父节点
{
if(v == f[v])
return f[v];
else
{
f[v] =getf(f[v]);
}
}

//下面为启发式合并的核心代码,增加一个rank数组来储存每个节点的深度,总是把节点并在深度大的节点上
//这样做的好处是在后来查找时可以节省很多时间
void Merge(int u, int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
if(rank[t1] > rank[t2])
{
f[t2] = t1;
}
else if(rank t1 < rank[t2])
{
f[t1] = t2;
}
else
{
f[t2] = t1;
rank[t1]++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: