集合

创建: 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];
    }
}

 

 

   
   
   
   
   
   
   
   
练习
   
   
   
   
   
   
   
   
   
posted @ 2018-06-01 01:27  懒虫哥哥  阅读(109)  评论(0编辑  收藏  举报