如何找到C中两个数组之间的差异?

How to find the difference between two arrays in C?

我一直在尝试编写 C 程序来查找两个数组之间的并集、交集和差集,虽然前两个运行良好,但我在查找两个数组之间的差集时遇到了一些问题。不同的是,我指的是 array1 中的每个元素,而不是 array2 中的每个元素。

我希望第三个数组包含 array1 中不在 array2 中的每个元素,反之亦然。所以如果 array1 是 [1, 2, 3],arr2 是 [3, 4, 5],那么 arr3 就是 [1, 2]。如果两个数组的大小不同,我也不确定如何找到差异。

我的输出是一堆零和负数:

区别是:1

区别是:2

区别是:-14200

区别是:0

区别是:-14340

区别是:0

这是我一直在使用的代码:

#include <stdio.h>

int main()
{
  int arr1[100];
  int arr2[100];
  int size1, size2, i, j, s=0;

  //enter array size
  printf("\nPlease enter array1 size: \n");
  scanf("%d", &size1);
  printf("\nPlease enter array2 size: \n");
  printf("\n--------------------------- \n");
  scanf("%d", &size2);

  //setting up a third array to contain the difference
  int tot_size = size1+size2;
  int arr3[tot_size];


  //enter array elements
  for(i=0;i<size1;++i)
  {
    printf("\nPlease enter array1 element %d:\n", i);
    scanf("%d", &arr1[i]);
  }
  printf("\n--------------------------- \n");
  for(i=0;i<size2;++i)
  {
    printf("\nPlease enter array2 element %d:\n", i);
    scanf("%d", &arr2[i]);
  }

  printf("\n--------------------------- \n");


  //compare the two arrays, if two elements are not equal
  //store them in a third array
  for(i = 0; i < size1; i++)
  {
    for(j = 0; j < size2; j++)
    {
      if(arr1[i] != arr2[j])
      {
        arr3[s] = arr1[i];
        ++i;
        ++j;
        ++s;
      }
    }
  }

  for(i=0;i<s;++i)
    printf("\nThe difference is: %d\n", arr3[i]);

}

任何帮助将不胜感激,因为我是 C 语言的新手,还有很多东西要学。

如果两个数组之间的差异是第一个数组中的数字而不是第二个数组中的数字和第二个数组中的数字而不是第一个数组中的数字,您可以简单地执行以下操作:

  • 创建一个结果数组,并将第一个和第二个数组复制进去。

    arr1 = [3, 5, 7, 0]

    arr2 = [1, 10, 5]

    arr3 = [arr1, arr2] ==> [3, 5, 7, 0, 1, 10, 5]

  • 然后,对数组进行排序(使用 qsort,或任何其他排序函数)

    arr3 = [0, 1, 3, 5, 5, 7, 10]

  • 最后,把出现不止一次的号码删掉(排序步骤真的很简单,一次就搞定)

    arr3 = [0, 1, 3, 7, 10]


评论后:所以,arr1 和 arr2 之间的区别是 arr1 中的数字而不是 arr2 中的数字?您的第一个代码更有意义。

你应该做一些功能,以方便你。

  • 创建一个"IsNumberInArray"函数

    bool IsNumberInArray(int number, int *array, size_t arraySize)

我把实现留给你(如果数组已排序,你可以实现二分法搜索,否则你可以做一个很好的旧循环)。

  • 然后,对于arr1中的每个数字,如果IsNumberInArray(arr1[i], arr2, size2)为假,则在arr3中添加arr1[i]。

基本上,这几乎就是您所做的。您的问题在于 "inversed" 条件(数字是否在第二个数组中?)和第二个循环中的 "how to break" 很容易。该功能将提供。

请注意,由于 arr3 只会保留 arr1 中不存在的编号,因此 arr3 的大小可以为最大 size1。这就是为什么我首先假设你想要 arr1 和 arr2 中的唯一编号,因为 tot_size 是 size1 + size2.


通常,"easy"问题我不会给出代码,因为如果你不能自己解决它,那意味着你需要练习,给你答案对你没有用,但是既然sg7做到了,拿着就没有意义了(而且你暂时不能使用房间),所以这里实现一下算法:

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

