Algorithm 两个唯一标记的一般树之间的差分算法
我正在寻找一种算法,可以找到从Algorithm 两个唯一标记的一般树之间的差分算法,algorithm,macos,tree,appkit,nsoutlineview,Algorithm,Macos,Tree,Appkit,Nsoutlineview,我正在寻找一种算法,可以找到从tree1到tree2的最小更改(插入、删除、移动) 该树是一个通用且唯一标记的树。 这意味着每个节点的值都是某种唯一标识符,如UUID。 每个节点都可以有子节点,这些子节点的顺序很重要。 示例树1 A - B - C - D - E - F 示例树2 A - B - F - C - D - G 从树1到树2的预期更改 move(atIndex: 1, inParent: A, toIndex: 0, inParent: F)
tree1
到tree2
的最小更改(插入、删除、移动)
该树是一个通用且唯一标记的树。
这意味着每个节点的值都是某种唯一标识符,如UUID。
每个节点都可以有子节点,这些子节点的顺序很重要。
示例树1
A
- B
- C
- D
- E
- F
示例树2
A
- B
- F
- C
- D
- G
从树1到树2的预期更改
move(atIndex: 1, inParent: A, toIndex: 0, inParent: F)
delete(atIndex: 1, inParent: C)
insert(atIndex: 2, inParent: A)
我需要一个macOS应用程序在NSOutlineView中进行动画更改。
我找到了一些算法来查找一般树之间的变化,但只针对有序树和标记树,而对于唯一标记树则没有。
非唯一标记树的算法看起来非常复杂,我认为如果标签是唯一的,那么必须有一个更简单、更有效的算法
顺便说一句:NSOultineView没有根节点,而是在开始处有一个节点数组。我不知道这是否重要。鉴于标签是唯一的,我不相信“最小”更改与概述每个节点的完整路径的差异有什么不同 如果我们从右向左看路径,我们可以看到下面的第一个父级和D的索引没有改变 问题描述中提供的最小变化似乎假设,当C在1处移动时,F从索引2移动到1会神奇地发生。但是“移动C”和“移动F到C的前一个位置”这两个动作,我们将从检查路径中得到,包含了由于当前“移动C”中的假设而需要发生的实际行为
鉴于标签是唯一的,我不认为“最小”更改与概述每个节点的完整路径的差异有什么不同 如果我们从右向左看路径,我们可以看到下面的第一个父级和D的索引没有改变 问题描述中提供的最小变化似乎假设,当C在1处移动时,F从索引2移动到1会神奇地发生。但是“移动C”和“移动F到C的前一个位置”这两个动作,我们将从检查路径中得到,包含了由于当前“移动C”中的假设而需要发生的实际行为 你说得对——标签的唯一性确实简化了问题 对于两个树中存在的每个标签,计算一系列操作以编辑其子项。这涉及计算最长的公共子序列,并为不在此子序列中的所有节点发出适当的移动/插入/删除。(如果两个树中都有标签,但父项不同,则应禁止删除旧父项。) 这组操作构成了一个下限,但如果我们只是这样做,我们可能会遇到这样一种情况,即我们试图将节点移动到它的一个子节点下。也许这足以探测到什么时候这将要发生,并将其分为两步。如果你真的需要最佳的移动顺序,那么我认为有一个反馈弧/节点集问题需要解决,尽管由于树状结构,这可能不是NP难问题。你说得对——标签的唯一性确实简化了问题 对于两个树中存在的每个标签,计算一系列操作以编辑其子项。这涉及计算最长的公共子序列,并为不在此子序列中的所有节点发出适当的移动/插入/删除。(如果两个树中都有标签,但父项不同,则应禁止删除旧父项。) 这组操作构成了一个下限,但如果我们只是这样做,我们可能会遇到这样一种情况,即我们试图将节点移动到它的一个子节点下。也许这足以探测到什么时候这将要发生,并将其分为两步。如果你真的需要移动的最佳顺序,那么我认为有一个反馈弧/节点集问题需要解决,尽管由于树形结构,这可能不是NP难问题
Example tree 1
A ⊥
- B A 0
- C A 1
- D A C 0
- E A C 1
- F A 2
Example tree 2
A ⊥
- B A 0
- F *A 1
- C *A 1 F 0
- D *A 1 F 0 C 0
- G A 2