algorithm - 如何迭代按位掩码的子集?
问题描述
我有一个表示为整数的位掩码。掩码和整数仅限于 32 位整数。
我有兴趣检查给定掩码/整数的集合位的所有子集,但我不知道快速找到这些子集的好方法。
我一直在使用的解决方案是
for(int j = 1; j <= mask; ++j)
{
if(j & mask != 0)
{
// j is a valid subset of mask
}
}
但这需要从j = 1
to循环mask
,我认为应该有比这更快的解决方案。
有比这更快的解决方案吗?
我的后续问题是,如果我想将子集限制为固定大小(即固定数量的设置位),是否也有一种简单的方法可以做到这一点?
解决方案
在 C++ 中迭代所有的subset
:state
for (int subset=state; subset>0; subset=(subset-1)&state) {}
这个技巧通常用于位掩码+dp问题。总的时间复杂度是 O(3^n) 来迭代 all subset
of all state
,如果使用这个问题中的代码,这比 O(4^n) 有了很大的改进。
推荐阅读
- python-3.x - 如何在 scipy/numpy 中使用 scipy.sparse.csr_matrix 创建稀疏矩阵
- python - 合并大小略有不同的栅格
- python - QtableWidgets 用python对一列求和
- android - 每隔几小时在特定的毫秒内执行任务 Android
- docker-compose - Yii 1.1 与 AWS Fargate 上的 JQuery 资产有关的问题 - Dockerized 应用程序
- python - Pandas:在两个不同时间序列中按日期顺序分组在同一 ID 下的列表中显示事件
- git - ADF:重新部署 ADF 后,自托管集成运行时不可用
- python-3.x - 按特定顺序存储 2 个 API 调用响应 [Python 3]
- database - 在 oracle 12c 上创建索引时出现不适当的错误
- windows - ASP.NET Core 应用程序和 Windows 服务通信