子集枚举

news/2025/4/1 9:08:38/文章来源:https://www.cnblogs.com/YipChipqwq/p/-/subset

子集遍历

for (int i = 0; i < 1 << n; i ++ )

这个代码可以从 \(0\) 开始不重复的遍历每一个二进制数,因此时间复杂度 \(O(2^n)\)

子集枚举

有的时候,我们希望枚举集合 \(i\) 所对应的所有自己,显然我们不可能循环套循环求与的方法做,时间复杂度是 \(O(2^{2n})\) 的,不优。

我们下面介绍子集枚举,他可以按照降序排序枚举集合。

for (int S = 0; S < 1 << n; i ++ )for (int T = S; T; T = (T - 1) & S)

\(T\) 最初恰好是集合 \(S\),在下一次循环时,我们让 \(T = (T - 1) \& S\),容易发现,把 \(T\) 的最后一个位掩码去掉了。

S = 1010100
T = 1010100 -> T = 1010011 & 1010100 = 1010000

再进行下一次循环,我们把刚才的比特恢复,消去下一个比特。

S = 1010100
T = 1010000 -> T = 1001111 & 1010100 = 1000100

接着再移去最后一个比特。

S = 1010100
T = 1000100 -> T = 1000011 & 1010100 = 1000000

以此类推,不难发现,T = (T - 1) & S 等价于我们倒序枚举连续集合的 T -- ,相当于无视了中间的 \(0\) 进行转移,这是优秀的,保证了每个子集唯一出现一次。

考虑每个枚举集合 \(S\) 的子集 \(T\) 的次数:

\[\begin{aligned}\sum_{S \subseteq \{1, \, 2, \, \cdots, \, n\}}\sum_{T \subseteq S}1 &= \sum_{i = 0}^n\binom{n}{i}2^i \\ &= (2 + 1)^n \\ &= 3^n\end{aligned} \]

因此子集枚举的复杂度是 \(O(3^n)\)

相关题目

这个东西通常用在一些 状压DP 的状态转移中,具体可以参考一下下面的题目。

最小斯坦纳树

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus的标签管理

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.标签概述1.什么是标签2.标签主要有两种表现形式3.Prometheus对数据处理的流程二.relabel_configs修改target标签案例1.为targets自定义打标签案例2.使用target_label新增标签2.relabel_configs替换标签…

极速启动,SAE 弹性加速全面解读

本文将深入探讨 SAE 如何通过镜像加速、应用启动加速、CPU Burst 等核心技术手段,实现极速启动与高效运行,帮助用户构建更加稳定、高效的云端应用。作者:牛通(奇卫) 在当今快速发展的云计算时代,业务的稳定性和响应速度成为了企业竞争力的重要标志。无论是应对突发流量还…

Redis缓存穿透、击穿与雪崩:问题分析与解决方案

在现代高并发系统中,Redis作为缓存层被广泛使用,其高效的读写性能为系统提供了强大的支持。然而,在使用Redis缓存的过程中,缓存穿透、击穿和雪崩等问题可能会对系统造成严重影响。本文将围绕这些问题展开讨论,并结合Redis的特性提出具体的解决方案。 一、Redis缓存穿透:如…

java - 使用OpenCV + Tesseract识别图片验证码

java - 使用OpenCV + Tesseract识别图片验证码tesseract tesseract-ocr/tesseract: 是一个开源的光学字符识别(OCR)引擎,适用于从图像中提取和识别文本。特点是可以识别多种语言,具有较高的识别准确率,并且支持命令行和API调用。项目地址:https://gitcode.com/gh_mirror…

【笔记】力扣 2316. 统计无向图中无法互相到达点对数——并查集, + 一种巧妙的求两两相乘之和的方法

2316. 统计无向图中无法互相到达点对数 中等 提示 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。 请你返回 无法互相到达 的不同 点对数目 。 示例…

APT Package Manager

from pixivWhat is APT? Anatomy of the Package System(软件包系统剖析), is the Debian packaging system, 用于管理软件包,可以将其想象成命令行版的App Store.Debian 是一个自由且开源的 Linux 发行版,Ubuntu 是基于 Debian 构建的 Linux 发行版。它由 Canonical 公司…

22.1-任务的状态 第22章-FreeRTOS项目实战--任务的创建与执行 FreeRTOS 项目 FreeRTOS学习笔记 FreeRTOS移植 FreeRTOS开源项目 FreeRTOS面试题汇

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里: https://www.bilibili.com/video/BV16x4y1M7EN/?share_source=copy_web&vd_source=f5d5850ab773377dff308188468fbc77 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式…

ART树在订单簿管理中的应用

背景近期在工作中,我接触到了一种高效的数据结构——自适应基数树(Adaptive Radix Tree,ART)。ART 是一种基于基数树(Radix Tree)的数据结构,旨在提供高效的键值存储和查找功能。与传统的基数树不同,ART 通过自适应调整节点大小(如 Node4、Node16、Node48 和 Node256)…

AtCoder Beginner Contest 399 ABCDEF 题目解析

A - Hamming Distance 题意 给定两个长度均为 \(N\) 的字符串 \(S\) 和 \(T\),求总共有多少个位置不同。 思路 直接输入字符串后逐位判断即可。 代码 int n; string s, t; cin >> n >> s >> t; int ans = 0; for(int i = 0; i < n; i++)ans += (s[i] != …

Solana编译失败探讨(OpenEuler RISC-V版)

Solana 是 2017 年由 Anatoly Yakovenko 创立的开源项目,旨在打造高性能、去中心化且低成本的区块链平台2。它采用独特的 Proof of History(PoH)共识机制,结合 Tower BFT 等技术,实现了每秒数千笔交易的高吞吐量,确认时间仅 400 毫秒,每笔交易中位数费用为 0.00064 SOL1…

windows将ollama及模型安装到D盘或其他盘符

Ollama官网 在ollama安装包存放的文件路径输入 cmd 回车自动打开命令窗口 在命令行输入一下内容: 软件包名称 /DIR=指定目录OllamaSetup.exe /DIR=E:\software\Ollama 弹出安装程序,直接Install ---------------------------------------------------------------------…

【DIY】通达信DIY添加扫雷宝、地图和复盘(1)

【写在前面】炒股软件有很多,电脑版我用的多的通达信,手机版用的多的是同花顺。之前还有一些其它的软件,比如A股通、短线王、wind股票、雪球等都有自己的特色。自己不喜欢一次装好多软件,所以就产生了聚合的念头。通达信通赢版可以登录多券商账号,懒得来回切换,所以选择以…