【问题标题】:Algorithm for optimizing computation of an arithmetic expression优化算术表达式计算的算法
【发布时间】:2013-09-04 00:16:11
【问题描述】:

假设我有一个由整数变量和算术运算组成的表达式:加法、减法和乘法。我知道每次乘法需要 M 秒,每次加法/减法需要 A 秒。是否有一种算法可以以最有效的方式计算表达式,以对变量进行任意赋值? (假设我只能在内存中存储一​​个数字)。

例子:

M=10

A=1

表达式:a*a+a*b+b*b。

最初有3次乘法和2次加法,所以总时间为3*M+2*A=32

但是,我们可以构建一个等价的表达式 (a+b)*(a+b)-a*b,它只有 2 次乘法和 3 次加法,因此总计算时间为 2*M+3*A= 23.

【问题讨论】:

  • 我们在计算解时是否必须考虑每个 M 和 A? ;)
  • 是的,每次乘法成本为M,每次加法成本。你不能重复使用你得到的结果。 (假设您正在使用反向波兰符号并逐步计算每个 + 或 *)。
  • 我不确定您是否理解我的问题——例如,在您的示例中,您将总计算时间描述为2*M+3*A=23。我在问在计算2*M+3*A=23 的解决方案时使用的 M 和 A 怎么样。也许需要另外 3*M 和 15*A 来计算 23 的解。在这种情况下,总数将是 23+45...
  • 不,我们不需要考虑 time(23) 计算,假设我们有一个计时器来测量它。 23 是我们需要使用等价形式 (a+b)*(a+ b)-ab。我想知道是否有一种算法(可以是任意复杂的)来提出一个等价的形式,这将导致最快的计算。

标签: algorithm optimization expression


【解决方案1】:

【讨论】:

  • 我认为这里不适用。首先,它用于计算因子乘积的边际,而不是变量。其次,它不能保证操作数量的最优性,并且取决于您选择的变量排序。如果我错了,您能否在我上面提供的示例中说明如何使用它?
【解决方案2】:

您基本上是想减少乘法次数。一种方法如下(我不知道由此产生的成本降低是否可以证明算法的复杂性和成本是合理的):

  1. 根据运算符优先级对允许添加的所有操作数执行添加。

  2. 形成必须进行乘法运算的操作数对。

  3. 在对中,取出共同的操作数并将它们的对应物相加。

  4. 更新配对并转到第 3 步。

  5. 当没有这样的公共对时停止。然后只做剩下的计算。

    例如: a*b + a*c + d*(e+f) 对 e & f 执行加法(比如 g = e + f) a*b + a*c + d*g 对: (a,b) (a,c) (d,g) a 在前两对中很常见,所以我们添加 b 和 c。

【讨论】:

  • 这是我的第一个想法。我无法证明它总是产生最佳结果。你怎么知道我们不需要在原始表达式中添加一些东西?例如,给定某个表达式 E,我们可以将 ab 添加到它,计算 E+ab(可能会简化),然后减去 a*b 以获得原始结果?这会导致无穷大可能行动的空间。如何证明组合一些产品总是比在表达式中添加新东西更有效?
猜你喜欢
  • 2020-04-16
  • 2011-01-25
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多