回溯法求解n个元素的集合的幂集

news2025/4/12 12:10:03

目录

1.回溯法

2.集合的幂集本质问题

3.集合的幂集

(1)集合

(2)求解集合的幂集

(3)算法描述

(4)算法实现

(5)算法拓展


1.回溯法

  • 回溯法也是设计递归过程的一种重要方法,求解过程实质上是先序遍历一棵“状态树”的过程。
  • 回溯法的应用
    • 九宫格问题
    • 八皇后问题
    • 数独问题
    • 求集合的幂集问题

2.集合的幂集本质问题

提示:如果读者学习过《算法设计与分析》的话,那么应该很清楚,其中有一类问题是可以使用分治法进行求解的,那什么是分治法呢?

  • 分治法:就是将原问题划分若干个性质相同的小问题,并对划分的子问题进行求解。
  • 分治过程:
    • 将一个问题划分为同一类型的若干子问题,子问题最好规模相同。
    • 对这些子问题求解。
    • 合并这些子问题的解,以得到原始问题的答案。

3.集合的幂集

(1)集合

提示:集合的幂集就是集合A的所有子集所组成的集合。

题目:要求求n个元素的集合的幂集!

假设这里有三个元素:A={1,2,3},那么集合A的幂集?

ρ(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},Φ}

如下图所示: 

(2)求解集合的幂集

提示:求解ρ(A)集合的过程可以看成是依次对集合A中元素进行“取”或者“舍(弃)”的过程,通过上面也可以看到是一棵二叉树来表示幂集元素的状态变化状况。

  • 过程: 
    • 树中的根节点表示幂集元素的初始状态(为空集);
    • 叶子节点表示它的终结状态中幂集ρ(A)的8个元素;
    • 第i层(i=1,2,3,...,n)层的分支节点,则表示已对集合A中前i-1个元素进行了取/舍处理的当前状态(其中左分支表示“取”,右分支表示“舍”);
    • 将上述问题求解集合的幂集转换为先序遍历这棵状态树的过程。

(3)算法描述

void Powerset(int i,int n){
	//初始调用:Powerset(1,n)
	if(i>n){
		输出幂集的其中一个元素 
	}else{
		取第i个元素
		Powerset(i+1,n);
		舍第i个元素 
		Powerset(i+1,n);
	}
} 

提示:上述的关键问题是怎么表示“取”和“舍”的过程。

疑问:为什么说求幂集元素的过程是先序遍历状态树的过程呢?

解释:首先要清楚先序遍历的过程是先根后左再右,这样的一个遍历过程;那么在该代码中怎么体现这个先序遍历的过程的呢?从上面画出的集合的幂集二叉树图,可以看到,其实就是通过“取”或者“舍”这个方法来实现的,代码中的auxset[i-1]=set[i-1]就是在进入“左子树”的过程,也就是“取”的过程;而auxset[i-1]=0,则是在进入“右子树”的过程,也就是在“舍”的过程。如果读者还是感觉有点抽象,可以在纸上模拟一下这个过程就能深有体会了。

(4)算法实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define maxn 10

//使用数组set表示集合
int set[maxn];
//使用辅助数组auxset表示取和舍的过程
int auxset[maxn];

void init(int n){
	for(int i=0;i<n;i++){
		set[i]=0;
		auxset[i]=0;
	} 
}

void Powerset(int i,int n){
	if(i>n){
		for(int j=0;j<i-1;j++){
			printf("%d  ",auxset[j]);
		}
		printf("\n");
	}else{
		auxset[i-1]=set[i-1];
		Powerset(i+1,n);
		auxset[i-1]=0;
		Powerset(i+1,n);
	}
}


int main(){
	int n;
	printf("请输入集合的元素个数: ");
	scanf("%d",&n);
	init(n);
	printf("请输入元素: ");
	for(int i=0;i<n;i++){
		scanf("%d",&set[i]);
	}
	Powerset(1,n);
	return 0;
}

提示:我这里输出0的原因主要是因为更能表达空集。 

(5)算法拓展

  • 假设以线性表表示集合,则求解后的算法如下所示

实现一个顺序存储的线性表

使用C语言实现单链表的功能(带头节点)

使用C语言实现动态顺序表

使用C语言实现静态顺序表

