日期:2014-05-18  浏览次数:21072 次

如何取两个已排序数组的交集?
例:
1,3,5,6,7,9
2,4,6,7,8,9
如何能够最快的取出交集.
有没有什么好的算法.我不想去一个一个的循环比较.

------解决方案--------------------
如果你保证每个已排序数组中都没有重复的,
那么将数组a中数据全部插入数组b,从b里边找有重复的项就可以

这算法写起来可能比较简单,但实际上时间复杂度可能还不如循环比较-_-
------解决方案--------------------
循环一个元素较少的数组,用二分法在另外一个数组中查询是否存在.

------解决方案--------------------
不用循环,不用表,好象不可能实现!!!

我这里有个只用一次循环的方法,不知有兴趣否?

把长的数组连接成一个字符串,“2,4,6,7,8,9”
循环短数组,检查短数组中的每个元素在字符串中是否存在。
------解决方案--------------------
这实际上是把另一次循环交给C#去做了
------解决方案--------------------
两个都是排好序的,其实不要循环,只要找到最大值最小值的位置就可以了,用二分法比较就好。
------解决方案--------------------
int[] a = new int[m];
int[] b = new int[n];
ArrayList andData = new ArrayList();
//a与b的初始化
int j = 0;
for(int i = 0;i < m;i++)
{
do
{
if(a[i] == b[j])
{
andData.Add(a[i]);
break;
}
j++;
}while(j < n && a[i] != b[j])
}
return andData;
------解决方案--------------------
1. add 1,3,5,6,7,9 to hash table, key and value use the same value.
2.

foreach(int key in 2,4,6,7,8,9) {
if(hashtbl[key]!=null)
{
hashtbl[key] ----is the data you want.
}
}
------解决方案--------------------
放两个List里,表面效率为O(n);
C# code

 List<int> lst1 = new List<int>() { 1, 3, 5, 6, 7, 9 };
 List<int> lst2 = new List<int>() { 2, 4, 6, 7, 8, 9 };
 for (int i = 0; i < lst1.Count; i++)
 {
    if (lst2.Contains(lst1[i]))
    {
      Console.WriteLine(lst1[i]);
    }
}

------解决方案--------------------
用的是vs2005还是vs2008?
------解决方案--------------------
2008 非常简单
C# code
 
            int[] A=new []{1,2,3,4,5};
            int[] B=new []{2,4,9,10};

            int[] C=A.Intersect(B).ToArray();