当前位置:首页 » 操作系统 » 集合交集算法

集合交集算法

发布时间: 2022-08-10 00:57:20

① 如何写一个c语言程序求两个集合的交集

定义两个数组存放这两个集合,再定义一个数组存放它们的集合,用类似冒泡排序的算法,遍历数组1中的第一个元素和数组2中每一个元素,若有相同的,则把这个元素放入第三个数组,继续遍历,知道数组1遍历完所有元素,那数组3中的元素,即为两个数组(集合)的交集。

② 集合的交集与并集

【补充:A∩D={直角三角形},B∩D={等腰直角三角形}】
交集就是既要属于A又要属于B,且的关系,类似于算法中的乘法,
而并集是属于A或者属于B,或的关系,类似于算法中的加法。

已知集合A={三角形},B={等腰三角形},C={等边三角形},D={直角三角形},那么A交B,B并C,C交D,A并D,B交C,B并D。
解:
A∩B={等腰三角形},
B∪C={等腰三角形},
C∩D=空集
A∪D={三角形}
B∩C={等边三角形}
B∪D={等腰三角形和直角三角形}

③ 求两个集合的交集,用c++语言写

#include<stdio.h>
double P[n1],Q[n2]; //R=P∩Q
double R[];
double TEMP;
for(i=0;i<n1;i++)
{for(j=0;j<n2;j++)
if(P[i]==Q[j])
{
TEMP=P[i];
R[m]=TEMP;
m++;
}
}

④ 集合的运算(交集,并集)

1、a≥2
2,a≥3,
3,∵M:x<-2或x>4,N:x<1,或x>3,
∴M∪N=N={x│x<1,或x>3}
4,B:x≥0
∴AUB={x│x>2},
∴A∩B={x│0≤x<2,x∈Z}={0,1},
5,同上,
6,解:设X^2+pX-6=0两根为x1,x2,且设x1<x2,
∴x1+x2=-p,x1x2=-6,
解集A={x│x≤x1,或x≥x2}
设X^2-2pX+q=0两根为x3,x4,且设x3<x4,
∴x3+x4=2p,x3x4=q,
解集B={x│x3<x<x4}
∵A∩B={X|2<=X<4},
∴只有x1<x3<x2<x4,且x2=2,x4=4,
则x1=-3,p=-(x1+x2)=1,
x3=2-x4=-2,q=x3x4=-8,
此时A:x≤-3,或x≥2
B:-2<x<4
∴AUB={x│x≤-3,或x>-2}

⑤ 求两个集合交集的算法

