我希望编写一种算法来同步两个层次结构。这些结构可以是对象图,关系数据库表中存储的数据等(即使是两个不同的结构,只要它们具有可比较的键即可)。同步将是单向的,即一种结构将是原型,而另一种将被修改以匹配。

假设我们有一个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。

您可以在队列中使用区分的联合来处理不同的子类型。

07-25 22:36