并查集路径压缩与启发式合并
2014-11-04 08:44
239 查看
〖程序清单〗
初始化:
因为每个元素属于单独的一个集合,所以每个元素以自己作为根结点。
寻找根结点编号并压缩路径:
判断元素是否属于同一集合:
这里有一个优化:让深度较小的树成为深度较大的树的子树,这样查找的次数就会少些。这个优化称为启发式合并。可以证明:这样做以后树的深度为O(logn)。即:在一个有n个元素的集合,我们将保证移动不超过logn次就可以找到目标。
初始化:
并查集的时间复杂度
并查集进行n次查找的时间复杂度是O(n)
它是阿克曼函数(Ackermann Function)的某个反函数。
它可以看作是小于5的。所以可以认为并查集的时间复杂度几乎是线性的。
初始化:
for i:=1 to n do father[i]:=i;
因为每个元素属于单独的一个集合,所以每个元素以自己作为根结点。
寻找根结点编号并压缩路径:
function getfather(v : integer) : integer; begin if father[v]=v then exit(v); father[v]:=getfather(father[v]); getfather:=father[v]; end; //合并两个集合: proceudre merge(x, y : integer); begin x:=getfather(x); y:=getfather(y); father[x]:=y; end;
判断元素是否属于同一集合:
function judge(x, y : integer) : boolean; begin x:=getfaher(x); y:=gefather(y); if x=y then exit(true) else exit(false); end;
这里有一个优化:让深度较小的树成为深度较大的树的子树,这样查找的次数就会少些。这个优化称为启发式合并。可以证明:这样做以后树的深度为O(logn)。即:在一个有n个元素的集合,我们将保证移动不超过logn次就可以找到目标。
function judge(x,y:integer):boolean; var fx,fy : integer; begin fx := getfaher(x); fy := gefather(y); If fx=fy then exit(true) else judge := false; if rank[fx]>rank[fy] then father[fy] := fx else begin father[fx] := fy; if rank[fx]=rank[fy] then inc(rank[fy]); end; end;
初始化:
fillchar(rank,sizeof(rank),0);
并查集的时间复杂度
并查集进行n次查找的时间复杂度是O(n)
它是阿克曼函数(Ackermann Function)的某个反函数。
它可以看作是小于5的。所以可以认为并查集的时间复杂度几乎是线性的。
相关文章推荐
- 并查集的优化---路径压缩与启发式合并
- 并查集(路径压缩 && 启发式合并!!!)
- 并查集——启发式合并,路径压缩
- 并查集的启发式合并 和 路径压缩
- 【模板】【数据结构】并查集(路径压缩+按秩合并)
- 并查集的“并优化”(leader合并)和“查优化”(路径压缩)
- 数据结构实现之并查集(使用按秩合并和路径压缩)
- 并查集 按秩合并&路径压缩
- 并查集讲解(按秩合并与路径压缩),模板与典型例题
- HDOJ 3635 并查集- 路径压缩,带秩合并
- 并查集的两种优化(按秩合并,路径压缩)
- 并查集(2)-按秩合并和路径压缩
- 并查集(两个优化—按秩合并、路径压缩) poj2492
- 并查集(按秩合并、路径压缩)
- Disjointset 并查集(按秩合并,与路径压缩)的模板
- 【算法】并查集—带路径压缩的按秩合并法
- 并查集的优化:按秩合并和路径压缩
- [AOJ 2170]Marked Ancestor[并查集][离线][路径压缩]or[线段树]
- SDUTOJ 2797 电影节 -----非并查集解法和并查集解法(带压缩路径)
- [并查集+路径压缩]zoj 3261:Connections in Galaxy War