在求一幅二值图像的连通分量的时候, 用到了合并等价标签算法.
合并等价标签的算法功能描述:
有如下的等价标签对
1==2
1==3
4==3
6==5
4==7
8==5
合并等价标签后, 结果为:
第一组等价标签: 1,2,3,4,7
第二组等价标签: 5,6,8
c++实现:
- #include <conio.h>
- #include <stdio.h>
- #include <iostream>
- #include <list>
- using namespace std;
- // :合并后的一个等价标签组
- class EqualTagSet
- {
- public:
- list<int> tagList;
- };
- // :合并算法
- // :inputs
- // : vec1[] : 等价标签对左侧值
- // : vec2[] : 等价标签对右侧值
- // : size : vec1中元素个数
- // :outputs
- // : equalTagSetList : 合并后的等价标签组链表
- // :return void
- void hebing( int vec1[], int vec2[], int size, list<EqualTagSet*>& equalTagSetList )
- {
- if ( 0>size )
- {
- return ;
- }
- // :处理每一个等价标签对,插入到相应的等价标签组中
- for (int i=0; i<size; ++i)
- {
- list<EqualTagSet*>::iterator iter;
- bool bFinded = false;
- // :遍历已有的每一个等价标签组
- for (iter=equalTagSetList.begin(); iter!=equalTagSetList.end(); ++iter)
- {
- list<int>::iterator iiter;
- for ( iiter=(((EqualTagSet*)(*iter))->tagList).begin(); iiter!=(((EqualTagSet*)(*iter))->tagList).end(); ++iiter )
- {
- if ( vec1[i] == *iiter )
- {
- (**iter).tagList.push_back(vec2[i]);
- bFinded = true;
- }
- if ( vec2[i] == *iiter )
- {
- (**iter).tagList.push_back(vec1[i]);
- bFinded = true;
- }
- if (bFinded)
- {
- break;
- }
- }// for
- if( bFinded )
- {
- break;
- }
- }// for
- // :遍历玩所有的等价标签组,也没有找到该标签
- // :新建一个等价标签组
- if (!bFinded)
- {
- EqualTagSet* ptmp = new EqualTagSet();
- ptmp->tagList.push_back(vec1[i]);
- ptmp->tagList.push_back(vec2[i]);
- equalTagSetList.push_back(ptmp);
- }
- }
- }
- void main( void )
- {
- // :输入等价标签对
- // :1==2, 1==3, 4==3, 6==5, ...
- int vec1[] = {1,1,4,6,4,8};
- int vec2[] = {2,3,3,5,7,5};
- int size = 6;
- list<EqualTagSet*> equalTagSetList;
- hebing( vec1, vec2, size, equalTagSetList );
- // :打印结果
- list<EqualTagSet*>::iterator iter;
- for (iter=equalTagSetList.begin(); iter!=equalTagSetList.end(); ++iter)
- {
- list<int>::iterator iiter;
- for ( iiter=(((EqualTagSet*)(*iter))->tagList).begin(); iiter!=(((EqualTagSet*)(*iter))->tagList).end(); ++iiter )
- {
- cout<<*iiter<<" ";
- }
- cout<<endl;
- }
- // :释放 equalTagSetList 资源.
- // for ... 略去.
- _getch();
- }