Algorithm 区分两个标识符序列

Algorithm 区分两个标识符序列,algorithm,language-agnostic,Algorithm,Language Agnostic,给定两个标识符序列,如何找到将第一个标识符序列转换为第二个标识符序列的最小操作序列 操作可以是: 在给定位置插入标识符 从给定位置删除标识符 将标识符从一个位置移动到另一个位置 注意:标识符是唯一的,不能在一个序列中出现两次 例如: Sequence1 [1, 2, 3, 4, 5] Sequence2 [5, 1, 2, 9, 3, 7] Result (index are 0 based) : - Remove at 3 - Move from 3 to 0 - Insert '9'

给定两个标识符序列,如何找到将第一个标识符序列转换为第二个标识符序列的最小操作序列

操作可以是:

  • 在给定位置插入标识符
  • 从给定位置删除标识符
  • 将标识符从一个位置移动到另一个位置
注意:标识符是唯一的,不能在一个序列中出现两次

例如:

Sequence1 [1, 2, 3, 4, 5]
Sequence2 [5, 1, 2, 9, 3, 7]

Result (index are 0 based) :
- Remove at 3
- Move from 3 to 0
- Insert '9' at 3
- Insert '7' at 5
谢谢

此度量称为或更精确地称为

几乎每种可能的编程语言都有实现,您可以使用这些实现来解决您描述的问题。

首先查找。这将确定不会移动的元素:

[(1), (2), (3), 4, 5]
LCS的元素用括号括起来

检查索引0中的两个序列,记录使序列相同所需的操作。如果第一个序列的当前项不是LCS的一部分,请将其移除,并标记其之前所在的位置,以防以后需要插入。如果当前元素是LCS的一部分,请在其前面插入第二个序列中的元素。这可以是简单的插入,也可以是移动。如果要插入的项目位于原始列表中,请将其移动;否则,将其设置为插入

下面是一个使用您的示例的演示。大括号显示当前元素

[{(1)}, (2), (3), 4, 5] vs [{5}, 1, 2, 9, 3, 7]
1
是LCS的成员,因此我们必须插入
5
<代码>5在原始序列中,因此我们记录一个移动:
移动4到0

[5, {(1)}, (2), (3), 4] vs [5, {1}, 2, 9, 3, 7]
项目相同,因此我们继续下一个:

[5, (1), {(2)}, (3), 4] vs [5, 1, {2}, 9, 3, 7]
[5, (1), (2), {(3)}, 4] vs [5, 1, 2, {9}, 3, 7]
[5, (1), (2), 9, (3), {4}] vs [5, 1, 2, 9, 3, {7}]
同样,数字相同-移动到下一个:

[5, (1), {(2)}, (3), 4] vs [5, 1, {2}, 9, 3, 7]
[5, (1), (2), {(3)}, 4] vs [5, 1, 2, {9}, 3, 7]
[5, (1), (2), 9, (3), {4}] vs [5, 1, 2, 9, 3, {7}]
3
是LCS的成员,因此我们必须插入
9
。原始元素没有
9
,因此它是一个简单的插入:
INSERT 9 at 3

[5, (1), (2), 9, {(3)}, 4] vs [5, 1, 2, 9, {3}, 7]
同样,数字是相同的-移动到下一个:

[5, (1), {(2)}, (3), 4] vs [5, 1, {2}, 9, 3, 7]
[5, (1), (2), {(3)}, 4] vs [5, 1, 2, {9}, 3, 7]
[5, (1), (2), 9, (3), {4}] vs [5, 1, 2, 9, 3, {7}]
“4”不是LCS的成员,因此会被删除:
DEL at 5

[5, (1), (2), 9, (3)] vs [5, 1, 2, 9, 3, {7}]

我们到达了第一个序列的末尾-我们只需将第二个序列的剩余项添加到第一个序列中,注意之前删除的列表。例如,如果先前删除了
7
,我们将在此时将该删除转换为移动。但是,由于原始列表没有
7
,我们记录了最后的操作:
INS7在5

不完全-Levenshtein距离没有“移动”操作,这在本质上是相同的动态编程问题,但实现将不同于Damerau–Levenshtein允许换位。感谢您的回答。标识符在序列中是唯一的这一事实是否允许更快的算法?性能在这里是一个真正的问题,因为序列可以包含数百个标识符。太好了!我是否可以利用序列中标识符的唯一性来优化LCS算法?@Nicolasrepiquiet您可以,这取决于两个集合之间集合交集的大小。如果交集很小,比如说,不超过序列长度的70%,则可以解决仅由两个序列共有的值组成的子序列的问题,以2倍的速度加速。但是,您无法在LCS中获得太多的速度,因为它需要准备嵌套循环中的整行数据,而内部循环的步骤
j
处的值取决于步骤
j-1
处的值是否正确。