真子集和子集如何判断?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真子集和子集如何判断?相关的知识,希望对你有一定的参考价值。

参考技术A

包含和真包含是集合与集合之间的关系,也叫子集和真子集关系。

真子集和子集的区别:

子集就是一个集合中的全部元素是另一个集合中的元素,有可能与另一个集合相等;

真子集就是一个集合中的元素全部是另一个集合中的元素,但不存在相等。

拓展资料:

如果A是B的子集,并且B中至少有一个元素不属于A,那么集合A叫做集合B的真子集。A是B的真子集

一般地,对于两个集合A,B,如果集合A中任意一个元素都是集合B中的元素,我们就说这两个集合有包含关系,称集合A为集合B的子集(subset)。

记作: A⊆B(或B⊇A)

读作:“A包含于B”(“B包含A”)

而真子集是对于子集来说的

真子集定义:如果集合A⊆B,但存在元素X∈B,且元素X不属于集合A,我们称集合A是集合B的真子集。

也就是说如果集合A的所有元素同时都是集合 B 的元素,则称 A 是 B 的子集,

若 B 中有一个元素,而A 中没有,且A 是 B 的子集,则称 A 是 B 的真子集,

枚举非空真子集

第一种情况给定的集合是满状态的,也就是枚举2的n次方种状态下的每一种子集的情况。

for(int x=0;x<(1<<n);x++)

这里的x是一个二进制数,其长度为n,取值为00000...00000~11111...11111的每一种状态。

for(int i=0;i<n;i++)
        if(x&(1<<i))

这里的i的取值为1,10,100,1000,10000...其目的就是一个一个去试x中对应位置的元素是1还是0,如果是1表示当前集合中有这个元素,否则没有。

第二种情况给定的集合不一定是满状态的,这时要输入一个全集s。

for(int x=s;x;x=s&(x-1))

这里的x就是s的子集的一种情况了,后面的i还是类似签名的道理,一位一位地去试有没有当前这个元素。

完整实现如下,首先输入全集元素个数n,进行一次枚举,接下来输入给定集合s进行子集的枚举,这是两种枚举情况的举例。

#include<iostream>
using namespace std;
int n,s;
int main()
{
    cin>>n;
    for(int x=0;x<(1<<n);x++)
    {
        for(int i=0;i<n;i++)
        if(x&(1<<i))
            cout<<i+1<<" ";
        cout<<endl;
    }
    cin>>s;
    for(int x=s;x;x=s&(x-1))
    {
        for(int i=0;i<n;i++)
        if(x&(1<<i))
            cout<<i+1<<" ";
        cout<<endl;
    }
    return 0;
}

 

以上是关于真子集和子集如何判断?的主要内容,如果未能解决你的问题,请参考以下文章

怎样判断子集,真子集,属于,不属于,包含

怎样判断子集,真子集,属于,不属于,包含

如何判断两个集合的关系?

如何判断一个集合是不是为空?

子集总和,带有回溯和类

51nod 3202STL子集和判断