我希望编写一种算法来同步两个层次结构。这些结构可以是对象图,关系数据库表中存储的数据等(即使是两个不同的结构,只要它们具有可比较的键即可)。同步将是单向的,即一种结构将是原型,而另一种将被修改以匹配。
假设我们有一个sync
函数。它需要接受以下内容:objA
-原型objB
-要修改的对象keyA
-objA
的密钥生成功能keyB
-objB
的密钥生成功能addB
-创建objB
的函数(返回新objB
的ID)setB
-更新objB
的功能remB
-删除objB
的功能parB
-objB
父级的id-传递给addB
作为上下文
所以我们有这个:
let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k)
(addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit)
(parB:'p) = ...
现在这是我遇到麻烦的地方。
'a
和'b
是分层的,因此该函数需要知道应遍历'a
和'b
的哪些属性(一旦比较它们的键并确定它们到目前为止匹配,并且应该进一步遍历)。对于这些“子”属性,需要传递所有相同的参数以进行同步,但需要使用各自的类型。这是显而易见的,这是一个数据结构问题。如何将这些信息链接在一起,以便可以将根对象传递给
sync
,并且可以向下遍历图形?我最初的想法是将所有参数合并到一个类中,该类将具有children属性(相同类型的ResizeArray
)。但是对于具有不同类型的各种属性,我想不出一种使之起作用的方法,缺少将类型扔出窗口并使大多数或所有类型参数成为obj
的一种方法。所以这是我的问题:
是否已经有完善的方法来执行此操作(我什么也找不到)
我可以使用哪种数据结构来封装完成这项工作所需的数据?
我已尽力彻底解释了这一点,但是如果仍然不清楚,请询问,我将尝试提供更好的信息。
最佳答案
我敢肯定这过于简单了,但这是我的想法。
如果这是DAG,则可以对objA进行广度优先遍历。当您从objA入队时,包括objB和您需要的其他任何信息(元组)。然后,当您出队时,您将修复objB。
您可以在队列中使用区分的联合来处理不同的子类型。