删除集合中相同的元素, 求并集

  • 删除数据库中相同内容元素的方法是非常常见的问题,数据重复会占用许多不必要的空间。
  • 如集合arr1[] ={11, 22, 33, 44, 55}; arr2[] ={23, 11, 64, 55, 98};都具有相同的元素{11, 55},那么如何将arr2中的元素添加到arr1呢?
  • arr2中的第一个元素arr2[0]=23arr1中的arr[i++]所有元素进行遍历比较。如果有相同的元素就break,这样可以减少循环步骤;如果没有相同的元素,则将这个元素加到arr1中。
  • 代码如下:
#include"stdio.h"
//输出
int print(int arr[], int arrayLength){
    for(int i = 0; i < arrayLength; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}
//并集
int unions(int *p1, int *p2){
   int unions[10] = {0}, index = 5;
   for(int m=0; m<5; m++){
      *(unions+m)=*(p1+m);
   }
   int arrFlag=5;
   for(int i=0;i<5;i++){
      int flag=0;
      for(int j=0;j<10;j++){
         if(*(unions+j) != *(p2+i) && *(unions+j)!=0){
             ++flag;
         }
      }
      if(flag==arrFlag){
         ++arrFlag;
         *(unions+index++) = *(p2+i); 
      }
   }
   printf("集合的并集是:");
   print(unions,10);
}
int main(){
   int arr1[] ={11, 22, 33, 44, 55}; 
   int arr2[] ={23, 11, 64, 55, 98};
   int arrayLength = sizeof(arr1)/4;
   printf("原集合:");
   print(arr1,arrayLength);
   print(arr2,arrayLength);
   unions(arr1,arr2);
} 
  • 从上面论述中可以发现,数组arr2中的所有元素要和数组arr1的所有元素进行比较,这样时间复杂度为O(n*m),n为arr1元素的个数,m为arr2元素的个数。如果有100个数据,则要进行10000次比较,所以是十分浪费时间的。
  • 改进方法:将数组arr1中的所有元素进行排序,用arr2中的元素在数组arr1中的所有元素进行二分查找(时间复杂度:O(log2n)),这样可以大大减少执行步骤。时间复杂度为:O(n log n + log2n)。
  • 算法来源:高三刷计基题有大量重复的题目,如何减少重复的题目,减少不必要的时间。
posted @ 2020-12-13 13:12  MrFlySand-飞沙  阅读(207)  评论(0编辑  收藏  举报