【发布时间】:2016-08-01 02:58:00
【问题描述】:
令 V 是属于域 D 的元素数组(例如整数)
V = {v1, v2, ..., vN}
令 f(x,y) 为定义在 [DxD]->D 中的二元运算符 z=f(x,y)。
f 是关联和交换的。
f 不支持其全域的逆,即如果结果 z 和参数 x 或 y 之一已知,则并不总是可以获得另一个参数。
给定一对有序索引 (i,j),运算符 g(i,j) 定义为使用运算符 f 获得的子数组 {vi, ..., vj} 的约简。
例如,如果f是乘法运算符,即f(x,y)=x*y,那么
g(2,5) = v2 * v3 * v4 * v5
我需要在一大组 (i,j) 上计算泛函 g,其中涉及向量 V 的重叠元素。
我想利用算子 f 的关联性,以尽可能少的算子 f 应用次数来执行此计算,因为 f 在计算上非常昂贵。
例如,继续上面的例子,其中 f 是整数乘法,给定一个包含 5 个条目的数组 V 和索引对 (1,3), (2,4), (2,5), (1 ,4),我可以用 6 个乘法计算所有对:
V={1, 2, 0, 3, 5}
1. V12 = V1 * V2
2. V13 = V12 * V3 // pair (1,3)
3. V14 = V13 * V4 // pair (1,3)
4. V23 = V2 * V3
5. V24 = V23 * V4 // pair (2,4)
6. V25 = V24 * V5 // pair (2,5)
任何人都可以建议一种算法来导出最佳计算图,就像我在上面手动所做的那样?我知道问题的解决方案不是唯一的。任何最小的解决方案都可以。即使是启发式的伪最优解决方案也可以。
【问题讨论】:
-
区间树似乎是识别重叠计算的好工具
标签: algorithm optimization mathematical-optimization