标签:数据结构
动态链接:
这里union(x,y) 相当于一个函数,这个函数建立两个点,x,y的链接。而connected(x,y)用于检测两点的链接性,即是否处于链接状态.
connected(0,7)就是用于检测0,7这两点是否相连。
Union find能做很酷帅的事情,迷宫连通图的查找~
对链接性进行建模
把“链接” 等效为三种形式:
自身式: P 链接向P
双向式: P链接向Q,Q链接向P
传递式:P链接向Q,Q链接向R,于是我们说P链接向R
Union-find data type (API)
void union(int p, int q) boolean connected(int p, int q)
感觉这个API设计的还是不够合理(个人观点),仅仅靠输入的p,q是无法对所有元素操作的,意味着这里函数要额外的获取一个全局变量去多所有元素进行操作。而这对于函数的封装性是不好的.
函数应该尽可能少的去依赖除了入口参数以外的数据.当外部全局变量发生变化时不至于影响函数内部(函数内部如果没有依赖外部的全局变量的话),从而提高函数的健壮性.
于是 API的入口更改如下:
void union_element(int* p_array,int size,int p, int q); int connected_element(int* p_array,int size,int p,int q);
这里给出自己的C 语言实现
/*********************************************************
code writer : EOF
code date : 2014.09.07
code file : union_find.c
e-mail : jasonleaster@gmail.com
code purpose :
A demo for union-find.
If there is something wrong with my code, please
touch me by e-mail. Thank you. :-)
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#define SAME 1
#define DIFF 0
#define DEBUG
//----------------------------------------------------
void union_element(int* p_array,int size,int p, int q);
int connected_element(int* p_array,int size,int p,int q);
//----------------------------------------------------
int init_element(int* p_array,int size);
int main()
{
int num = 0;
int ret = 0;
int* all_element = NULL;
printf("Please input how many number in your union group\n");
while(!scanf("%d",&num))
{
getchar();
printf("scanf error, please input again\n");
}
all_element = (int*)malloc(sizeof(int) * num);
init_element(all_element,num);
/*
** It's time to test our API
*/
#ifdef DEBUG
union_element(all_element,num,4,3);
union_element(all_element,num,3,8);
union_element(all_element,num,6,5);
union_element(all_element,num,9,4);
union_element(all_element,num,2,1);
ret = connect_element(all_element,num,0,7);
if(ret == SAME)
{
printf("Y Connected!\n");
}
else if (ret == DIFF)
{
printf("X Unconnected!\n");
}
ret = connect_element(all_element,num,8,9);
if(ret == SAME)
{
printf("Y Connected!\n");
}
else if (ret == DIFF)
{
printf("X Unconnected!\n");
}
#endif
free(all_element);
all_element = NULL;
return 0;
}
void union_element(int* p_array,int size,int p, int q)
{
if(!p_array)
{
printf("function:%s line: %d p_array is NULL\n",__FUNCTION__,__LINE__);
return ;
}
if(p > (size-1) || q > (size-1))
{
printf("index 'p' 'q' are bigger than the max size of array\n");
printf("p: %3d q: %3d",p,q);
return ;
}
int p_union = p_array[p];
int q_union = p_array[q];
int tmp = 0;
for(tmp = 0; tmp < size ;tmp++)
{
if(p_array[tmp] == p_union)
{
p_array[tmp] = q_union;
}
}
}
int connect_element(int* p_array,int size,int p ,int q)
{
if(!p_array)
{
printf("function:%s line: %d p_array is NULL\n",__FUNCTION__,__LINE__);
return -1;
}
if(p > (size-1) || q > (size-1))
{
printf("index 'p' 'q' are bigger than the max size of array\n");
printf("p: %3d q: %3d",p,q);
return ;
}
if(p_array[p] == p_array[q])
{
return SAME;
}
else
{
return DIFF;
}
}
int init_element(int* p_array,int size)
{
if(!p_array)
{
printf("p_array is NULL!\nNeedless to initialize\n");
return -1;
}
int tmp = 0;
for(tmp = 0; tmp < size; tmp++)
{
p_array[tmp] = tmp;
}
}标签:数据结构
原文地址:http://blog.csdn.net/cinmyheart/article/details/39106305