第8章 不相交集类
等价关系是满足下列三个性质的关系R
1. (自反性)对于所有的a属于S,aRa。
2. (对称性)aRb 当且仅当 bRa。
3. (传递性)若aRb且bRc则aRc。
不相交集合 union(不是最好的方法)
1 public class DisjSets 2 { 3 public DisjSets(int numElements) 4 { 5 s = new int[numElements]; 6 for (int i = 0; i < numElements; i++) 7 s[i] = 1; 8 } 9 public void union(int root1, int root2) 10 { 11 s[root2] = root1; 12 } 13 public int find(int x) 14 { 15 if (s[x] < 0) 16 return -1; 17 else 18 return find(s[x]); 19 } 20 21 private int[] s; 22 }
按高度(秩)求并的程序
1 public void union1(int root1, int root2) 2 { 3 if (s[root2] < s[root1]) 4 s[root1] = root2; 5 else 6 { 7 if (s[root1] == s[root2]) 8 s[root1]--; 9 s[root2] = s[root1]; 10 } 11 }
用路径压缩对不相交集进行find的程序
1 public int find1(int x) 2 { 3 if (s[x] < 0) 4 return x; 5 else 6 return s[x] = find(s[x]); 7 }
部分路径压缩
算法A是标准的按秩求和路径压缩操作的序列。我们设计算法B,使其与算法A进行完全一样的路径压缩操作序列。在算法B中,我们在做任何查找之前就把所有求并做完。于是算法A中的每个查找操作被算法B中一次部分查找替换。一次部分查找操作可确定要查的项以及路径压缩一路向上所处理到的那个节点。该节点就是在算法A中做对应的查找时会得到的那个根节点。