如何得到某集合的所有子集合?

原创 2005年04月22日 14:59:00

我们都知道,一个含n个元素的集合拥有2^n个子集合,并且不难发现,其中每个子集合都是从0到2^n-1 每个数的二进制格式中0 放弃,1选择的结果,如下所示:

{}           000

{1}         100

{2}         010

{1,2}      110

{3}         001

{1,3}      101

{2,3}      011

{1,2,3}   111

所以根据数字的二进制转换,可以轻松获得一个集合的所有子集合,代码如下:

Sub GETALL(ByVal mycollection As String, ByRef RESULT() As String)
Dim x() As String
x = Split(Mid(mycollection, 2, Len(mycollection) - 2), ",")

Dim A() As String, b() As Integer '临时数组
Dim n As Integer ' 集合元素个数
Dim i As Long '循环变量
Dim num As Integer '子集合元素个数
Dim TEMP As Integer '二进制转换中间变量
n = UBound(x) + 1
ReDim b(0 To n - 1)
ReDim RESULT(2 ^ n - 1)
Debug.Print "集合 " & mycollection & " 共有子集合 " & 2 ^ n & " 个!"

For i = 0 To 2 ^ n - 1
TEMP = i
num = 0
For j = 0 To n - 1 '转换为二进制
b(j) = TEMP And 1 '0 or 1
TEMP = TEMP / 2
If b(j) = 1 Then
num = num + 1
ReDim Preserve A(1 To num)
A(num) = x(j)
End If
Next

RESULT(i) = "{" & Join(A, ",") & "}" '结果保存
Debug.Print RESULT(i) '输出

Next
MsgBox "OK"
End Sub

Private Sub Command1_Click()
Dim S() As String
GETALL "{1,2,3,4,5,6}", S
End Sub

输出:

集合 {1,2,3,4,5,6} 共有子集合 64 个!
{}
{1}
{2}
{1,2}
{3}
{1,3}
{2,3}
{1,2,3}
{4}
{1,4}
{2,4}
{1,2,4}
{3,4}
{1,3,4}
{2,3,4}
{1,2,3,4}
{5}
{1,5}
{2,5}
{1,2,5}
{3,5}
{1,3,5}
{2,3,5}
{1,2,3,5}
{4,5}
{1,4,5}
{2,4,5}
{1,2,4,5}
{3,4,5}
{1,3,4,5}
{2,3,4,5}
{1,2,3,4,5}
{6}
{1,6}
{2,6}
{1,2,6}
{3,6}
{1,3,6}
{2,3,6}
{1,2,3,6}
{4,6}
{1,4,6}
{2,4,6}
{1,2,4,6}
{3,4,6}
{1,3,4,6}
{2,3,4,6}
{1,2,3,4,6}
{5,6}
{1,5,6}
{2,5,6}
{1,2,5,6}
{3,5,6}
{1,3,5,6}
{2,3,5,6}
{1,2,3,5,6}
{4,5,6}
{1,4,5,6}
{2,4,5,6}
{1,2,4,5,6}
{3,4,5,6}
{1,3,4,5,6}
{2,3,4,5,6}
{1,2,3,4,5,6}

畅通工程(并查集之计算集合的子集合的个数)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi...

通信系统(并查集之满集合的子集合是否连成圈的问题)

1106: 通信系统 时间限制: 1 Sec 内存限制: 32 MB 提交: 375 解决: 74 提交状态 题目描述 某市计划建设一个通信系...

输出一个集合的所有子集合

面试遇上了这个问题,思量了会,想到用递归的方式解决这个问题。回来网上搜索了下,发现通过二进制的思想来解决这个问题更容易,下面我把两种解决方式的思想及原码分享出来。 二进制方法实现: 我们都知道,一...
  • llg8212
  • llg8212
  • 2014年03月28日 15:52
  • 803

算法3:给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合

给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合样例字符数组ahia,输出如下: a h i ah ai hi ahi解题思路如下:1、首先算出字符数据中所包含的字符,使...
  • pplin
  • pplin
  • 2017年03月03日 13:32
  • 218

黑马程序员_JAVA学习日记_JAVA中API:集合框架2(Map集合及其子集合)

黑马程序员-学习日记   黑马程序员_JAVA学习日记_JAVA中集合框架2(Map集合及其子集合)   ------- android培训、java培训、期待与您交流! ----------...

HALCON算子集合

  • 2017年06月20日 15:54
  • 573KB
  • 下载

子集合打印

  • 2015年04月11日 20:39
  • 10.43MB
  • 下载

动态规划法--求数组中最大子集合的和

动态规划法求解子数组最大的和
  • sum_TW
  • sum_TW
  • 2017年01月03日 22:53
  • 2269

子集合问题的C++代码

  • 2009年12月21日 09:32
  • 1KB
  • 下载

子集合问题matlab

  • 2017年09月17日 11:14
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何得到某集合的所有子集合?
举报原因:
原因补充:

(最多只允许输入30个字)