13

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

假设我们有一个sync函数。它需要接受以下内容:

  1. objA- 原型
  2. objB-- 要修改的对象
  3. keyA-- 密钥生成函数objA
  4. keyB-- 密钥生成函数objB
  5. addB-- 创建一个函数objB(返回新的 id objB
  6. setB-- 更新函数objB
  7. remB-- 删除一个函数objB
  8. parB-- 父级的 id objB-- 传递给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它并向下遍历图形?我最初的想法是将所有参数合并到一个类中,该类将具有子属性(ResizeArray相同类型的)。但是对于具有不同类型的各种属性,我想不出一种方法来使它工作,除了将类型扔出窗外并制作大部分或全部类型参数obj

所以这是我的问题:

  1. 是否有一种行之有效的方法来做到这一点(我还没有找到任何东西)
  2. 我可以使用什么数据结构来封装完成这项工作所需的数据?

我已尽力彻底解释这一点,但如果有任何不清楚的地方,请询问,我会尽力提供更好的信息。

4

2 回答 2

1

我确信这过于简单化了,但这是我的想法。

如果这是一个 DAG,您可以对 objA 进行广度优先遍历。当您从 objA 入队一个节点时,包括 objB 和您需要的任何其他信息(元组)。然后,当您出队时,您修复了 objB。

您可以使用有区别的联合来处理排队中的不同子类型。

于 2011-08-20T03:31:14.840 回答
0

从两个数据结构生成差异图并将转换映射到转换后的问题。

于 2011-08-22T19:31:40.047 回答