bool IsNumberInArray(int number, int *array, size_t arraySize)
{
    for (size_t i = 0; i < arraySize; ++i) {
       if (array[i] == number) {
           return (true);
       }
    }

    return (false);
}

void DumpArrayContent(int *array, size_t arraySize, char *arrayName)
{
    printf("%s has %zu elements:\n", arrayName ? arrayName : "array", arraySize);               
    for (size_t i = 0; i < arraySize; ++i) {
        printf("%d ",array[i]);
    }
    printf("\n");    
}

int main(void)
{
    int arr1[] = {1,2,3,4,7,8,9};
    int arr2[] = {3,4,5};

    size_t s1 = sizeof(arr1)/sizeof(*arr1);
    size_t s2 = sizeof(arr2)/sizeof(*arr2);

    int    arr3[s1];
    int    s3 = 0;

    for (size_t i = 0; i < s1; ++i) {
        if (!IsNumberInArray(arr1[i], arr2, s2)) {
           arr3[s3] = arr1[i];
           s3++;
        }
    }

    DumpArrayContent(arr1, s1, "arr1");
    DumpArrayContent(arr2, s2, "arr2");
    DumpArrayContent(arr3, s3, "arr3");

    return 0;
} 

我认为没有更多 "effective" 实现,因为在编译器优化之后,生成的可执行文件将非常相同。如果没有激活编译器优化,sg7 代码会更多 "effective" 因为它是直接的(我的有函数调用)。看你喜欢哪一款了。

看看你的循环,注意内部 for-loop j 在 i 的每次迭代中都被初始化为 0。

  for(i = 0; i < size1; i++)
  {
    for(j = 0; j < size2; j++)
    {
      if(arr1[i] != arr2[j])
      {
        arr3[s] = arr1[i];
        ++i;
        ++j;  // so what does this do?
        ++s;
      }
    }
  }
  
  

让我们尝试看看两个具有不同值的数组会发生什么:

arr1 : {1,2}
arr2 : {3,4}


           i   j   s
iteration  0   0   0  => arr3[0] = 1; 
           1   1   1
               2                        j==2 since j++, leaving inner loop j==size2
iteration  2   0   1                    i==2 since i++, leaving outer loop i==size1

最好是在纸上写下你的步骤并通过你的算法,从一个 简单的例子,然后为它创建一个原型例程,如果行得通,则继续进行更大的 数组、不同长度的数组、相同的数组等等。

I want the third array to contain every element in array1 that is not in array2, and not vica versa. So if array1 is [1, 2, 3], and arr2 is [3, 4, 5], then arr3 is [1, 2].

前提是array1已经处理过不包含重复项,
看起来你需要这个:

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

int main(void)
{
    size_t i,j,k;
    int s3;

    int arr1[] = {1,2,3,4,7,8,9};
    int arr2[] = {3,4,5};

    size_t s1 = sizeof(arr1)/sizeof(int);
    size_t s2 = sizeof(arr2)/sizeof(int);

    int arr3[s1];
    int e;
    int found = 0;
    k = 0;

    for(i=0; i<s1; i++)
    {
        e = arr1[i]; 
        found = 0;

        for(j=0; j<s2; j++){

           if(e == arr2[j])
           {
               found = 1;
               break;
           }
        }

        if(found == 0){
           arr3[k] = e;
           k++;
        }
    }


    printf("arr1 has %d elements:\n",s1);
    for(i=0;i<s1; i++)
    {
        printf("%d ",arr1[i]);
    }

    printf("\narr2 has %d elements:\n",s2);
    for(i=0;i<s2; i++)
    {
        printf("%d ",arr2[i]);
    }

    printf("\narr3 has %d elements:\n",k);               
    for(i=0;i<k; i++)
    {
        printf("%d ",arr3[i]);
    }

    return 0;
}

输出:

arr1 has 7 elements:                                                                                                                         
1 2 3 4 7 8 9                                                                                                                               
arr2 has 3 elements:                                                                                                                        
3 4 5                                                                                                                                       
arr3 has 5 elements:                                                                                                                        
1 2 7 8 9