Algorithm 找到二元方程所有解的最快方法

Algorithm 找到二元方程所有解的最快方法,algorithm,math,boolean,boolean-expression,boolean-operations,Algorithm,Math,Boolean,Boolean Expression,Boolean Operations,我试图为这个简单的问题(相对简单)找到一个好的解决方案。我有一个人类创造的二元方程,就像这个 A&B&C&D&E&F=1 所以有一组二进制变量(a,B…多达12个变量),每个变量可以是0或1。以及它们之间的一些数学运算符(And,OR)和括号 我有一大组(a、B、С…)值(可能是一百万甚至更多),我需要一种方法来只选择那些在这个特定等式中给出1的值 我绝对不想为给定列表中的所有项目求解这个等式,这将需要大量CPU资源 相反,我认为有一种方法可以得到一组值向量,给我们1,然后将这组值向量用作哈希表

我试图为这个简单的问题(相对简单)找到一个好的解决方案。我有一个人类创造的二元方程,就像这个

A&B&C&D&E&F=1

所以有一组二进制变量(a,B…多达12个变量),每个变量可以是0或1。以及它们之间的一些数学运算符(And,OR)和括号

我有一大组(a、B、С…)值(可能是一百万甚至更多),我需要一种方法来只选择那些在这个特定等式中给出1的值

我绝对不想为给定列表中的所有项目求解这个等式,这将需要大量CPU资源

相反,我认为有一种方法可以得到一组值向量,给我们1,然后将这组值向量用作哈希表

你能推荐任何方法来创建这样一个向量表吗?有没有现有的算法?多谢各位

对不起,我的英语,也许举个例子可以让事情变得更清楚:

假设我们得到的方程是这样的:
A&(B | C)
,因此相应的向量列表将是 101、110、111

我需要一个解决方案来生成给定方程的列表

为什么我需要这个

我已经开发了一种快速全文搜索算法,它也适用于短语,但现在我需要通过“或”、“和”扩展它,并使用大括号元运算符来增加一些灵活性,就像谷歌一样


例如,如果用户输入查询“master and margarita”,则会在所有文档中找到单词“master”(A)和单词“margarita”(B)。因此,每个文档都有一组a,B。接下来,我们有一个等式
A&B
,我们所需要的就是找到这个等式为1的文档。当用户输入“master或margarita”时,方程将是“A或B”,等等。

欢迎来到“N=NP”猜想的奇妙世界

没有人确切知道是否有可能比穷举试验更快地解决这些问题,穷举试验需要对
N
变量表达式进行
2^N
评估

无论如何,对于
N
小到
12
,只有
4096
组合,而不是数百万,暴力可能是最好的选择

要表示解决方案,您至少有两个选项:

  • 每个组合保持单个位0/1。您将需要
    512
    字节

  • 使用
    12
    位字显式存储每个解决方案。在这种情况下,所需的总位数事先不知道。它可以低至0,但“高”至3072字节:-(



使用蛮力,我想您最多可以处理30个左右的变量。

实际上,您需要解决这个问题的是表达式的解析器,您可以递归地确定a、B……的哪些解决方案是使方程为真所必需的。事实上,逻辑编程语言(如Prolog等)这样做。它会列出方程中A,B,…的所有可能解,最终会为真。

我的理解是,你有一个数据集,其中包括真/假的所有组合,可能还有一些其他数据。你只想提取数据集的成员,使方程为真,而不需要having对每个人都进行评估

由于只有4096个组合,您应该能够创建一个从真值组合到数据集中具有该组合的行的查找表


当你得到一个等式时,你可以在每一个布尔值的组合上尝试它,然后只需查找返回true的键。(实际上,您可以更聪明地生成满足等式的布尔值组合列表,但您仍然需要布尔值组合存储的数据来生成答案列表,而无需对每个答案进行评估。)你看不到其他行。

没有列出
运算符。没有它,这不是NP完全的。@b当然是的,那里也可能没有。谢谢。我们知道你为什么要这样做吗?@YvesDaoust我已经在最初的帖子中添加了解释,谢谢!谢谢解释。当然12个变量就足够了。然后我想一个2^n布尔数组是一个很好的解决方案(n是变量的数量)。