修改:我不是在寻找实现方式,而是在寻找一些关键字和方法来帮助我入门。
我正在努力生成一个依赖关系树,其中子节点由外部进程更新,并且要求是更新已更新的子节点的所有父节点。
示例:想象一棵这样的树:O [父级],O(l)[左子级],O(r)[右子级],O(ll),O(lr),O(rl),和O(rr)。 O(ll),O(lr),O(rl)和O(rr)引用了以随机间隔更新的数据集合。
我想实现一个拉过程,在该过程中,每隔一定的时间检查O是否被更新。 “更新”定义为在所有子节点都更新时更新,否则仅使用该节点的缓存值(结果)。提取过程的工作是确保在未更新任何子节点时更新O。这意味着该过程需要遍历树并检查O(ll),O(lr),O(rl)和O(rr)是否已更新。如果自这些子节点的最后一次更新以来更新了那些子节点引用的数据集合,则需要根据已更改的数据集合来更新那些子节点。如果数据集合被更新,因此子节点O(ll),O(lr),O(rl)和O(rr)也被更新,这意味着O(l)和O(r)也需要被更新,随后O也将被更新。每个子节点都输入到其父节点。
这里的复杂性是每个子节点在不同的树之间共享,这意味着一棵树的子节点也可以是另一棵树的任何子节点。这种结构的目的是避免在子节点已经是最新的情况下重新计算。如果不同的树实现的子节点具有与现有子节点完全相同的功能(功能和参数化),则子节点将共享。
我一直沉迷于此结构的设计以及如何实现它。我还没有提供代码,因为我坚持设计思想过程。本质上,每个孩子都是功能,并且依赖于相关功能本身。
让我感到奇怪的是,C#是否提供装饰方法和类的功能,以简化对节点是否更新的检查。惰性评估在这个过程中是否也起作用?
答案 0 :(得分:1)
我建议定义一个类,以跟踪其子级是否已通过标志(例如)更新。名为default interface members
的布尔值。树中的节点可以通过引发事件来告诉其父节点变脏。当节点返回自己的值时,它应检查该标志并仅在需要时重新计算其自己的值。重新计算时,它应检查每个子项的值,然后每个子项将递归检查其自己的脏标志,依此类推。
Dirty