简而言之:我有两个可能不同的数组,我希望将差异/转换作为一系列“动作”(添加和删除)。也就是说,在一个基本的例子中:
Current: [a, b, d]
Desired: [a, b, c, d]
Actions: Add c in position 2
基本上,指令是如何转换当前数组,以便它具有与所需数组相同的成员和顺序。对于我的应用程序,每个更改都会触发更新UI等事件,因此如果操作不是“多余的”,那将是非常可取的:也就是说,上面可能是remove d, add c @ 2, add d @ 3
,但这会导致很多在系统的其他地方进行不必要的处理。
也许作为另一个可能有助于说明的例子:
Current: [a, b, d]
Desired: [b, c, d, a]
Actions: remove a, add c @ 1, add a @ 3
我认为这是之前已经解决过的问题,但是搜索它有点困难,因为“数组差异”并没有给你正确的结果。
如果重要的话,我在Javascript中实现这个,但我猜这个算法与语言无关。
答案 0 :(得分:7)
这确实存在,它被称为edit distance。基本算法不记得编辑的类型,但很容易修改。
一种编辑距离是Levenshtein distance。这个维基百科页面包含一些您可能会觉得有用的代码片段。
Hirschberg's algorithm也可能有用。