Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 两个唯一标记的一般树之间的差分算法_Algorithm_Macos_Tree_Appkit_Nsoutlineview - Fatal编程技术网

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