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

转载 2006年05月27日 10:45:00
有时候我们需要从两个不同数组中提取出相同的部分的数组或者计算有多少个相同的项,这个算法刚好能派上用场,

实现方案:
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

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

相关代码下载

采用归并排序算法查找两个字符串数组中的不同数据

现在项目中有需求比较两个字符串数组,找出其中不同的部分,并保存到本地txt。实现方式每个人都有自己的思路,这里提供一种通过归并排序实现的方式供大家参考。  基本思路是数组A和数组B对比,使用数组a来保...
  • u010926964
  • u010926964
  • 2015年12月28日 16:47
  • 2574

java 从两个数组中选出相同和不同的值,java数组比较

public static void main(String[] args) { String[] oldimg = {"a","b","c","d"}; String[] newimg...
  • Darling_for
  • Darling_for
  • 2017年09月22日 10:28
  • 335

[iOS开发]判断两个数组中数据是否相同

工作中遇到的问题,话不多说了。直接上代码。  NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil]; NSArray ...
  • u010130947
  • u010130947
  • 2014年12月03日 15:45
  • 10303

【C语言】比较两个数组中是否有相同的元素

比较两个数组中是否有相同的元素
  • LX18792732127
  • LX18792732127
  • 2016年09月22日 20:33
  • 3578

php中比较两个数组内容,相同部分保留,不同的加上

Array ( [0] => Array ( [0] => 566 [v] => [1] => 2.9.0-R-20140519.0458 [version] => 2.9.0-R-20140519....
  • xiao_ju
  • xiao_ju
  • 2014年05月28日 10:22
  • 2007

怎么比较两个数组中的元素,取出相…

怎么比较两个数组中的元素,取出相同的元素 array1=@[@"1",@"2",@"3"]; array2=@[@"1",@"2",@"3",@"4",@"5",@"6"]; 拿array1和...
  • a416863220
  • a416863220
  • 2014年11月14日 09:39
  • 2101

两个数组比较,去掉重复的数据后生成第三个数组,这个怎么实现?

http://q.cnblogs.com/q/29690/
  • zunguitiancheng
  • zunguitiancheng
  • 2014年02月16日 22:51
  • 1332

Java对数组的操作(三)—比较两个数组中的元素是否相同的最简单方法

Java对数组的操作(三)—比较两个数组中的元素是否相同的最简单方法
  • wangshuxuncom
  • wangshuxuncom
  • 2014年06月10日 12:04
  • 6783

ios 比较两个数组的数据的不同

- (BOOL)filterArr:(NSArray *)arr1 andArr2:(NSArray *)arr2 { NSPredicate * filterPredicate = [NSP...
  • kpyue
  • kpyue
  • 2016年12月19日 18:38
  • 1748

比较两个数组中相同元素并打印出来

这个方法比较笨,但是里面也有一点可以学习的东西。asList的用法没那么
  • u014080514
  • u014080514
  • 2014年11月13日 00:09
  • 656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较高效地实现从两个不同数组中提取相同部分组成新的数组(暂时只支持Int类型)
举报原因:
原因补充:

(最多只允许输入30个字)