集合新演算法
『壹』 集合的基本演算法
集合是歷來高考查的重要內容之一,是整個高中內容的基礎,由於集合知識的抽象性,給處理集合問題帶來一定的困難,為此結合歷年高考集合題,例析解集合問題的幾種常用方法,供參考。 一、 數軸法 由實數與數軸上的點對應關系,可以用數軸上的點或區間表示數集,從而直觀形象地分析問題和解決問題。 二、 性質法 在解集合問題時,用常用性質求解,往往快捷迅速,如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、拼接:以拓撲元素的共享邊界作為其連接標志,按照從高維到低維的順序,收集分類後保留的拓撲元素,形成結果形體的邊界表示數據結構。