【问题标题】:One-way sync of two hierarchies两个层次结构的单向同步
【发布时间】:2011-08-19 22:52:25
【问题描述】:

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

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

  1. objA -- 原型
  2. objB -- 要修改的对象
  3. keyA -- objA 的密钥生成函数
  4. keyB -- objB 的密钥生成函数
  5. addB -- 创建objB 的函数(返回新objB 的id)
  6. setB -- 更新函数objB
  7. remB -- 删除 objB 的函数
  8. 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

所以这是我的问题:

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

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

【问题讨论】:

  • 我猜你需要一个中间数据结构,这个算法可以在上面工作,对于各种类型的数据,你需要将数据转换为中间数据结构,运行算法然后转换它回到原始数据形式

标签: data-structures f# merge object-graph


【解决方案1】:

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

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

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

【讨论】:

  • 有趣的想法。可能要一两天才能试用。会回复你的。感谢您的建议!
  • 这保留了原来的问题,即子节点的不同类型。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多