【发布时间】:2011-08-19 04:31:31
【问题描述】:
这更像是一个 CS 问题,但也是一个有趣的问题:
假设我们有 2 个树结构,它们或多或少地重新组织了相同的节点。你会怎么找到
- 任何
- 在某种意义上最小
操作顺序
-
MOVE(A, B)- 将节点 A 移动到节点 B 下(连同整个子树) -
INSERT(N, B)- 在节点 B 下插入一个 new 节点 N -
DELETE (A)- 删除节点 A(连同整个子树)
将一棵树转换为另一棵树。
显然,在某些情况下,这种转换是不可能的,例如根 A 与子 B 到根 B 与子 A 等)。在这种情况下,算法会简单地提供一个结果“不可能”。
更壮观的版本是网络的泛化,即当我们假设一个节点可以在树中多次出现(实际上有多个“父母”),而循环是被禁止的。
免责声明:这不是家庭作业,实际上它来自一个真正的业务问题,我发现想知道是否有人可能知道解决方案非常有趣。
【问题讨论】:
-
MOVE(A,B)似乎与INSERT(A,B)相同,如果A没有任何孩子。如果INSERT(A,B)的孩子们会发生什么A? (它们会被附加到A的父级吗?) -
不同之处在于,INSERT 真正意味着一个新节点,以前不在树中(因此没有任何子节点,至少在它甚至不存在的原始状态下)。另一方面,MOVE 确实是一个移动,即节点的移动,包括它的子节点
-
这听起来你需要检测graph-isomorphism。关于转换的部分让我想起了Levenshtein distance,它可以使用动态规划在 O(n*m) 内巧妙地解决。也许这些指针对你有帮助。
-
您有没有想出解决方案?查看维基百科文章和链接的参考资料,我在任何地方都看不到算法。我想在 javascript 中执行此操作,我已经知道使两棵树不同的原始操作,但想产生一个可选的差异:例如,如果树的一部分被修剪然后重新移植到同一个位置它会优化到没有变化。
-
@Michael,你找到有用的东西了吗?我正在关注减少树的相同变化。
标签: algorithm tree comparison diff computer-science