Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4752481
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-13 13:47:37

两个已排序的整型数组,求交集,最快算法
输入:两个已排序的整型数组(int a[m], b[n])
输出:两个数组的交集
 
当然也可是是判断两个有序数组是否包含的问题,解题思路差不多.
 
写过分治合并程序的一定知道merger函数,对就是这个思路
while(i
 {
   ....
   ....
 }
 
可以引申为链表的问题...ok上代码了
 

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define M 5

void count_common(int A[], int B[])
{
  int i = 0;
  int j = 0;
  
  while(i<N && j<M)
   {
     if(A[i]<B[j])
       i++;
     else if(A[i]>B[j])
       j++;
     else
      {
       printf("%d\t",A[i]);
       i++;
       j++;
      }
   }
   
   printf("\n");
}
 
int check_in(int A[], int B[])
{
  int i = 0;
  int j = 0;
  int ret = 0;
  
  while(i<N && j<M)
   {
     if(A[i]<B[j])
       i++;
     else if(A[i]==B[j])
      {
       i++;
       j++;
      }
     else
      break;
   }
  
  if(j==M)
   ret = 1;
   
   return ret;
}
  
int main(int argc, char *argv[])
{
  int A[N];
  int B[5];
  int i;
    
  for(i=0;i<N;i++)
   A[i] = i+1;
   
  for(i=0;i<M;i++)
   B[i] = 2*i+1;
  
  //B[1] = 4;

  //B[M-1] = 11;

  printf("common is:\n");
  count_common(A, B);
  
  check_in(A, B)?printf("in\n"):printf("not in\n");
   
  system("PAUSE");    
  return 0;
}

阅读(1412) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-17 16:54:40

这样很快,但可以更快 有一种跳表的算法,不需要遍历所有项,就像二分法,比线性遍历时间更少