我希望写一个算法来同步两个层次结构。这些结构可以是对象图、存储在关系数据库表中的数据等(甚至是两种不同的结构,只要它们具有可比较的键)。同步将是单向的,即一个结构将是原型,而另一个将被修改以匹配。
假设我们有一个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。
您可以使用判别联合来处理排队中的不同子类型。
从两个数据结构生成衍射图,并将转换映射到转换后的问题。