建议如何保持"计算"很多"依赖"参数

jav*_*red 8 algorithm

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

设计

在某些时候假设法郎改变了.然后我们应该:

  1. calc法郎/第纳尔
  2. calc Franc/Dinar/Peso

或者,如果Peso,Franc和Dinar一下子改变了,那么我们应该:

  1. calc法郎/第纳尔
  2. calc Franc/Dinar/Peso
  3. calc Peso + Euro /(欧元+美元)

因此,无论什么时候,Level 0我们应该重新计算所有其他级别.但

  • 我们应该只计算所需的项目.如果欧元改变,我们不需要重新计算法郎/第纳尔
  • 我们不应该多计算任何东西.如果欧元和美元立即改变,我们应该只计算一次欧元+美元(不是两次).

最直接的解决方案是:

  • 将每个级别存储在数组中
  • 对于来自下一级别的数组音轨"听众"中的每个项目(可能很难,因为例如Peso有来自不同级别的听众 - 来自Level2的Franc/Dinar/Peso和来自Level 3的Peso + Euro /(Euro + Usd),所以两个 - dimmension数组是必需的..)
  • 如果重新计算项目,则标记所有侦听器也要重新计算
  • 从0级到最后一级并重新计算标记为重新计算的项目(最初更新的项目是要重新计算的市场,例如Peso).

我想我的问题很有名,可能你可以建议我一般众所周知的解决方案.我不想重新发明轮子:)谢谢!

Duk*_*ing 2

我认为基于级别的方法是不错的,假设听众总是处于较低的级别。

想法:

有一个包含实际数据的二维数组,第一个索引是级别,第二个索引是级别上的位置。让每个元素都有一个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)

修改EU

添加E和并将两者设置U为true。toBeRecalculated[0]willBeRecalculated

经过toBeRecalculated[0]

修改时E,将willBeRecalculated其设置为false,将其设置E+UwillBeRecalculatedtrue,并将其添加到,将其toBeRecalculated[1]设置为true,并将其添加到。E/E+UwillBeRecalculatedtoBeRecalculated[2]

修改时U,将willBeRecalculated其设置为 false,我们检查E+UwillBeRecalculated发现它是 true,所以什么也不做。

然后通过toBeRecalculated[1]。修改时E+U,将willBeRecalculated其设置为 false 并检查E/E+U'swillBeRecalculated并查看它是否为 true,因此不执行任何操作。

笔记:

让侦听器成为指向元素的指针而不是级别和索引变量可能会更好。