将任意排列表示为一系列(插入,移动,删除)操作


9

假设我有两个字符串。打电话给他们。两个字符串都没有重复的字符。一个

如何找到将变成B的最短插入,移动和删除操作序列,其中:一个

  • insert(char, offset)char在给定offset的字符串中插入
  • move(from_offset, to_offset)将当前偏移的字符移动from_offset到新位置,使其具有偏移to_offset
  • delete(offset) 删除处的字符 offset

示例应用程序:您执行数据库查询,并在您的网站上显示结果。以后,您重新运行数据库查询,发现结果已更改。您想要使用最少的DOM操作数来更改页面上的内容以匹配数据库中当前的内容。为什么要最短的操作顺序有两个原因。首先,效率。当只有几条记录更改时,您要确保执行而不是On Ø1个ØñDOM操作,因为它们很昂贵。第二,正确性。如果一项从一个位置移动到另一个位置,则您希望通过单个操作移动关联的DOM节点,而又不破坏和重新创建它们。否则,您将失去焦点状态,<input>元素的内容等。

Answers:


10

我建议看一下编辑距离算法。不仅要计算距离,还需要记录通过数组的最小重量路径并将其返回。


5
实际上,由于没有重复,所以这是一个稍微更简单的问题,称为Ulam距离问题。虽然您可以使用编辑距离算法,但也有针对此距离的更快方法:mit.edu/~andoni/papers/ulamSublinear.pdf
Suresh

1
编辑距离通常不包括move操作,因此在解释乐谱时可能必须有所不同。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.