php - 仅计算一次引用公式的算法

标签 php algorithm formula

我正在寻找一个很好的算法来解决以下问题。

我有以下 VARIABLES 和 FORMULAS 列表(var 的结果是所有公式的总和):

var1, result=10
  - 5+5=10

var2, result=15
  - var1+5

var3, result=30
  - var1+var2+5

现在我正在寻找一种计算所有引用的好方法。如果我正在更改 var1,结果现在是 15,我必须计算所有引用 var1 的值。首先,我遇到了 var2 并重新计算了 var2,如果 var2 的结果发生了变化,我必须将所有引用的公式重新计算到 var2。因此我会重新计算 var3 两次(var2 已更改,var1 已更改)...

在这种情况下有没有不计算 var3 两次的解决方案?

谢谢!

最佳答案

是的,你可以确保你只重新计算每个变量一次(最多),通过使用没有循环依赖的事实(变量 x 不可能需要 y 为了计算,同时 y 还需要 x)。

这是通过将问题建模为 graph 来完成的,其中所有变量都是顶点,“所需”关系是有向边。 (因此,如果变量 x“需要”计算变量 y,则存在边 (y,x))。

现在,由于无循环依赖,这实际上是一个 Directed Acyclic Graph ,你可以做到topological sort (这只能在预处理中完成一次)。请注意,在您的情况下,图表很可能已经排序,因为它是作为事件的时间顺序给出的,并且时间顺序是拓扑排序。

对图进行拓扑排序(如果需要),每当变量发生变化时:

Upon variable change:
1. Mark all changed variables
2. From first variable to last (according to topological sort), for each variable x:
      2.1. If there is some dependency `(y,x)` on the graph such that `y` is marked:
           2.1.1. mark x
           2.1.2. recalculate x

很容易看出,根据这种方法,每个变量最多计算一次。

关于php - 仅计算一次引用公式的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501027/

相关文章:

ruby - 如何绘制一个大小为 n 的方形网格到控制台?

Excel:在多个常见日期中查找第一次

math - 以类似于 Photoshop 中的 L 组件的方式增加图像亮度的公式是什么?

php - 使用 PHP 存储 JSON 值

php - 通过 htaccess 为登录用户强制 https

algorithm - O(1)+O(2)+ .... +O(n) 的阶和

php - 堆叠算法 - 在尽可能小的区域堆叠 3d 对象

php - 使用 PHP 的 HTML DOMDocument 解析 HTML

php - 可以访问 Smarty 对象的 Smarty 修改器插件

java - BST 节点删除算法是如何工作的?