在O(N * log(N))时间内比较两个不同大小的int数组?

时间:2012-01-03 17:42:52

标签: c arrays comparison

我需要比较两个不同大小的int数组。

必须最有效率。

是否可以在O(N * log(N))时间内完成?

它应该打印两个数组之间不同的整数。

3 个答案:

答案 0 :(得分:1)

算法为O(n),但您假设数组的大小相同,且每个数组的大小为ARY_SIZE

我不会为您解决整个作业,但我建议您从以下函数标题开始:int compar2arr(int arrA[], int arrA_size, int arrB[], int arrB_size)

请注意,对于函数参数int arrA[]仅等同于int* arrA

正如Keith和Sebastian所指出的那样,arrA_size != arrB_size意味着不同(除非任务的作者以其他方式定义它)。所以你在开始时检查它并返回false如果它成立。

修改

好的,我重新阅读你的帖子,看来你需要只显示所有不相等的元素,而你不知道如何处理它们的大小不同的事实。

因此我建议从以下开始:

int compar2arr(int arrA[], int arrA_size, int arrB[], int arrB_size)
{
   int smaller_size = // arrA_size or arrB size, the smaller one; 
   int higher_size = // arrA_size or arrB size, the higher one; 
   int *bigger_array;  
   int i;     
   int result = true;

   if (arrA_size > arrB_size)
       bigger_array = arrA;
   else
       bigger_array = arrB;

   for (i = 0; i < smaller_size; i++)
   {
      if (/* i-th elements are not(!!) equal */)
      {
         result = false;
         // print the values to be different
      }
   }

   if (smaller_size != higher_size)
     result = false;

   for (i = smaller_size; i < higher_size; i++)
   {
       // print bigger_array[i]
   }

   return result;
}

我相信你可以拿出实际的代码来替换评论。 这不是最简洁的写作方式,但希望让它易于理解。无论如何,计算复杂度是O(n),最好的。

答案 1 :(得分:1)

如果两个数组的大小不同,那么它们已经不同了,不需要比较内容,只需要大小。

答案 2 :(得分:1)

如果您只需要打印不同的元素,则在0(n)时间内无法打印。解决问题的最佳方法是对两个数组进行排序(使用qsort),然后从零循环到两个数组中较小的数组。

此外,如果您尝试打印所有不匹配的整数,则在到达第一个不同的整数时无法中断。您想要做的是每次找到不匹配的元素时打印出“%d与索引%d处的%d不匹配”或类似的东西。

最后,如果大小不相等,我会遍历较长数组的最后一部分并打印出额外的元素。