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

问题描述

我正在尝试为简单问题(相对简单)找到一个好的解决方案。好吧,我有一个像这样的人为创建的二元方程

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。

我需要一种解决方案来为给定方程生成此列表。

我为什么需要那个?

我已经开发了一种快速的全文本搜索算法,该算法也适用于短语,但是现在我需要通过“或”,“与”进行扩展,并用大括号括起来,以增加Google的灵活性。 / p>

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

解决方法

欢迎来到“ N = NP”猜想的美好世界。

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

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

要代表解决方案,您至少有两个选择:

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

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


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

,

实际上,您需要解决的问题是表达式的解析器,并且您可以递归确定A,B,...的哪些解决方案对于使方程式成立是必需的。实际上,逻辑编程语言(例如Prolog等)正是这样做的。它将在方程式中最终列出True的所有可能的解决方案。

,

我的理解是,您有一个数据集,其中包含对/错以及所有其他数据的所有组合。您只想提取使方程式成立的数据集成员,而不必对每个方程式求值。

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

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