void GetPowerset(int i,List A,List B){
    //线性表A表示集合,线性表B表示幂集ρ(A)的一个元素
    //局部变量K为进入函数时B的当前长度,第一次调用本函数时,B为空表,i=1
    if(i>ListLength(A)){
        Output(B);
    }else{
        GetElem(A,i,x);
        int k=ListLength(B);
        ListInsert(B,k+1,x);
        GetPowerset(i+1,A,B);

        ListDelete(B,k+1,x);
        GetPowerset(i+1,A,B);
    }
}

参考书籍《数据结构》严蔚敏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android App开发实战之实现微信记账本(附源码 超详细必看)

需要源码或图片集请点赞关注收藏后评论区留言~~~ 一、需求描述 好用的记账本必须具备两项基本功能。一项时记录新帐单&#xff0c;另一项时查看账单列表&#xff0c;其中账单的记录操作要求用户输入账单的明细要素&#xff0c;包括账单的发生时间&#xff0c;账单的收支类型&a…

C++ 输入输出及txt文件输入示例

std::istream typedef basic_istream<char> istream;输入流对象可以读取和解释来自字符序列的输入。 提供了特定的成员来执行这些输入操作&#xff08;参见下面的函数&#xff09;。 标准对象 cin 就是这种类型的对象。 std::istream::getline istream& getline (…

Web3 用例全解析:传统品牌加速进入 Web3 的原因?

Web3 有能力彻底改变品牌和客户相互联系的方式。许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度&#xff0c;这是传统社交媒体和电子商务渠道根本无法做到的。 NIKE、Panini 和 Vodafone 是最早认识到 NFT 价值的公司&#xff0c;而 Gucci、Balmain、Prad…

C语言百日刷题第七天

C语言百日刷题第七天61. 写一个函数isPowerOfTwo判断是不是2的幂次方62. 写一个函数isPowerOfThree判断是不是3的幂次方63.n 的第 k 个因子64.有效的完全平方数65.搜索旋转排序数组66.桌上拿硬币67.计算生成元68.计算分子量69.最佳情侣身高差70.拯救外星人61. 写一个函数isPowe…

计算机毕业设计springboot+vue+elementUI校园疫情防控系统

项目介绍 基本实现了校园疫情防控系统应有的主要功能模块&#xff0c;本系统有管理员、学生。管理员&#xff1a;首页、个人中心、核酸检测管理、体温状态管理、学生管理、学生状态管理、休假申请管理、出入登记管理、疫情知识管理、论坛管理、系统管理。学生权限&#xff1b;…

矩阵分析与计算学习记录-广义逆矩阵

本章重点内容&#xff1a; Penrose方程 {1}-逆的计算及性质 Moore-Penrose逆的计算及性质 tips&#xff1a;广义逆矩阵是在系数矩阵不可逆的情况下进行求解 1. Penrose方程 1.1 广义逆的定义与计算 1.2 Penrose方程基本概念 2. {1}-逆的计算及性质 2.1 {1}-逆的计算 2.2 …

大白话之 Iptables

背景 今天在安装traefik的时候遇见了很神奇的问题&#xff0c;80端口没有任何程序在监听&#xff0c;但是访问的话会返回it works&#xff0c;想来想去可能是iptables的问题&#xff0c;由于Iptables每次都是现查&#xff0c;所以觉得还是理解不到位&#xff0c;总结一波。 表…

远距离WiFi无线传输方案,CV5200模组通信应用,无线自组网技术

无线自组网是一种特殊的无线通信技术&#xff0c;无需依赖任何预先架设的网络设施就可以快速自动组网&#xff0c;并具有很强的抗毁性和灵活性。 特别适用于远距离&#xff0c;高速率的场合&#xff0c;比如无人机&#xff0c;安防监控&#xff0c;智慧建筑&#xff0c;智慧农…

分布式事务Seata源码解析13:TCC事务模式实现原理

文章目录一、前言二、GlobalTransactionScanner1、判断某一个Bean是否需要做TCC动态代理1> 判断bean实现的接口中是否有接口标注了LocalTCC注解2> 当Bean的某一个接口实现了LocalTCC注解之后&#xff0c;解析相应接口中的TCC内容&#xff1a;TCCResource数据样例3> TC…

