我有几个指标需要"始终保持最新".即如果有任何改变,我需要重新计算"依赖".我有几个级别,只有在计算前一级别时才应计算每个下一级别.让我用这幅闪亮的画面解释一下:

在某些时候假设法郎改变了.然后我们应该:
或者,如果Peso,Franc和Dinar一下子改变了,那么我们应该:
因此,无论什么时候,Level 0我们应该重新计算所有其他级别.但
最直接的解决方案是:
我想我的问题很有名,可能你可以建议我一般众所周知的解决方案.我不想重新发明轮子:)谢谢!
我认为基于级别的方法是不错的,假设听众总是处于较低的级别。
有一个包含实际数据的二维数组,第一个索引是级别,第二个索引是级别上的位置。让每个元素都有一个willBeRecalculated标志。
每个级别都有一个toBeRecalculated列表(因此是一个列表数组)。
对于每个元素,都有一个包含 2 个整数的元素(侦听器)列表 - 一个用于级别,一个用于索引。
对于要修改的每个元素,将元素添加到toBeRecalculated适当的级别并设置willBeRecalculated为 true。
然后toBeRecalculated从第一层到最后一层,重新计算每个元素,将其设置willBeRecalculated为 false,并为每个侦听器查找适用的元素,如果willBeRecalculated为 true,则不执行任何操作,否则设置willBeRecalculated为 true 并将其添加到toBeRecalculated其 (听众)的水平。
这种方法不会遍历所有数据来检查哪些内容需要修改/已经修改,它只检查适用的元素,并且没有重复计算。
为了这:

(对于我的缩写,我只是简单地取了每个单词的第一个字母。我使用的是 0 索引数组)
实际数据:
[[E, U, P, F, D],
[E+U, F/D],
[E/E+D, F/D/P],
[P+E/E+U]
]
Run Code Online (Sandbox Code Playgroud)
听众:
E:[(1,0), (2,0)] // E+U and E/E+U
U:[(1,0)] // E+U
P:[(2,1), (3,0)]
F:[(1,1)]
D:[(1,1)]
E+U:[(2,0)]
F/D:[(2,1)]
E/E+U:[(3,0)]
Run Code Online (Sandbox Code Playgroud)
修改E和U:
添加E和并将两者设置U为true。toBeRecalculated[0]willBeRecalculated
经过toBeRecalculated[0]。
修改时E,将willBeRecalculated其设置为false,将其设置E+U为willBeRecalculatedtrue,并将其添加到,将其toBeRecalculated[1]设置为true,并将其添加到。E/E+UwillBeRecalculatedtoBeRecalculated[2]
修改时U,将willBeRecalculated其设置为 false,我们检查E+U并willBeRecalculated发现它是 true,所以什么也不做。
然后通过toBeRecalculated[1]。修改时E+U,将willBeRecalculated其设置为 false 并检查E/E+U'swillBeRecalculated并查看它是否为 true,因此不执行任何操作。
让侦听器成为指向元素的指针而不是级别和索引变量可能会更好。