比较高效地实现从两个不同数组中提取相同部分组

系统 1299 0

        有时候我们需要从两个不同数组中提取出相同的部分的数组或者计算有多少个相同的项,这个算法刚好能派上用场,

实现方案:
1、将两个数组按从小到大排序;
2、遍历第一个数组 array1,跟第二个数组 array2 做比较;
3、如果找到相等的则提取出该数据并且记录下 array2 的下标到临时变量 t,下次循环则从 array2[t+1] 开始遍历 array2;
4、如果没有匹配到相等的而且 array2[t] 大于与 array1 对比的数据时, 记下 array2 当前下标到临时变量 t,下次循环则从 array2[t] 开始;

经过测试,该算法比“最笨”的作法无法在数组以何种方式排序都要强,如果量越多会越明显,有点可惜的是暂时只能使用在 Int[] 上,有时间再想一下其它数据类型的比较

获取两个整型数组中相等项的集合
<!----> 获取两个整型数组中相等项的集合 #region   获取两个整型数组中相等项的集合

/**/ ///   <summary>
///  获取两个整型数组中相等项的集合
///   </summary>
///   <param name="array1"></param>
///   <param name="array2"></param>
///   <returns></returns>

public   static   int [] CompareEquation( int [] array1,  int [] array2)
{
    
int  i1, i2;
    
//  记录第二个数组上一次匹配到的位置
     int  t  =   0 ;
    
//  记录相同的项
    List < int >  equal  =   new  List < int > ();

    
int [] sort1  =  BubbleSort(array1);
    
int [] sort2  =  BubbleSort(array2);

    
for  ( int  i  =   0 ; i  <  sort1.Length; i ++ )
    
{
        i1 
=  sort1[i];

        
for  ( int  j  =  t; j  <  sort2.Length; j ++ )
        
{
            i2 
=  sort2[j];

            
if  (i2  ==  i1)
            
{
                equal.Add(i2);
                
//  下次比较从下一位开始
                t  =  j  +   1 ;
            }

            
else   if  (i2  >  i1)
            
{
                
//  下次比较继续从这里开始
                t  =  j;
                
break ;
            }

        }

    }


    
return  equal.ToArray();
}


#endregion

冒泡法排序(非原创)
<!----> 冒泡法排序(非原创) #region  冒泡法排序(非原创)

/**/ ///   <summary>
///  冒泡法排序
///   </summary>
///   <returns> 排序结果: 从小到大(升序) </returns>
///   <see cref="http://www.aspcool.com/lanmu/browse1.asp?ID=1223&bbsuser=csharp"/>

public   static   int [] BubbleSort( int [] R)
{
    
int  i, j, temp;
    
// 交换标志 
     bool  exchange;
    
// 最多做R.Length-1趟排序 
     for  (i  =   0 ; i  <  R.Length; i ++ )
    
{
        
// 本趟排序开始前,交换标志应为假 
        exchange  =   false ;
        
for  (j  =  R.Length  -   2 ; j  >=  i; j -- )
        
{
            
// 交换条件 
             if  (R[j  +   1 <  R[j])
            
{
                temp 
=  R[j  +   1 ];
                R[j 
+   1 =  R[j];
                R[j] 
=  temp;
                
// 发生了交换,故将交换标志置为真 
                exchange  =   true ;
            }

        }

        
// 本趟排序未发生交换,提前终止算法 
         if  ( ! exchange)
        
{
            
break ;
        }

    }


    
return  R;
}


#endregion

测试结果:



所谓的最笨的方法:

自我感觉最笨的作法
<!----> 计算两个整型数组中数值相等的数量(最笨的方法) #region  计算两个整型数组中数值相等的数量(最笨的方法)

/**/ ///   <summary>
///  计算两个整型数组中数值相等的数量(最笨的方法)
///   </summary>
///   <param name="array1"></param>
///   <param name="array2"></param>
///   <returns></returns>

public   static   int [] CompareEquation1( int [] array1,  int [] array2)
{
    List
< int >  equal  =   new  List < int > ();

    
foreach  ( int  i1  in  array1)
    
{
        
foreach  ( int  i2  in  array2)
        
{
            
if  (i1  ==  i2)
            
{
                equal.Add(i1);
            }

        }

    }

    
return  equal.ToArray();
}


#endregion

从图中可以看到运行效率有了很大的提升,
以上只是不成熟的解决方案,欢迎各位一起来讨论!

相关代码下载

比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论