对任意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)个子集的时候,(本身与空集计算在内)