我这里有一个很强的,是以前的作业,功能有很多!
有问题来找小斌
QQ:504449327
#define
TRUE
1
#define
FALSE
0
#define
OK
1
#define
ERROR
0
#define
INFEASIBLE
-1
#define
OVERFLOW
-2
typedef
int
Status;
typedef
char
ElemType;
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<conio.h>
typedef
struct
NodeType
{
ElemType
data;
struct
NodeType
*next;
}
NodeType,*LinkType;
typedef
struct
{
LinkType
head,tail;
int
size;
}OrderedList;
ElemType
a[100]="magazine";
ElemType
b[100]="paper";
OrderedList
L1,L2,L3;
Status
MakeNode(LinkType
&p,ElemType
e)/*函数功能,创建一个结点,用p指向它,并把e的值赋给date*/
{
p=(LinkType)malloc(sizeof(NodeType));
if(!p)
return
FALSE;
p->data=e;
p->next=NULL;
return
TRUE;
}
Status
InitList(OrderedList
&L)
/*函数功能,建立空栈*/
{
if(MakeNode(L.head,'
'))
{
L.tail=L.head;
L.size=0;
return
TRUE;
}
else
{
L.head=NULL;
return
FALSE;
}
}
Status
LocateElem(OrderedList
L,
ElemType
e,
LinkType
&p)
{
NodeType
*pre;
if(L.head)
/*栈建立成功*/
{
pre=L.head;
p=pre->next;
while(p
&&
p->data<e)
/*第二个结点中的data比e小,就让p和pre指向下一个结点*/
{
pre=p;
p=p->next;
}
if(p
&&
p->data==e)/*找到和e相等的date,p指向这个结点*/
{
return
TRUE;
}
else
/*如果找不到,p指向刚好比e小的结点*/
{
p=pre;
return
FALSE;
}
}
else
return
FALSE;
}
void
InsertAfter(OrderedList
L,
LinkType
q,
LinkType
s)
/*在结点q之后插入s结点*/
{
if(L.head
&&
q
&&
s)
{
s->next=q->next;
q->next=s;
if(L.tail==q)
L.tail=s;
L.size++;
}
}
void
CreateSet(OrderedList
&T,
char
*s)/*将s中的元素按从小到大的顺序插入到T控制的链表中*/
{
unsigned
i;
LinkType
p
,q;
if(InitList(T))
/*建立一个空栈*/
{
for(i=0;i<=strlen(s);i++)
{
if(s[i]>='a'
&&
s[i]<='z'
&&
!LocateElem(T,s[i],p))
{
if(MakeNode(q,s[i]))
{
InsertAfter(T,p,q);
}
}
}
}
}
Status
Print(LinkType
p)/*输出一个链表*/
{
if(p)
{
printf("%c",p->data);
return
TRUE;
}
else
return
FALSE;
}
void
ListTraverse(LinkType
p,
Status
(*visit)(
LinkType
))
{
printf("%c",'\t');
while(p)
{
visit(p);
//这句看不懂
p=p->next;
}
printf("%c",'\n');
}
void
Append(OrderedList
&L,LinkType
s)
{
if(L.head
&&
s)
{
if(L.tail!=L.head)
L.tail->next=s;
else
L.head->next=s;
L.tail=s;
L.size++;
}
}
void
Union(OrderedList
&T,OrderedList
S1,OrderedList
S2)
{
LinkType
p1,p2,p;
if(InitList(T))
{
p1=S1.head->next;
p2=S2.head->next;
while(
p1
&&
p2)
{
if(p1->data<=p2->data)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
if(p1->data==p2->data)
p2=p2->next;
p1=p1->next;
}
else
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p2->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
}
}
while(p1)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}
while(p2)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p2->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
}
}
}
void
Intersection(OrderedList
&T,OrderedList
S1,OrderedList
S2)
{
LinkType
p1,p2,p;
if(!InitList(T))
T.head=NULL;
else
{
p1=S1.head->next;
p2=S2.head->next;
while(
p1
&&
p2)
{
if(p1->data<p2->data)
p1=p1->next;
else
if(p1->data>p2->data)
p2=p2->next;
else
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p2=p2->next;
p1=p1->next;
}
}
}
}
void
Difference(OrderedList
&T,OrderedList
S1,OrderedList
S2)
{
LinkType
p1,p2,p;
if(!InitList(T))
T.head=NULL;
else
{
p1=S1.head->next;
p2=S2.head->next;
while(
p1
&&
p2)
{
if(p1->data<p2->data)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}
else
if(p1->data>p2->data)
p2=p2->next;
else
{
p1=p1->next;
p2=p2->next;
}
}
while(p1)
{
p=(LinkType)malloc(sizeof(NodeType));
p->data=p1->data;
p->next=NULL;
Append(T,p);
p1=p1->next;
}
}
}
void
ReadCommand(char
&cmd)
{
printf("\n
------------------------------------------------------------------------\n");
printf("\n\t\t\t\t操


示");
printf("\n
------------------------------------------------------------------------\n");
printf("\tMakeSet1------1\t\t\t\tMakeSet2--------2\n\tUnion---------u\t\t\t\tIntersection----i\n\tDifference----d\t\t\t\tQuit------------q\n\tDisplay-------y");
do{
printf("\n\n\t请选择操作:");
cmd=getch();
printf("\n--------------------------------------------------------------------------\n");
}while(cmd!='1'
&&
cmd!='2'
&&
cmd!='u'
&&
cmd!='i'
&&
cmd!='d'
&&
cmd!='q'
&&
cmd!='y');
}
void
Interpret(char
&cmd)
{
system("cls");
switch(cmd)
{
case
'1':
printf("\n\t请输入字符串:");
gets(a);
printf("\t原始字符串:");
printf("\t%s\n",a);
CreateSet(L1,
a);
printf("\t构建的集合:");
ListTraverse(L1.head->next,Print);
break;
case
'2':
printf("\n\t请输入字符串:");
gets(b);
printf("\t原始字符串:");
printf("\t%s\n",b);
CreateSet(L2,
b);
printf("\t构建的集合:");
ListTraverse(L2.head->next,Print);
break;
case
'u':
CreateSet(L1,
a);
CreateSet(L2,
b);
Union(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t并集:");
ListTraverse(L3.head->next,Print);
break;
case
'i':
CreateSet(L1,
a);
CreateSet(L2,
b);
Intersection(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t交集:");
ListTraverse(L3.head->next,Print);
break;
case
'd':
CreateSet(L1,
a);
CreateSet(L2,
b);
Difference(L3,L1,L2);
printf("\n\t集合1:");
ListTraverse(L1.head->next,Print);
printf("\t集合2:");
ListTraverse(L2.head->next,Print);
printf("\t差集:");
ListTraverse(L3.head->next,Print);
break;
case
'y':
printf("\n\t原始字符串:\n");
printf("\t\t%s\n\t\t%s\n",a,b);
CreateSet(L1,
a);
CreateSet(L2,
b);
printf("\t由字符串构建的集合:\n");
printf("\t");
ListTraverse(L1.head->next,Print);
printf("\t");
ListTraverse(L2.head->next,Print);
Union(L3,L1,L2);
printf("\t并集:");
ListTraverse(L3.head->next,Print);
Intersection(L3,L1,L2);
printf("\t交集:");
ListTraverse(L3.head->next,Print);
Difference(L3,L1,L2);
printf("\t差集:");
ListTraverse(L3.head->next,Print);
break;
}
}
void
main()
{
char
cmd;
do
{
ReadCommand(cmd);
Interpret(cmd);
}while(cmd!='q');
}

⑥ c语言中有没有比较简单的算法来判断两个集合有交集

只判断有没有交集的话很简单了,直接挨个比较就可以了,如果有相同的返回1,没相同的返回0。

如果要求2个数组相交的元素的话自己写一个代码也可以,或者可以直接使用STL算法中的set_intersection函数。

热点内容
b站如何知道账号密码 发布:2024-05-08 20:33:55 浏览:691
知识图谱算法 发布:2024-05-08 20:33:19 浏览:908
手机登云服务器windows 发布:2024-05-08 20:32:57 浏览:113
上传3d模型 发布:2024-05-08 20:11:41 浏览:604
国内访问外国网站 发布:2024-05-08 20:09:40 浏览:859
wifi热点无internet访问 发布:2024-05-08 20:09:37 浏览:892
林肯哪个配置最好 发布:2024-05-08 20:02:42 浏览:68
java变量的声明 发布:2024-05-08 19:50:44 浏览:977
c语言大数阶乘 发布:2024-05-08 19:40:51 浏览:543
华为手机上滑自动出来清理缓存 发布:2024-05-08 19:29:21 浏览:284