Algorithm 如何正确区分树(即嵌套的字符串列表)?

Algorithm 如何正确区分树(即嵌套的字符串列表)?,algorithm,data-structures,language-agnostic,diff,Algorithm,Data Structures,Language Agnostic,Diff,我在一个由嵌套字符串列表组成的数据类型的在线编辑器中工作。请注意,如果每次更改单个值时都要传输整个结构,那么通信量可能会变得难以忍受。所以,为了减少流量,我考虑使用一个diff工具。问题是:如何查找和报告两棵树的差异?例如: ["ah","bh",["ha","he",["li","no","pz"],"ka",["kat","xe"]],"po","xi"] -> ["ah","bh",["ha","he",["li","no","pz"],"ka",["rag","xe"]],"po"

我在一个由嵌套字符串列表组成的数据类型的在线编辑器中工作。请注意,如果每次更改单个值时都要传输整个结构,那么通信量可能会变得难以忍受。所以,为了减少流量,我考虑使用一个diff工具。问题是:如何查找和报告两棵树的差异?例如:

["ah","bh",["ha","he",["li","no","pz"],"ka",["kat","xe"]],"po","xi"] ->
["ah","bh",["ha","he",["li","no","pz"],"ka",["rag","xe"]],"po","xi"]

在那里,唯一的变化是树的深处的“kat”->“rag”。周围的大多数diff工具都适用于平面列表、文件等,但不适用于树。我找不到任何关于那个具体问题的文献。什么是报告此类更改的最小方式,什么是查找此类更改的有效算法?

XML是一种常用的树状数据结构,通常用于描述结构化文档或其他需要监控其随时间变化的层次对象。因此,毫不奇怪,最近在树区分方面的大部分工作都是在XML上下文中进行的

以下是2006年的一项调查,其中包含许多可能有用的链接:

上面的一个更有趣的链接,伴随着一个名为TreePatch的开源实现,但现在似乎已经不存在了:

另一篇调查文章,作者,还有一大堆参考文献。(那一个来自一个on)


祝你好运。

找到两棵树之间的差异看起来有点像在树上搜索。你所知道的唯一区别是你必须弄清这两个问题的根源。 您可以同时搜索这两棵树,当您发现差异时,将一棵树更改为另一棵树(如果这是您的目标-最终得到相同的树,而不是每次都发送一棵树)

我在diff'ing 2树上找到了一些链接:

希望这些链接对您有用。:)

  • 您可以使用任何通用的DIFF算法,查找现成的库并不是问题
  • 如果您可以使用ZLIB库,我可以建议另一种解决方案。通过一些技巧,可以使用这个库发送任意两个二进制文件之间的非常压缩的差异,让我们称它们为A和B(以及差异Bc) 第1面:

  • 初始化ZLIB流
  • 用Z_SNC_FLUSH压缩A->Ac(我们不需要结果,所以可以释放Ac)
  • 用Z_SNC_FLUSH压缩B->Bc
  • 脱硝ZLIB流
  • 我们首先使用特殊的标志压缩块A,该标志强制ZLib处理和输出所有数据。但它不会重置压缩状态!当我们压缩块B时,压缩机已经知道A的子序列,并且将非常有效地压缩块B(如果它们有很多共同点的话)。Bc是唯一要发送的数据

    第二方面:

  • 初始化ZLIB流
  • 用Z_SNC_FLUSH压缩A->Ac
  • 脱硝ZLIB流
  • 我们需要解压缩与压缩完全相同的块。这就是为什么我们需要空调

  • 再次初始化ZLIB流
  • 用Z_SNC_FLUSH解压Ac->A
  • 用Z_SNC_FLUSH解压Bc->B
  • 脱硝ZLIB流
  • 现在我们可以解压Ac-A(我们必须解压,因为我们在另一边解压了,这有助于解压器学习块A的所有子序列),最后是Bc->B


    ZLib的使用有点不寻常和棘手,但在本例中,Bc不仅仅是压缩块B,它实际上是压缩块a和B之间的差异。如果ZLib字典的大小与块a的大小相当,它将非常有效。对于巨大的数据块,它将不那么有效。

    您在寻找XSLT吗?嗯,请再说一遍?我不知道XSLT是什么意思,但如果它是关于XML的,那么没有。。。编辑:阅读描述看起来很有趣,可能是JSON的XSLT?我现在要研究。考虑问这些类型的问题。