相关值网络-如何仅重新计算一次?
|
我希望你们中的一个能弄清楚这一点。
我有一个包含很多对象的数组。数组中的每个对象都包含两件事:
可以更改的值。
数组中零个或多个其他对象的列表,如果它们的值更改,则此对象需要重新计算其值。这可以在对象之间多次层叠,但是没有依赖关系的循环。
我相信这称为网络(就像一棵树,但有多个父级)。具体来说,这是有向无环图。
我现在正在做的是这样:当我更改对象的值时,我检查数组中的每个对象以查看其是否取决于我刚刚更改的对象。如果是这样,那么我告诉该子对象重新计算。然后,孩子以相同的方式告诉孩子,依此类推。
此方法可以正常工作(值会正确更新),但是当进行更改时,它的速度会非常之慢(非常宽泛)。这是因为如果一个对象有许多更改的父对象,则它会为每个对象重新计算一次,并且还告诉它的孩子每次都重新计算,因此它们仅从一个父对象那里收到几条消息。这迅速滚雪球,直到许多对象重新计算数十次为止。
在所有对象的父母都重新计算之后,只重新计算每个对象一次的最佳方法是什么?
谢谢你的帮助。
没有找到相关结果
已邀请:
3 个回复
豪抱怒掳
贡炮逗握惫
的变化需要re2ѭ的重新计算时(即
在对象
的列表中),创建一个非循环有向图,其顶点由数组中的节点给出,并且边为
。该图是非循环的,前提是您的过程是有限的。 现在,当ѭ1改变时,先进行广度搜索以重新计算从属节点。在第一遍,收集所有节点
,使
。重新计算那些
。在第二遍,取每个变化的
并得到其附属物
。然后立即重新计算那些
。继续处理所有已更改的ѭ11的依存者,依此类推,直到只有叶子为止。 这要求您保留邻居列表,这是您所拥有信息的反面。因此,您需要进行一次通过才能获得有向边(填充数组,以使条目
具有所有
的数组,而
对应于数组
)。
疾很毋悲