给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?

来源:互联网 发布:线性优化算法 编辑:程序博客网 时间:2024/05/24 20:07

这个问题首先想到的是一个O(nlogn)的算法。就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。用C++实现代码如下:

 

  1. bool findcommon(int a[],int size1,int b[],int size2)
  2. {
  3.      int i;
  4.      for(i=0;i<size1;i++)
  5.      {
  6.           int start=0,end=size2-1,mid;
  7.           while(start<=end)
  8.           {
  9.                mid=(start+end)/2;
  10.                if(a[i]==b[mid])
  11.                     return true;
  12.                else if (a[i]<b[mid])
  13.                     end=mid-1;
  14.                else
  15.                     start=mid+1;
  16.           }
  17.      }
  18.      return false;
  19. }

后来发现有一个 O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进 。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。

  1. bool findcommon2(int a[], int size1, int b[], int size2)
  2. {
  3.      int i=0,j=0;
  4.      while(i<size1 && j<size2)
  5.      {
  6.           if(a[i]==b[j])
  7.                return true;
  8.           if(a[i]>b[j])
  9.                j++;
  10.           if(a[i]<b[j])
  11.                i++;
  12.      }
  13.      return false;
  14. }