假设我采取的计算只涉及加法和乘法:
(a+b)*(c+d)
可以通过许多其他方式完成,例如
a*(c+d) + b*(c+d)
a*c + a*d + b*c + b*d
在加法和乘法方面,所示三个例子中每一个所需的操作次数分别为(2,1)(3,2)(3,4)。显然,如果目标是减少操作的总数,那么第一个是优越的。有没有办法,给定一个任意表达式来查找需要最少操作次数的计算顺序?
注意: This question正在向SE.math重新询问CS群体的洞察力和观点。
答案 0 :(得分:7)
你想要的是有效地生成所有可能的等效代数表达式,并选择花费最少代价步数的那个(在大多数机器上添加X三次比在X乘以3便宜) )。
这样做是不切实际的,因为“等效”公式的数量是无限的。
然而,Pelegrí-Llopart找到了一个方案,在给定固定数量的代数重写规则(称为"BURS" (bottom-up rewrite system))的情况下生成最佳代码。这已在一些代码生成器中实现。
从本质上讲,他构建了一个大型自动机离线,其状态跟踪可能的应用重写集。每个州都知道它发生时会产生什么,因此代码生成的在线时间很便宜。
答案 1 :(得分:5)
忽略变量和整数系数的幂,这会减少到Karnaugh Map问题。
K-Maps可以以产品总和形式和总和形式表示,每个形式代表二进制电路。 “最少的操作”表单代表optimized binary circuit,对吗?
答案 2 :(得分:4)
以单项形式有效评估多项式有一个Horner's Rule。根据它,给定n次多项式
p(x)= a n x n + a n-1 x n-1 + ... + a 1 x 1 + a 0
只需要n次乘法(不是n +(n-1)+(n-2)+ ... + 1 = n(n + 1)/ 2,因为从第一眼就可以看出)。那是因为polinomial可以改写为
p(x)=(((a n x + a n-1 )x + a n-2 )x + ... a 1 )x + a 0
答案 3 :(得分:1)
一个想法 - 让我们将变量视为布尔值并编写最大形式 link text
答案 4 :(得分:0)
不确定一般情况,但似乎分解多项式可以提高性能。远程comp sci课程的一个例子:
a * x^2 + b * x + c
通过分解x:来改进
x * (a * x + b) + c