已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现.

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/09 05:06:34
已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现.

已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现.
已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.
要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现.

已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现.
#include <stdio.h>
#include <stdlib.h>

int la,lb,lc,lA,lbc,i;
int a[1001],b[1001],c[1001],bc[1001];
int A[1001];

void init()
{
\x09scanf("%d%d%d",&la,&lb,&lc);
\x09for (i=1;i<=la;i++) scanf("%d",a+i);
\x09for (i=1;i<=lb;i++) scanf("%d",b+i);
\x09for (i=1;i<=lc;i++) scanf("%d",c+i);
}

void work()
{
\x09int ta,tb,tc,tbc;
\x09tb=tc=1;
\x09while (tb<=lb&&tc<=lc)
\x09{
\x09\x09if (b[tb]<c[tc])
\x09\x09{
\x09\x09\x09while (b[tb]<c[tc]&&tb<=lb) tb++;
\x09\x09} else {
\x09\x09\x09while (c[tc]<b[tb]&&tc<=lc) tc++;
\x09\x09}
\x09\x09if (tb>lb||tc>lc) break;
\x09\x09if (b[tb]==c[tc])
\x09\x09{
\x09\x09\x09bc[++lbc]=b[tb]; 
\x09\x09\x09tb++; tc++;
\x09\x09}
\x09}
\x09tbc=1; ta=1;
\x09while (ta<=la||tbc<=lbc)
\x09{
\x09\x09if (ta<=la&&tbc<=lbc&&a[ta]==bc[tbc])
\x09\x09{
\x09\x09\x09ta++; tbc++;
\x09\x09\x09A[++lA]=a[ta-1];
\x09\x09} else if (ta<=la&&(a[ta]<bc[tbc]||tbc>lbc)) A[++lA]=a[ta++];
\x09\x09else if (tbc<=lbc&&(bc[tbc]<a[ta]||ta>la)) A[++lA]=bc[tbc++];
\x09}
}

int main()
{
\x09init();
\x09work();
\x09printf("%d\n",lA);
\x09for (i=1;i<=lA;i++) printf("%d ",A[i]);
\x09printf("\n");
}

以上代码,题目中说A,B,C是单链表,那就直接当作数组来做了,反正差不多.


la,lb,lc分别为A,B,C的大小,a,b,c存储其中的元素,A用来存最终的答案.

bc数组存储的是 B∩C 的答案,lbc为 |B∩C| 


思路如下:


首先由于a,b,c都是递增的,所以可以利用它的单调性.

在求 B∩C 时,两个指针分别指向链表头 (tb,tc) 若 b[tb]<c[tc] 那么和c[tc]相等的b集合中的值一定存在tb之后,所以一直将tb指针向后跳,直到b[tb]>=c[tc] 相反的话类似.当得到一个 b[tb]==c[tc] 时,将它加入bc中,两个指针同时向后走一步.显然,由于tb和tc都恰好遍历了整个链一次,所以复杂度 O ( |B|+|C| )


接下来需要做的就是合并两张有序表 a 和 bc,同样两个指针( ta,tbc ) 然后哪个小放哪个,一直到两个指针都到尾端为止,复杂度类似于上一步 O ( |A| + |BC| )


综上,复杂度为 O ( |A| + 2*( |B|+|C| ) ) 2为常数,可以略去

已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪(B∩C),并使求解结构A仍保持递增.要求算法的时间复杂度为 O(|A|+|B|+|C|).其中,|A|为集合A 的元素个数.用C语言实现. 数据结构假设分别以两个元素的值递增有序线性表a,b表示两个集合,现在要构成一个新的线性表c,c表示a b的交,且c中的元素也递增有序.分别以顺序表和单链式表为存储结构,编写程序 用c++实现,假设有两个元素递增的有序排列线性表A和B,均以顺序表作存储结构.试编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序)允许值相同排列的线性表C,并要求按原表的 单链表A、B表示2个集合,求A与B的交集C.在线等答案 急!帮忙的朋友谢谢了!单链表A、B表示2个集合,元素类型为INT,且递增有序排列,其头指针分别为a,b.求一个程序求出A和B的交集C,C也以元素递增 设A和B是两个单链表其表中元素递增有序试写一算法将A和B归并成一个按元素值递减有序的单链表C并要求辅助空间为O(1) 已知2个递增无序的单链表A,B分别存储了一个集合,请设计算法实现这2个集合的并集, 急需数据结构算法:假设有两个元素递增的有序排列线性表A和B,均以单链表作存储结构.试编写算法将A表和B急需数据结构算法C++版:假设有两个元素递增的有序排列线性表A和B,均以单链表作 A U B - C (A并B减C)用C/C++编写程序1.已知A,B,C为三个递增有序的线性表,输出A∪B – C的长度(即元素个数)并且按照递增顺序输出每个元素.input.txt文件里包含A、B、C的长度和元素.2.A∪B – C也是 已知两个顺序表A和B分别表示两个集合,其元素递增排列,编写一个函数求出A和B的交集要用简单的c++写啊,刚学不太会啊已知两个整数集合A和B,它们的元素分别依元素值递增有序存放在两个单 能用二分法进行查找的是A 顺序存储的有序线性表B 线性链表C 二叉链表D 有序线性链表 假设有两个按元素值递增有序排列的带头节点的单链表A和B.试编写算法将A表和B表归并成按一个元素值递减有序(允许值下相同)排列的线性表C,要求利用原表的节点空间存放C 已知两个单链表A与B分别表示两个集合,其元素类型为int且递增排列,其头结点指针分别为a,b.编写一个函数求出A和B的交集,要求C同样以元素递增的单链表形式存 设计算法,将递增有序顺序表A、B中的元素合并为一个有序顺序表C,要求时间尽可能少(写出数据结构定义)? 线性表的顺序存储结构和线性表的链式存储结构分别是A) 顺序存取的存储结构、顺序存取的存储结构B) 随机存取的存储结构、顺序存取的存储结构C) 随机存取的存储结构、随机存取的存储结 我市某乡A,B两村盛产柑橘,A村有柑橘200吨,B村有柑橘300吨.现将这些柑橘运到C,D两个冷藏仓库,已知C仓库可存储240吨,D仓库可存储260吨;从A村运往C,D两处的费用分别为每吨15元和25元,从B村运往C,D 91.对于长度为18的顺序存储的有序表,若采用二分查找,则查找第15个元素的查找长度为().A.2 B.3 C.4 D.6 请用C语言编程实现 1.已知线性表LA和LB中的数据元素按值非递增有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递增有序排列.例如,设LA=(3,5,8,11)LB=(2,6,8,9,11,15,20)则L 在下列模式中,能够给出数据库物理存储结构和物理存储方法的是 A外模式 B内模式 C概念模式 D逻辑模式