2013-10-08 100 views
1

我正在联机编辑器中处理由嵌套字符串列表组成的数据类型。请注意,如果每次更改单个值时我要转移整个结构,则流量会变得难以忍受。所以,为了减少流量,我想应用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工具都适用于平面列表,文件等,但不适用于树。我找不到有关这个具体问题的任何文献。报告这种变化的最简单方法是什么?以及找到它的有效算法是什么?

+0

您是否在寻找XSLT? –

+0

呃特赦?我不知道XSLT是什么意思,但如果是关于XML,那么不......编辑:阅读它看起来很有趣的描述,也许是JSON的XSLT?我现在要研究。 – MaiaVictor

+0

考虑在[cs.stackexchange.com](http://cs.stackexchange.com)上询问这些类型的问题。 –

回答

2

XML是一种常用的树状数据结构,通常用于描述结构化文档或其他需要监视其随时间变化的分层对象。因此,近期在树分析中的大部分工作都是在XML的背景下应该是不足为奇的。

这里有一个2006年的调查有很多的可能有用的链接:Change Detection in XML Trees

一个从上面的比较有趣的环节,这是伴随着被称为TreePatch一个开源实现,但现在似乎已不存在:Kyriakos Komvoteas' thesis

另一篇调查文章,由Daniel Ehrenberg提供,有更多参考文献。 (来自http://cstheory.stackexchange.comquestion

祝你好运。

2

找到两棵树之间的区别看起来有点像在树中搜索。唯一的区别就是你知道你将不得不深入他们两人的底部。 您可以同时搜索两棵树,并且当您找到差异时,将其中一个更改为另一个树(如果这是您的目标 - 以相同的树木结束,而不是每次都发送一棵树)。

,我已经在diff'ing 2树木中的一些链接:

How can i diff two trees to determine parental changes?

Detect differences between tree structures

Diff algorithms

希望这些链接将是对你有用。 :)

2
  1. 你可以使用任何通用的DIFF算法,这是不是一个问题找到准备使用库。
  2. 如果您可以使用ZLIB库,我可以建议另一种解决方案。用一些技巧就可以使用这个库来发送两个任何二进制文件之间非常压缩的差异,让它们称为A和B(以及差异Bc)。

侧1:

  1. 初始化ZLIB流
  2. 压缩A->交流与Z_SNC_FLUSH(我们不需要的结果,这样的交流可以释放)
  3. 压缩B-> BC与Z_SNC_FLUSH
  4. DEINIT ZLIB流

我们压缩块的第一特殊标志,它迫使了ZLib处理和输出所有数据。但它不会重置压缩状态!当我们压缩块B时,压缩器已经知道A的子序列并且将非常有效地压缩块B(如果它们有很多共同的话)。 Bc是唯一要发送的数据。

方2:

  1. 初始化ZLIB流
  2. 压缩A->交流与Z_SNC_FLUSH
  3. DEINIT ZLIB流

我们需要为我们的压缩解压缩完全相同块。这就是为什么我们需要Ac。

  1. 初始化ZLIB流再次
  2. 与Z_SNC_FLUSH
  3. 解压缩BC->乙与Z_SNC_FLUSH
  4. DEINIT ZLIB流
  5. 解压缩的Ac->甲

现在我们可以解压缩的Ac-A(我们必须这样做,因为我们是在另一边做的,它有助于解压缩器学习块A)的所有子序列,最后Bc-> B。

这是ZLib的一个不寻常和棘手的用法,但在这种情况下Bc不仅仅是压缩块B,它实际上是压缩块A和B之间的差异。如果ZLIB字典的大小是可比较的与块A的大小。对于巨大的数据块,它不会那么高效。

相关问题