首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

对任意n个数字,求所有非空子集合,及相应的补集;尽可能简练(详细见内容),该怎么解决

2012-02-23 
对任意n个数字,求所有非空子集合,及相应的补集;尽可能简练(详细见内容)如题,对任意n个数字,求所有非空子集

对任意n个数字,求所有非空子集合,及相应的补集;尽可能简练(详细见内容)
如题,对任意n个数字,求所有非空子集合,及相应的补集。

例如对:1,2,3,4
有:(1)==〉(2,3,4);(2)==〉(1,3,4);
        (3)==〉(1,2,4);(4)==〉(1,2,3);
        (1,2)==〉(3,4);(1,3)==〉(2,4);
        (1,4)==〉(2,3);
          //P:到这里可以结束,剩下的公式可以由上面的反转得到
        (2,3)==〉(1,4);(2,4)==〉(1,3);
        (3,4)==〉(1,2);(1,2,3)==〉(4);
        (1,2,4)==〉(3);(1,3,4)==〉(2);
        (2,3,4)==〉(1);

如上所示,如何判断得到那个“分割点”(由P所示);
或者有其他的方法得到所有非空子集的组合吗?

谢谢!!

[解决办法]
这个就是一个穷举的过程,n个数字对应n个2进制bit。那么这个n位的2进制bit就能够表示他的所有子集,当全为1时是他自己,全为0时是空,只要避免这两种就行了。

给你一个排列,你只要求反就是他的补集。在n位的2进制数中,不考虑负数,就是0到2的n次幂。一个排列对应一个数,求反就是用2的n次幂减去这个数啦。所以这个问题我想你应该已经找到了解决的方法了。

分割点就是2的n-1次幂拉


[解决办法]
十进制化二进制,然后检查二进制数每一位是0还是1.

[解决办法]
例如,如果n=3,则转折点是3:
0=000
1=001
2=010
3=011

[解决办法]
在算法上是np困难问题,n大了机器就累死了.如果非要这么做可以考虑参考图的深度遍历.
[解决办法]
应该是不同的穷举方法有不同的分割点;

比如含有1的所有子集以及对应的补集可以构成所有的子集;
同样含有2的所有子集以及对应的补集可以构成所有的子集;

hchf_1(春风)跟zzwu(未名)的是:
含有N的所有子集以及对应的补集构成所有的子集;

就lz的遍历方法来讲,就是元素个数小于等于n/2-1的所有子集跟元素个数等于n/2的一半子集;

因为总共有2^N个子集,所以只要用任何方法遍历其中的一半,另一半计算补集就出来了;

分割点就是,求出了2^(n-1)个元素的时候,(本身与空集计算在内)

[解决办法]
分割点就是,求出了2^(n-1)个子集的时候,(本身与空集计算在内)

热点排行