求集合的幂集【转】
http://www.wutianqi.com/?p=1157
集合A的幂集是由集合A的所有子集所组成的的集合。
如:A={1,2,3},则A的幂集P(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},{ }}。
求一个集合的幂集就是求一个集合的所有的子集,方法有穷举法,分治法,回溯等,这里主要介绍一下回溯法。
回溯法是设计递归过程的一种重要的方法,它的求解过实质上是一个先序遍历一棵“状态树”的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中的。
幂集中的每个元素是一个集合,它或是空集,或含集合A中一个元素,或含集合A中两个元素…… 或等于集合A。反之,从集合A 的每个元素来看,它只有两种状态:它或属幂集的无素集,或不属幂集的元素集。则求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可以用一棵二叉树来表示过程中幂集元素的状态变化过程,树中的根结点表示幂集元素的初始状态(空集);叶子结点表示它的终结状态,而第i层的分支结点,则表示已对集合A中前i-1个元素进行了取舍处理的当前状态(左分支表示取,右分支表示舍 )。因此求幂集元素的过程即为先序遍历这棵状态树的过程。
具体算法如下:
1 #include <iostream> 2 #include <cstring> 3 #include <ctype.h> 4 #include <stdlib.h> 5 #include <string> 6 using namespace std; 7 8 char a[100]; 9 char b[100]; 10 11 void GetPowerSet(int i, char a[]) 12 { 13 char x; 14 int k; 15 int len = strlen(a); 16 if(i >= len) 17 { 18 if(b[0]) 19 cout << b << endl; 20 else 21 cout << "XX" << endl; // 表示空集 22 } 23 else 24 { 25 x = a[i]; 26 k = strlen(b); 27 b[k] = x; 28 GetPowerSet(i+1, a); 29 b[k] = 0; 30 GetPowerSet(i+1, a); 31 } 32 } 33 34 35 int main() 36 { 37 while(scanf("%s", a) != EOF) 38 { 39 printf("%s的幂集是:\n", a); 40 printf("------------\n"); 41 GetPowerSet(0, a); 42 printf("------------\n"); 43 } 44 }
分类:
901-数学与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App