集合新算法
‘壹’ 集合的基本算法
集合是历来高考查的重要内容之一,是整个高中内容的基础,由于集合知识的抽象性,给处理集合问题带来一定的困难,为此结合历年高考集合题,例析解集合问题的几种常用方法,供参考。 一、 数轴法 由实数与数轴上的点对应关系,可以用数轴上的点或区间表示数集,从而直观形象地分析问题和解决问题。 二、 性质法 在解集合问题时,用常用性质求解,往往快捷迅速,如C A∪C B = C ( A∩B),C A∩C B=C ( A∪B),φ∩A=φ, φ∪A=A,φ A,集合A中有n个元素其子集个数为2 ,真子集个数为2 -1等。 三、 列举法 对于一些有明显特征的集合,可以将集合中的元素一一列举出来,然后从中寻找解题方法。
(希望能帮到你,也希望你能给我好评哦,你的好评是我最大的鼓励!谢谢~)
‘贰’ 怎么求包含在A集合中不包含在B集合中的元素,要找一个比较新的算法
找出A集合中不属于集合A与集合B的交集的元素。
‘叁’ 集合划分算法
设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
考虑3个元素的集合,可划分为
① 1个子集的集合:{{1,2,3}}
② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}}
③ 3个子集的集合:{{1},{2},{3}}
∴F(3,1)=1;F(3,2)=3;F(3,3)=1;
如果要求F(4,2)该怎么办呢?
A.往①里添一个元素{4},得到{{1,2,3},{4}}
B.往②里的任意一个子集添一个4,得到
{{1,2,4},{3}},{{1,2},{3,4}},
{{1,3,4},{2}},{{1,3},{2,4}},
{{2,3,4},{1}},{{2,3},{1,4}}
∴F(4,2)=F(3,1)+2*F(3,2)=1+2*3=7
推广,得F(n,m)=F(n-1,m-1)+m*F(n-1,m)
‘肆’ 子集合问题算法
用减法来解决这个问题。
假设给定整数为x.
0 等于x的整数自然就是符合要求的子集。
1 在集合中找出小于x的子集;
2 在子集中逐个取数,剩余的数组成一个新的子集,从x中减掉得到一个新的数x;
3 重复0,1,2步骤。
4 对于符合0的子集就是所需要的子集。
可以用递归的方法生成函数,并用数组存储集合。
‘伍’ 数据结构与算法课程设计——集合运算
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct set{
int coef;
struct set *next;
};
void createlist_p(struct set *&p,int n)
{
int i;
struct set *L;
p=(struct set *)malloc(sizeof(set));
p->next=NULL;
for(i=n;i>0;i--)
{
L=(struct set *)malloc(sizeof(set));
printf("请输入该集合中第%d个整数元素:",n-i+1);
scanf("%d",&L->coef);
L->next=p->next;
p->next=L;
}
}//生成新链表用于存放两集合中的元素
void printlist_p(struct set *&p)
{
struct set *L;
int i;
L=p->next;
if(!L) printf("该表为空!\n");
while(L!=NULL)
{
printf("%d ",L->coef);
L=L->next;
i++;
}
printf("\n");
}//打印输入的两集合中的元素
void Addset(struct set *&p,struct set *&q,struct set *&r)
{
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
k=p->next;
for(;k;)
{
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
k=k->next;
}//把第一个集合中的元素放在新集合中
k=q->next;
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
k=k->next;
for(;k;)
{
for(n=r->next;(k->coef!=n->coef)&&n->next;){
n=n->next;
}//与新集合中的元素比较
if((k->coef!=n->coef)&&!(n->next)){
m=(struct set *)malloc(sizeof(set));
m->next=r->next;
r->next=m;
m->coef=k->coef;
}
k=k->next;
}//对第二个集合中的元素进行分析
}//求A∪B
void Subset(struct set *&p,struct set *&q,struct set *&r){
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
n=q->next;
for(;n;){
m=p->next;
for(;(m->coef!=n->coef)&&m->next;){
m=m->next;
}
if(m->coef==n->coef) {
k=(struct set *)malloc(sizeof(set));
k->next=r->next;
r->next=k;
k->coef=m->coef;
}
n=n->next;
}
}//求A∩B
void Intset(struct set *&p,struct set *&q,struct set *&r){
struct set *k,*m,*n;
r=(struct set *)malloc(sizeof(set));
r->next=NULL;
m=p->next;
for(;m;){
n=q->next;
for(;(m->coef!=n->coef)&&n->next;){
n=n->next;
}
if(!n->next&&(m->coef!=n->coef)) {
k=(struct set *)malloc(sizeof(set));
k->next=r->next;
r->next=k;
k->coef=m->coef;
}
m=m->next;
}
}//求A-B
void bangzhu(){
printf("\n\t\t\t***********************************");
printf("\n\t\t\t* 求集合的交并差 *");
printf("\n\t\t\t*********************************\n");
}
void main()
{
struct set *p,*q,*r;
int m,n,node;
bangzhu();
for(;;)
{
do{
printf("请输入您要选择操作的代码:\n");
printf("1:求两集合的并A∪B\n");
printf("2:求两集合的交A∩B\n");
printf("3:求两集合的差A-B\n");
printf("0:退出该程序\n");
scanf("%d",&node);
} while(node<0||node>3);
if(node==0) exit(1);
printf("\t\t\t/*请输入集合A中元素的个数:*/\n");
scanf("%d",&m);
createlist_p(p,m);
printf("\t\t\t/*请输入集合B中元素的个数:*/\n");
scanf("%d",&n);
createlist_p(q,n);
printf("集合A中元素为:");
printlist_p(p);
printf("集合B中元素为:");
printlist_p(q);
while(node<0||node>3);
switch(node)
{
case 1: Addset( p,q,r);printf("A∪B:\n");printlist_p(r);break;
case 2: Subset( p,q,r);printf("A∩B:\n");printlist_p(r);break;
case 3: Intset(p,q,r); printf("A-B:\n");printlist_p(r);break;
}
printf("\n");
}
}
可以了
楼上方法是正确的,学习!把分给楼上
‘陆’ 集合的运算是什么
集合运算是数学科学中常用的词语,是一种非常有效的构造形体的方法,可以直观的减少运算难度。
集合运算是实体造型系统中非常重要的模块,也是一种非常有效的构造形体的方法。从一维几何元素到三维几何元素,人们针对不同的情况和应用要求,提出了不少集合运算算法。
在早期的造型系统中,处理的对象是正则形体,因此定义了正则形体集合运算,来保证正则形体在集合运算下是封闭的。在非正则形体造型中,参与集合运算的形体可以是体、面、边、点,运算的结果也是这些形体,这就要求集合运算算法中能统一处理这些不同维数的形体,因此需要引入非正则形体运算。
‘柒’ 集合的基本运算有哪些
集合的基本运算:交集、并集、相对补集、绝对补集、子集。
(1)交集:集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。
(2)并集:给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。
(3)相对补集:若A和B是集合,则A在B中的相对补集是这样一个集合:其元素属于B但不属于A,B-A= { x| x∈B且x∉A}。
(4)绝对补集:若给定全集U,有A⊆U,则A在U中的相对补集称为A的绝对补集(或简称补集),写作∁UA。
(5)子集:子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。符号语言:若∀a∈A,均有a∈B,则A⊆B。
‘捌’ 已知两个有序集合A和B,现要求一个新的有序集合C=A-B,求算法
C语言实现A、B两个有序集合的差集C,参考代码如下:
#include<stdio.h>
#define M 8
#define N 10
int A[M]=
{34,40,44,47,48,54,65,66};
int B[N]=
{33,34,45,48,49,51,54,56,58,65};
int C[M];
int main()
{
int ia=0,ib=0,ic=0;
int i;
while(ia<M&&ib<N)
if(A[ia]==B[ib])
{++ia;++ib;}
else if(A[ia]>B[ib])
++ib;
else if(A[ia]<B[ib])
C[ic++]=A[ia++];
while(ia<M)
C[ic++]=A[ia++];
printf("A=\n");
for(i=0;i<M;++i)
printf("%d ",A[i]);
printf("\n");
printf("B=\n");
for(i=0;i<N;++i)
printf("%d ",B[i]);
printf("\n");
printf("C=\n");
for(i=0;i<ic;++i)
printf("%d ",C[i]);
return 0;
}
‘玖’ 两个集合相减怎么算集合之间能相加减吗
两个集合也可以相"减"。A在B中的相对补集,写作B−A,是属于B的、但不属于A的所有元素组成的集合。
在特定情况下,所讨论的所有集合是一个给定的全集U的子集。这样,U−A称作A的绝对补集,或简称补集(余集),写作A′或CUA。补集可以看作两个集合相减,有时也称作差集。
给定集合A,B,定义运算-如下:A - B = {e|e∈A 且 。A - B称为B对于A的差集,相对补集或相对余集。
确定了全集U时,对于U的某个子集A,一般称U - A为A(对于U)的补集或余集,通常记为A'或 ,也有记为CUA的。
(9)集合新算法扩展阅读:
集合运算整个算法包括了以下几部分:
1、求交:参与运算的一个形体的各拓扑元素求交,求交的顺序采用低维元素向高维元素进行。用求交结果产生的新元素(维数低于参与求交的元素)对求交元素进行划分,形成一些子元素。这种经过求交步骤之后,每一形体产生的子拓扑元素的整体相对于另一形体有外部、内部、边界上的分类关系。
2、成环:由求交得到的交线将原形体的面进行分割,形成一些新的面环。再加上原形体的悬边、悬点经求交后得到的各子拓扑元素,形成一拓扑元素生成集。
3、分类:对形成的拓扑元素生成集中的每一拓扑元素,取其上的一个代表点,根据点/体分类的原则,决定该点相对于另一形体的位置关系,同时考虑该点代表的拓扑元素的类型(即其维数),来决定该拓扑元素相对于另一形体的分类关系。
4、取舍:根据拓扑元素的类型及其相对另一形体的分类关系,按照集合运算的运算符要求,要决定拓扑元素是保留还是舍去;保留的拓扑元素形成一个保留集。
5、合并:对保留集中同类型可合并的拓扑元素进行合并,包括面环的合并和边的合并。
6、拼接:以拓扑元素的共享边界作为其连接标志,按照从高维到低维的顺序,收集分类后保留的拓扑元素,形成结果形体的边界表示数据结构。