【问题标题】:Fastest way to find all solutions of the binary equation找到二元方程所有解的最快方法
【发布时间】:2020-12-19 20:14:57
【问题描述】:

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

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。

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

为什么我需要那个?

我开发了一种快速的全文搜索算法,它也适用于短语,但现在我需要通过“OR”、“AND”和大括号元运算符来扩展它,以像 Google 一样增加一些灵活性。

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

【问题讨论】:

  • 我们能知道你为什么想要那个吗?
  • @YvesDaoust 我在最初的帖子中添加了解释,谢谢!
  • 感谢您的解释。当然 12 个变量绰绰有余。然后我猜一个 2^n 布尔数组是一个很好的解决方案(n 是变量的数量)。

标签: algorithm math boolean boolean-expression boolean-operations


【解决方案1】:

欢迎来到“N=NP”猜想的精彩世界。

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

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

要表示解决方案,您至少有两种选择:

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

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


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

【讨论】:

  • 没有列出not 运算符。没有它,这不是 NP 完全的。
  • @btilly 是的,我认为 NOT 也可能在那里。谢谢
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我的理解是,您有一个数据集,其中包括真/假的所有组合,可能还有其他一些数据。您只想提取数据集中使等式成立的成员,而不必对每个成员进行评估。

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2013-05-25
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2017-11-01
      • 2021-10-28
      相关资源
      最近更新 更多