当前位置:首页 » 编程语言 » 数组交集c语言

数组交集c语言

发布时间: 2024-10-24 15:25:57

㈠ 编写程序,实现两个集合的交运算(用c语言

#include<stdio.h>
#include<string.h>
intjiaoji(intA[],intB[],inta,intb)
{
inti,j,t;
t=a;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{
if(A[i]==B[j])
{
A[t]=B[j];
t++;
}
}
for(i=0;i<t-a;i++)
{
A[i]=A[a+i];
}
returnt-a;
}
intmain()
{
intA[50],B[50],a,b,t;
printf("请输入A的元素个数: ");
scanf("%d",&a);
printf("请输入A的元素: ");
for(inti=0;i<a;i++)
scanf("%d",&A[i]);
printf("请输入B的元素个数: ");
scanf("%d",&b);
printf("请输入B的元素: ");
for(inti=0;i<b;i++)
scanf("%d",&B[i]);
t=jiaoji(A,B,a,b);
for(inti=0;i<t;i++)
printf("%d",A[i]);
return0;
}

㈡ c语言求两个数组的并交集

只简单地分析了一下交集的情况,求并集类似。网络知道这个代码支持不怎么好,复制粘贴到 vs 之类的代码编辑器里面缩进一下会比较好看。

见代码如下:

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#include <time.h>


// 使用整型数组为例,其它数组同理


// 交集

// 通过迭代遍历判断相同元素,时间复杂度较高,平方量级

// 传入原数组及其长度、结果数组

// 返回结果数组的长度

// (需要自行保证结果数组足够大)

size_t getIntersection(array1, array1_len, array2, array2_len, result_array)

int* array1, * array2, * result_array;

size_t array1_len, array2_len;

{

size_t result_p = 0;

for (size_t i = 0; i < array1_len; ++i)

{

for (size_t j = 0; j < array2_len; ++j)

{

if (array1[i] == array2[j])

{

result_array[result_p++] = array1[i];

break;

}

}

}

return result_p;

}


// 另一种思路是用快速排序等高效的排序算法先将数组排序,

// 然后再遍历一次数组,这时因为已经排好序了,所以最多只要

// 遍历 array1_len + array2_len 即可,此时时间复杂度较低,

// 因为快速排序等一般是 nlog(n),然后后面接一个一次量级的遍历,

// 总的来说是 nlog(n) + n,也就是 nlog(n),比 n^2 要快一些。


int intAscendingComparor(const void* left, const void* right)

{

return *(int*)left - *(int*)right;

}


// 交集

// 先排序后遍历判断相同元素,时间复杂度较低

// 传入原数组及其长度、结果数组

// 返回结果数组的长度

// (需要自行保证结果数组足够大)

size_t getIntersection_optimized(array1, array1_len, array2, array2_len, result_array)

int* array1, * array2, * result_array;

size_t array1_len, array2_len;

{

size_t result_p = 0;

size_t i = 0;


// 使用标准库的 qsort 比较方便

int* tmpArray = (int*)malloc(sizeof(int) * (array1_len + array2_len));

for (i = 0; i < array1_len; ++i) tmpArray[i] = array1[i];

for (i = 0; i < array2_len; ++i) tmpArray[array1_len + i] = array2[i];

qsort(tmpArray, array1_len + array2_len, sizeof(int), intAscendingComparor);


for (size_t i = 0; i < array1_len + array2_len - 1; ++i)

{

if (tmpArray[i] == tmpArray[i + 1])

{

result_array[result_p++] = tmpArray[i];

do {

++i;

} while (i < array1_len + array2_len - 1 && tmpArray[i] == tmpArray[i + 1]);

}

}


free(tmpArray); tmpArray = NULL;

return result_p;

}


// 自定义的一个简单的输出数组内容的函数

void printArray(int* array, size_t len)

{

for (size_t i = 0; i < len - 1; ++i)

{

printf("%d, ", array[i]);

}

printf("%d", array[len - 1]);

}


int main()

{

clock_t start, end;

int first_array[5] = { 1, 2, 3, 4, 5 };

int second_array[4] = { 4, 5, 6, 7 };

printf("数组1为:{ 1, 2, 3, 4, 5 },数组2为:{ 4, 5, 6, 7 } ");


// 第一种方法

int result_array[10];

start = clock();

size_t result_array_len = getIntersection(first_array, 5, second_array, 4, result_array);

end = clock();

printf("交集为:{ ");

printArray(result_array, result_array_len);

printf(" },使用时间:%d ms ", (end - start) * 1000 / CLOCKS_PER_SEC);


// 第二种方法

start = clock();

result_array_len = getIntersection_optimized(first_array, 5, second_array, 4, result_array);

end = clock();

printf("使用优化算法求出的交集:{ ");

printArray(result_array, result_array_len);

printf(" },使用时间:%d ms ", (end - start) * 1000 / CLOCKS_PER_SEC);


// 接下来用两个比较大的数组,测试一下两种方法的效率

printf(" 下面是测试,求一个包含 100000 个元素和一个包含 199999 个元素的数组的交集: ");

#define len1 100000

#define len2 199999

int* testArray1 = (int*)malloc(sizeof(int) * len1);

int* testArray2 = (int*)malloc(sizeof(int) * len2);

int* testArray = (int*)malloc(sizeof(int) * len1);

start = clock();

for (size_t i = 0; i < len1; ++i) testArray1[i] = i;

for (size_t i = 0; i < len2; ++i) testArray2[i] = i + 12345;

end = clock();

printf("初始化数组用时:%d ms ", (end - start) * 1000 / CLOCKS_PER_SEC);

start = clock();

result_array_len = getIntersection(testArray1, len1, testArray2, len2, testArray);

end = clock();

printf("第一种方法用时:%d ms ", (end - start) * 1000 / CLOCKS_PER_SEC);

start = clock();

result_array_len = getIntersection_optimized(testArray1, len1, testArray2, len2, testArray);

end = clock();

printf("第二种方法用时:%d ms ", (end - start) * 1000 / CLOCKS_PER_SEC);


return 0;

}

注释应该说明得比较清楚了,这里就不赘言了。

下面分别是在 Windows 上 msvc 和 mingw 编译并运行的结果:

mingw

㈢ 如何计算两个有序整型数组的交集

例如,两个含有n个元素的有序(非降序)整形数组a和b(数组a和b中都没有重复元素),求出其共同元素。

a[]={0,1,2,3,4};

B[]={1,3,5,7,9};

那么它们的交集为{1,3}。

计算数组交集可以采用很多种方法,但数组的相对大小一般会影响算法的效率,所以需要根据两个数组的相对大小来确定采用的方法。

(1)对于两个数组长度相当的情况,一般可以采取以下3种方法。

方法一:采用二路归并来遍历两个数组。(这个名字好霸气,有木有武功招数的赶脚)

设两个数组分别为array1[n1]和array2[n2],分别以i、j从头开始遍历两个数组。在遍历过程中,如果当前遍历位置的array1[i]与array2[j]相等,则此数为两个数组的交集,记录到随便array1或array2中,并继续向后遍历array1和array2.如果array1[i]>array2[j],则需继续向后遍历array2.如果array1[i]小于array2[j],则需要继续向后遍历array1,直到有一个数组结束遍历即停止。总的来说,就是谁落后了,谁的下标就自增去吧。

代码如下:

#include "stdafx.h"
#include <stdio.h>
void mixed(int array1[], int n1, int array2[], int n2)
{
int i = 0, j = 0, k = 0;
while (i < n1&&j < n2)
{
if (array1[i] == array2[j])
{
array1[k] = array1[i];
printf("%d\n", array1[k]);
i++;
j++;
k++;
}
else if (array1[i]>array2[j])
{
j++;
}
else if (array1[i] < array2[j])
{
i++;
}
}
}
void main()
{
int a[] = { 0, 1, 2, 3, 4 };
int b[] = { 1, 3, 5, 7, 9 };
mixed(a, 5, b, 5);
getchar();
}

效果如图:

方法二:顺序遍历两个数组,将数组元素存放到哈希表中,同时对同级的数组元素进行计数。如果为2,则为两者的交集元素。

方法三:遍历两个数组中任意一个数组,将遍历得到的元素存放到哈希表,然后遍历另外一个数组,同时对建立的哈希表进行查询,如果存在,则为交集元素。

(2)对于两个数组长度相差悬殊的情况,如数组a的长度远远大于数组b的长度,则可以采用下面几种方法。

方法一:依次遍历长度小的数组,将遍历得到的数组元素在长数组中进行二分查找。具体而言,设两个指向两个数组为元素的指针,取较小的那个数在另一个数组中二分查找,找到,则存在一个交集,并且将该目标数组的指针指向该位置前一个位置。如果没有找到,同样可以找到一个位置,使得目标数组中在该位置后的数肯定不在另一个数组中存在,直接移动该目标数组的指针指向该位置的前一个位置,再循环找,直到一个数组为空为止。因为两个数组中都可能出现重复的数,因此二分查找时,当找到一个相同的数x时,其下标为i,那么下一个二分查找的下界变为i+1,避免x重复使用。

方法二:采用与方法一类似的方法,但是每次查找在前一次查找的基础上进行,这样可以大大缩小查找表的长度。

方法三:采用与方法二类似的方法,但是遍历长度小的数组的方式有所不同,从数组头部和尾部同时开始遍历,这样可以进一步缩小查找表的长度。

热点内容
换个编译器编译代码就报错 发布:2024-11-24 01:19:38 浏览:328
苹果手机如何像华为一样扫一下找到无线密码 发布:2024-11-24 01:15:36 浏览:952
T型存储器 发布:2024-11-24 01:01:08 浏览:371
android操作串口 发布:2024-11-24 00:56:02 浏览:222
foxpro数据库管理系统 发布:2024-11-24 00:44:53 浏览:822
python微信爬虫 发布:2024-11-24 00:44:12 浏览:562
东北大脚本 发布:2024-11-24 00:42:26 浏览:533
山东省域名服务器地址云主机 发布:2024-11-24 00:42:23 浏览:521
安卓71的n是什么 发布:2024-11-24 00:27:27 浏览:390
存储一个国际码需要几个字节 发布:2024-11-24 00:26:41 浏览:958