java用集合类求数组交并集,C中n个数组的交集和并集

union(a, b, c) = union(union(a, b), c) , intersection() 也一样 . 即你可以将n组的并集或交集分解为n个联合或2组的交集(正如NuclearGhost在对问题的评论中指出的那样) . 您需要做的是更改当前函数,以便它们构建结果集,而不是立即打印结果 . 然后,您可以创建一个单独的功能来打印一组 .

为了提高效率,您希望采用大致相同大小的联合或集合的交集 . 因此,假设所有输入集的大小可能大致相等,那么分而治之的方法应该可以正常工作 .

void intersection(int arr1[], int arr2[], int m, int n, int *out)

{

int i = 0, j = 0;

while(i < m && j < n)

{

if(arr1[i] < arr2[j])

i++;

else if(arr2[j] < arr1[i])

j++;

else /* if arr1[i] == arr2[j] */

{

*out++ = arr2[j++];

i++;

}

}

}

void multi_intersection(int n, int **arrays, int *lengths, int *out) {

if (n == 2) {

intersection(arrays[0], arrays[1], lengths[0], lengths[1], out);

} else if (n == 1) {

memcpy(out, arrays[0], lengths[0] * sizeof (int));

} else {

/* Allocate buffers large enough */

int *buf[2];

int len[2] = { INT_MAX, INT_MAX };

int i;

for (i = 0; i < n; ++i) {

int which = i < n / 2;

if (lengths[i] < len[which]) len[which] = lengths[i];

}

buf[0] = malloc(len[0] * sizeof (int));

buf[1] = malloc(len[1] * sizeof (int));

/* Recurse to process child subproblems */

multi_intersection(n / 2, arrays, lengths, buf[0]);

multi_intersection(n - n / 2, arrays + n / 2, lengths + n / 2, buf[1]);

/* Combine child solutions */

intersection(buf[0], buf[1], len, out);

free(buf[0]);

free(buf[1]);

}

类似的代码适用于 multi_union() ,除了需要以不同方式计算缓冲区长度:并集的结果可能与输入大小的总和一样大,而不是输入的最小大小 . 它可能被重写以减少缓冲区分配 . 此外,可以重写递归以使用迭代,同样可以编写mergesort以使用迭代,但是当前的递归方法无论如何仅使用O(log n)额外的堆栈空间 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值