【问题标题】:Minimum number of operations to execute an associative operations on overlapping sets在重叠集上执行关联操作的最小操作数
【发布时间】: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


【解决方案1】:

这个问题有时被称为范围半群查询问题或部分和问题,并且有一些非常快速的解决方案。 These slides 推导出一个解决方案,该解决方案对 f 进行 nα(n) 预处理应用程序,并支持对 f 进行 α(n) 调用的查询,其中 α 是反 Ackermann 函数。还有一篇论文详细介绍了even faster approach。希望这些可以让您朝着正确的方向开始!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 2011-02-13
    • 2022-01-07
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多