集合
创建: 2018/05/01
完成: 2018/05/01
等值关系与等值类 | |
互素集合ADT | |
● makeSet(X) 创建只含有X的集合 ● union(X, Y) 创建含X或Y的集合的并集, 删除原来含X, Y的集合 ● FIND(X) 获取含X的集合名 |
|
应用 |
● 表示网络连接性 ● 图像处理 ● 获取最小共同祖先 ● 压缩算法的等价性定义 # TODO: check [这是啥] ● 最小全域木算法(图像算法) ● 游戏算法 |
实现互素集合 | |
//------------------------------------------------ // Fast Union(Quick FIND) //------------------------------------------------ // 根据集合的size来 // 对应值为负的是集合名 // 函数声明 void makeSet_QuickFind(int s[], int size); int find_QuickFind(int s[], int size, int x); void union_QuickFind(int s[], int size, int root1, int root2); // 实现 void makeSet_QuickFind(int s[], int size) { int i; for (i=0; i<size; i++) { s[i] = -1; } } int validValue = 100000000; int find_QuickFind(int s[], int size, int x) { if (!(x>=0 && x<size)) { return validValue; // 错误值 } if (s[x] < 0) { return x; } else { return find_QuickFind(s, size, s[x]); } } void union_QuickFind(int s[], int size, int root1, int root2) { // 并入大的一方 int group1 = find_QuickFind(s, size, root1); int group2 = find_QuickFind(s, size, root2); if (group1 == validValue || group2 == validValue) { // 有无效值 printf("item invalid\n"); return; } if (group1 == group2) { // 处于同一个集合 return; } if (s[group2] < s[group1]) { // root2元素更多 s[group2] += s[group1]; s[group1] = group2; } else { // root1元素更多或者一样多 s[group1] += s[group2]; s[group2] = group1; } } // 压缩路线 int find_QuickFind_Better(int s[], int size, int x) { if (!(x>=0 && x<size)) { return validValue; // 错误值 } if (s[x] < 0) { return x; } else { s[x] = find_QuickFind(s, size, s[x]); return s[x]; } }
|
|
练习 | |