如果我们考虑使用长删除和子字符串复制而不是换位,则问题将变得更加容易。假设我们使用标准动态规划算法进行编辑距离计算,并且对于某些常数,长度为的昂贵操作距离增加。对于长删除和子字符串复制,这些常量可能有所不同。一个ķ + b 一个,b ≥ 0kak+ba,b≥0
长删除是从删除任意子字符串。如果将它们分解为两种简单的操作,则支持它们很容易:删除第一个字符(成本)和将删除范围扩展一个字符(成本)。除了标准数组,其中是前缀和之间的编辑距离,我们使用另一个数组来存储编辑距离,最后一次使用的操作是长时间删除。有了这个数组,我们只需要看,,和xa+baAA[i,j]x[1…i]y[1…j]AdA[i−1,j]A[i−1,j−1]A[i,j−1]Ad[i−1,j]在计算和,允许我们在时间内完成。A[i,j]Ad[i,j]O(1)
子字符串复制是指将的任意子字符串插入已编辑的字符串。与长删除一样,我们将操作分为两个简单的操作:插入第一个字符并将插入扩展一个字符。我们还使用数组存储前缀之间的编辑距离,条件是最后使用的操作是子字符串复制。xAs
有效地执行此操作比长删除操作更为复杂,而且我不确定是否可以将每个单元的时间摊销。我们为构建一个后缀树,假设它的大小恒定,则需要时间。我们将指向当前后缀树节点的指针存储在,从而允许我们以固定时间检查是否可以通过字符扩展插入。如果是这样,我们可以在恒定时间内计算和。O(1)xO(|x|)As[i,j−1]y[j]A[i,j]As[i,j]
Ž 甲小号 [ 我,Ĵ - 1 ] X ž ' žzy[j]zAs[i,j−1]xz′zz′y[j]xO(|z|−|z′|)As[i,j]A[i,j−|z′|−1]A[i,j−1]z′O(1)As[i,j]O(|z′|)
O(min(|x|⋅|y|2,|x|2⋅|y|))