1.并查集
#define SIZE 100int UFSets[SIZE];void Initial(int S[]) {for (int i = 0; i < SIZE; i++)S[i]=-1;}int Find(int S[], int x) {//查while(S[x] >= 0)x = S[x];return x;}void Union(int S[], int Root1, int Root2) {//并if(Root1 == Root2)return;S[Root2] = Root1;}
Find操作最坏时间复杂度:O(n)
Union操作最坏时间复杂度:O(1)
优化Union操作,小树并入大树,减少Find操作的复杂度。
2.优化
void Union(int S[], int Root1, int Root2) {if(Root1 == Root2)return;if(Root2 > Root1) {S[Root1] += S[Root2];S[Root2] = Root1;}else {S[Root2] += S[Root1];S[Root1] = Root2;}}
Find操作最坏时间复杂度:O(logn)
2.进一步优化:压缩路径
优化Find操作,使树更矮。
int Find(int S[], int x) {int root = x;while(S[x] >= 0)root = S[root];while(x != root) {int t = S[x];S[x] = root;x = t;}return root;}
Find操作最坏时间复杂度:O(α(n))