Java 基于两个列表的差异创建说明列表

Java 基于两个列表的差异创建说明列表,java,algorithm,diff,Java,Algorithm,Diff,我有两个带值的列表(A,B),我想创建一个操作说明列表,将列表A更改为B。 列表中没有重复项,但顺序很重要。 例如: A B ================ 1 5 2 4 3 6 4 3 1 7 我正在寻找一种高效的算法,它将生成最小的指令列表,例如: 删除位置、插入位置、从移动到(在、

我有两个带值的列表(A,B),我想创建一个操作说明列表,将列表A更改为B。
列表中没有重复项,但顺序很重要。
例如:

 A              B
 ================
 1              5
 2              4
 3              6
 4              3
                1
                7
我正在寻找一种高效的算法,它将生成最小的指令列表,例如:
删除位置、插入位置、从移动到(在、从和到是阵列中的位置)

对于上面的示例:(索引从1开始)

1234
从1移动到4->2 3 4 1
德尔1->3 4 1
插入5个位置1->5 3 4 1
从3移动到2->5 4 3 1
插入6个位置3->5 4 6 3 1
插入7个位置6->5 4 6 3 1 7
如果有支持Java的算法,那将非常好,但也欢迎其他解决方案。 在现实场景中,列表包含可比较的java对象。

这里有一个O(n logn)时间算法,它计算最短的编辑序列,其中n是两个列表的总长度。首先,从A中删除不在B中的条目,并将其记录为删除项。第二,从B中删除不在A中的条目,将它们按相反顺序记录为插入。显然,所有这些行动都是必要的

现在我们有一个列表a'需要转换成它的一个排列B'。最短的编辑序列仅由移动组成,因为插入/删除操作必须有一个对应项,这样的一对可以由一个移动替换。为了说明起见,让我们假设A’是按顺序排列的;对于实现,我们可以实现一个定制的比较器


考虑一个最短的移动序列。未移动的元素必须按B'的顺序出现,即它们构成B'的递增子序列。要计算最短的编辑序列,请使用动态规划在时间O(n logn)中找到B'的a。适当地移动所有其他元素。这里的大多数实现复杂性都是簿记,不过如果您能够容忍二次时间实现,生活会轻松得多。

我认为您要做的与之类似(但需要记录所需的操作)。主要的区别似乎是您允许将元素作为单个指令移动,这需要在LD中进行删除和插入。列表不能有重复的条目@David EisenstatI不清楚,如果A'未排序,如何使用最长递增子序列,因此我想您需要使用一些技巧对其进行排序,例如在A'(待排序)中重新标记项目,然后在B'中使用相同的重新标记。为什么n是A和B的总长度,不是最大长度吗?我知道,在大O符号中,它并不那么重要,只是为了清晰…@Betlista本质上,我们通过选择自己的顺序来强制A'被排序。n可以是最大长度,但请注意,最大长度是θ(总长度),反之亦然,因此声明的运行时间是相同的。