• 删除数据库中相同内容元素的方法是非常常见的问题,数据重复会占用许多不必要的空间。
  • 如集合​​arr1[] ={11, 22, 33, 44, 55}; arr2[] ={23, 11, 64, 55, 98};​​​都具有相同的元素​​{11, 55}​​​,那么如何将​​arr2​​​中的元素添加到​​arr1​​呢?
  • 从​​arr2​​​中的第一个元素​​arr2[0]=23​​​和​​arr1​​​中的​​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)。
  • 算法来源:高三刷计基题有大量重复的题目,如何减少重复的题目,减少不必要的时间。




❤️本文来自作者:​​MrFlySand​​,请注明原文链接​

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