根据两个列表的差异创建说明列表

时间:2014-08-25 16:24:37

标签: java algorithm diff

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

 A              B
 ================
 1              5
 2              4
 3              6
 4              3
                1
                7

我正在寻找一种高效算法,该算法将生成最少的指令列表,例如:
删除,插入,移动到(at,from和to是阵列中的位置)

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

                       1 2 3 4
Move from 1 to 4    -> 2 3 4 1
Del 1               -> 3 4 1
Insert 5 location 1 -> 5 3 4 1
Move from 3 to 2    -> 5 4 3 1
Insert 6 location 3 -> 5 4 6 3 1
Insert 7 location 6 -> 5 4 6 3 1 7

如果有Java就绪算法,它会很棒,但也欢迎其他解决方案。 在现实生活场景中,列表包含可比较的java对象。

1 个答案:

答案 0 :(得分:2)

这是一个计算最短编辑序列的O(n log n)时间算法,其中n是两个列表的总长度。首先,从A中删除不在B中的条目,将它们记录为删除。其次,从B中删除不在A中的条目,以与插入相反的顺序记录它们。显然,所有这些操作都是必要的。

现在我们有一个清单A'需要转换为其中一个排列B'。最短的编辑序列仅由移动组成,因为插入/删除操作必须具有对应物,并且这样的对可以由一次移动替换。让我们假设为了说明A'按排序顺序;为了实现,我们可以实现自定义比较器。

考虑最短的移动顺序。未移动的元素必须按顺序出现在B'中,即它们构成B'的增加子序列。要计算最短的编辑序列,请使用动态编程来查找longest increasing subsequence的B'在时间O(n log n)。适当地移动所有其他元素。这里的大部分实现复杂性都是簿记,但如果你能够容忍二次时间的实现,生活会轻松得多。