合并等价标签算法.

 

在求一幅二值图像的连通分量的时候, 用到了合并等价标签算法.

合并等价标签的算法功能描述:

有如下的等价标签对

1==2

1==3

4==3

6==5

4==7

8==5

 

合并等价标签后, 结果为:
第一组等价标签: 1,2,3,4,7

第二组等价标签: 5,6,8

 

c++实现:

  1. #include   <conio.h>   
  2. #include   <stdio.h>   
  3. #include <iostream>
  4. #include <list>
  5. using namespace std;
  6. // :合并后的一个等价标签组
  7. class EqualTagSet
  8. {
  9. public:
  10.     list<int> tagList;
  11. };
  12. // :合并算法
  13. // :inputs
  14. // :    vec1[]  : 等价标签对左侧值
  15. // :    vec2[]  : 等价标签对右侧值
  16. // :    size    : vec1中元素个数
  17. // :outputs
  18. // :    equalTagSetList : 合并后的等价标签组链表
  19. // :return void
  20. void hebing( int vec1[], int vec2[], int size, list<EqualTagSet*>& equalTagSetList )
  21. {
  22.     if ( 0>size )
  23.     {
  24.         return ;
  25.     }
  26.     
  27.     // :处理每一个等价标签对,插入到相应的等价标签组中
  28.     for (int i=0; i<size; ++i)
  29.     {
  30.         list<EqualTagSet*>::iterator iter;
  31.         bool bFinded = false;
  32.         // :遍历已有的每一个等价标签组
  33.         for (iter=equalTagSetList.begin(); iter!=equalTagSetList.end(); ++iter)
  34.         {
  35.             list<int>::iterator iiter;
  36.             
  37.             for ( iiter=(((EqualTagSet*)(*iter))->tagList).begin(); iiter!=(((EqualTagSet*)(*iter))->tagList).end(); ++iiter )
  38.             {
  39.                 if ( vec1[i] == *iiter )
  40.                 {
  41.                     (**iter).tagList.push_back(vec2[i]);
  42.                     bFinded = true;
  43.                 }
  44.                 if ( vec2[i] == *iiter )
  45.                 {
  46.                     (**iter).tagList.push_back(vec1[i]);
  47.                     bFinded = true;
  48.                 }
  49.                 if (bFinded)
  50.                 {
  51.                     break;
  52.                 }
  53.             }// for
  54.             if( bFinded )
  55.             {
  56.                 break;
  57.             }
  58.         }// for
  59.         // :遍历玩所有的等价标签组,也没有找到该标签
  60.         // :新建一个等价标签组
  61.         if (!bFinded)
  62.         {
  63.             EqualTagSet* ptmp = new EqualTagSet();
  64.             ptmp->tagList.push_back(vec1[i]);
  65.             ptmp->tagList.push_back(vec2[i]);
  66.             equalTagSetList.push_back(ptmp);
  67.         }
  68.         
  69.     }
  70. }
  71. void   main(   void   )   
  72. {   
  73.     // :输入等价标签对
  74.     // :1==2, 1==3, 4==3, 6==5, ...
  75.     int vec1[] = {1,1,4,6,4,8};
  76.     int vec2[] = {2,3,3,5,7,5};
  77.     int size = 6;
  78.     list<EqualTagSet*> equalTagSetList;
  79.     hebing( vec1, vec2, size, equalTagSetList );
  80.     
  81.     // :打印结果
  82.     list<EqualTagSet*>::iterator iter;
  83.     for (iter=equalTagSetList.begin(); iter!=equalTagSetList.end(); ++iter)
  84.     {
  85.         list<int>::iterator iiter;
  86.         for ( iiter=(((EqualTagSet*)(*iter))->tagList).begin(); iiter!=(((EqualTagSet*)(*iter))->tagList).end(); ++iiter )
  87.         {
  88.             cout<<*iiter<<" ";
  89.         }
  90.         cout<<endl;
  91.     }
  92.     // :释放 equalTagSetList 资源.
  93.     // for ... 略去.
  94.     _getch();
  95. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值