布尔组合数学 C++
Boolean combinatorics c++
我正在尝试做一个组合数学类型的问题:查找布尔公式有多少个不同的变量设置将计算为true。我最初的想法是生成长度为 n 的每个可能的二进制数(n 是问题中的变量数)。对于函数 x1 或 x2,则 n=2,因此可能性为: 00, 01, 10, 11.我最初的想法是从 0 到 (n*n)-1,并使用 bitset 将每个数字转换为二进制。我的问题是位集的长度必须由运行时确定,所以没有 bitset(i),就像我计划做的那样,其中 n 是变量的数量,i 在每次迭代时。我也不能做动态位集,因为我的学校还没有安装提升库。所以现在我想知道我是否应该手动对每个数字进行数字翻译......或者如果有一个更好的解决方案,正如我想象的那样,我建议的这个解决方案在计算上是昂贵的,因为数字很大。有没有办法把它当作一个组合问题来处理,这样我就可以在 n^2 时间内运行并找到长度为 n 的每个可能的布尔设置,而无需将每个数字转换为二进制?
为此形成的直接公式是4n-2n
解释
对于 n 位数字,可能的组合总数为 4n。为了使XOR b为真,它们至少有一个位应该不同。
对于 a 和 b 在一个位置的位,有 4 种可能性 (00,01,11,10),在这 11,00 种情况下,两个位都相同。现在我们找到组合的数量,使得一个位置上的所有机器人在两个数字中都相同(即,XOR b 为假)。这等于 2 n 因此,所需的组合为4 n-2n
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 组合字符串不适用于 libCurl,C++
- 测试两个类型列表中的所有组合
- 将多个 for 循环组合成单个迭代器
- 如何从组合指数中找到仓位
- 防止组合框被关闭
- 如何解决可能的唯一组合问题