- 删除数据库中相同内容元素的方法是非常常见的问题,数据重复会占用许多不必要的空间。
- 如集合
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,转载请注明原文链接