mysql是怎么运行的-笔记

文章目录启动**MySQL**服务器程序 **1.3.1 UNIX**里启动服务器程序**Windows**里启动服务器程序服务器处理客户端请求常用存储引擎一些重要的字符集**MySQL**中的**utf8**和**utf8mb4**比较规则的查看MySQL有四个级别的字符集和比较规则**InnoDB**记录结构compact 行格式变长字…

【黄啊码】PHP压缩图片(简洁易懂版,不懂我下次不写)

大家好&#xff0c;我是黄啊码&#xff0c;今天我们来解决一件头疼的事情。作为技术人员&#xff0c;我们一般传图片都知道尽量传清晰和大小适中的图片&#xff0c;部署的时候当然也希望客户能按说明办事&#xff0c;但有的客户偏偏不听&#xff0c;就传大的&#xff0c;就传大…

Python标准库glob模块详解

glob是python中的内置模块&#xff0c;该模块主要是用来查找文件与目录的。glob模块是按照 Unix shell 所使用的规则找出所有匹配特定模式的路径名称。我们只需要了解该模块的匹配规则与常用函数&#xff0c;就会使文件查找&#xff0c;路径匹配变得非常快捷简单。 1.匹配规则…

【springboot整合ES】springboot整合ES

springboot整合ES 在Springboot整合ES提供了启动依赖jar。 该jar包封了一个类: RestHighLevelClient 该类可以对象ES中各个接口进行相应的操作。 1. 新建项目 创建springboot工程并导入相关的依赖 2.3.12.RELEASE。最新版spring boot2.7.5中RestHighLevelClient已过时 2. 创建…

python_爬虫

定时、定量、制定目标的数据搜集程序。 技术库 网络请求 urllibrequests&#xff08;三方&#xff09;/ urllib3selenium&#xff08;UI自动测试、动态js渲染&#xff09;appium&#xff08;手机App的爬虫或UI测试&#xff09; urllib requests 基于urllib和urllib3封装的…

什么是“孤岛效应”? ----防孤岛保护装置

防孤岛保护是对分布式光伏电站有着重要保护作用的。即当电网出现电压高、电压低、频率高、频率低故障时&#xff0c;光伏并网开关及时跳闸。当电网恢复供电并且电压和频率达到允许值时&#xff0c;并网开关要自动合闸。这样的目的是在为了国家电网不受太大影响的情况下&#xf…

理解透C语言一维数组,二维数组这一篇就够啦!

前言 &#x1f496;作者&#xff1a;龟龟不断向前 ✨简介&#xff1a;宁愿做一只不停跑的慢乌龟&#xff0c;也不想当一只三分钟热度的兔子。 &#x1f47b;专栏&#xff1a;C初阶知识点 &#x1f47b;工具分享&#xff1a; 刷题&#xff1a; 牛客网 leetcode笔记软件&#xff…

网站部署:使用Nginx部署vue项目到阿里云服务器

最近租了个阿里云的服务器&#xff0c;想使用Nginx把刚做好的网站部署上去 下载Nginx 目前yum已经有了Nginx的源&#xff0c;因此可以直接用yum下载和安装 yum -y install nginx默认的安装位置为/etc/nginx 默认的项目位置为/usr/share/nginx 如果安装失败检查是否安装了zli…

渗透测试-CTF文件类型操作

识别文件类型 文件分离 文件合并 识别文件类型 当文件没有后缀名或者有后缀名无法正常打开时&#xff0c;根据识别的文件类型来修改后缀名即可正常打开文件。 使用场景&#xff1a;不知道后缀名&#xff0c;无法打开文件。 第一种方式&#xff1a;kali中使用 file 文件名 f…

173:vue+openlayers:解决国内openstreetmap地图加载不出来的问题(代码示例)

第173个 点击查看专栏目录 近来写程序,发现openlayers用OSM方式来加载OpenStreetMap地图,一片爆红,瓦片加载不出来。 本示例的目的是介绍演示如何在vue+openlayers中解决OpenStreetMap地图在国内被DNS污染,加载不出来瓦片的问题,通常我们是直接引用OSM,这里采用的是XYZ方…

2022年11月第十四届蓝桥杯校模拟赛详解+代码(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校蓝桥杯校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习&…