Algorithm 求最小变换数

Algorithm 求最小变换数,algorithm,math,Algorithm,Math,我需要一个算法来计算类似于Levenshtein距离的东西。它应该计算从一个序列到另一个序列的最小可能转换次数。允许的转换包括删除、插入和移动: 删除3项: 在{1,2,3,4}之前{1,2,4}之后 插入5个: 在{1,2,3,4}之前{1,2,5,3,4}之后 第4项动议: 在{1,2,3,4}之前{4,1,2,3}之后 因此,算法应该在给定起始和结束的数字序列的情况下,计算此类转换的最小数量,理想情况下,给出所需转换的列表。序列的一个重要特征是数字永远不会重复 我有一个想法,我可以修改Le

我需要一个算法来计算类似于Levenshtein距离的东西。它应该计算从一个序列到另一个序列的最小可能转换次数。允许的转换包括删除、插入和移动:

删除3项: 在{1,2,3,4}之前{1,2,4}之后

插入5个: 在{1,2,3,4}之前{1,2,5,3,4}之后

第4项动议: 在{1,2,3,4}之前{4,1,2,3}之后

因此,算法应该在给定起始和结束的数字序列的情况下,计算此类转换的最小数量,理想情况下,给出所需转换的列表。序列的一个重要特征是数字永远不会重复

我有一个想法,我可以修改Levenshtein算法,这样它只计算删除和插入的数量,而忽略替换。移动的数量是删除的数量加上插入的数量除以2。但我不确定这是否正确

有人知道这样的算法吗

编辑:

我可能应该说,这个算法将在序列上工作。例如:

{{1,2,3},{4},{5,6,7}

数字不重复的地方。序列中内部元素的总数不变。元素可以从一个内部序列迁移到另一个内部序列。内部序列的数量也是恒定的。所以可能是这样

{{1,2,3,4,5,6,7},{},{},{}
{{},{1,2,3,4,5,6,7},{}
{{},{},{1,2,3,4,5,6,7}}

其思想是计算每个对应的内部序列的距离,然后将它们相加,得到外部序列的距离。
因此,元素可以被删除或插入到内部序列中,但它们永远不会从外部序列中消失

该算法最重要的方面是,它应该找到最小的变换数。不仅仅是一些transofrmation。

考虑:

abc
转化为:

abcdef

这是3次插入、0次删除和0次移动。但是,您的算法将提供3次插入、0次删除和1.5次移动

您可以跟踪已删除和插入的号码,最后通过检查这两组号码来计算移动次数,以查找已删除和再次插入的号码:

moved = intersection(deleted, inserted)
moves = sizeof(moved)
deletions = sizeof(deleted) - sizeof(moved)
insertions = sizeof(inserted) - sizeof(moved)

让我们看看我是否正确理解了你的问题:你给出了一个序列X(可能是空的),其中从1到n的每个数字正好包含在一个(内部)序列中。仅使用两种类型的操作,就必须将X转换为另一个给定的相同类型的序列Y,在该序列中,您希望最小化转换所需的操作数

第一个操作是将数字从同一内部序列中的任何位置移动到任何其他位置。第二个操作是将数字从一个内部序列中的任何位置移动到另一个内部序列中的任何位置

这是你的问题吗?如果是,请继续阅读

解决这一问题的一种通用方法是考虑以X和Y的所有相同序列作为顶点集所给出的无序图。两个顶点通过图中的一条边连接,当且仅当它们可以使用两个允许的操作中的一个转换为彼此时(此关系是对称的,因为您可以通过另一个允许的操作撤消一个允许的操作)。现在使用最短路径查找算法,如动态生成邻居

随着可到达顶点的数量在所采取的步骤数量上大致呈指数增长,实际上,您应该从起点X和起点Y交替运行该算法。只要在1、2、3、。。。步骤已确定,当X rsp中的可到达点集出现时停止。Y相交

此通用算法的运行时间和内存使用量对于中等n来说都太高,但可以通过两个观察结果对其进行极大优化:

  • 从一开始就包含在正确序列中的元素可以独立于所有其他元素(即,包含在其他内部序列中的元素或必须移动到另一个内部序列中的元素)使用第一个操作重新调用

  • 通过第二次操作从一个内部序列移动到另一个内部序列的元素可以直接放入正确内部序列中的正确位置,这样它们就不必通过另一次操作再次移动

由于内部序列内的排序和元素在内部序列之间的移动都是独立的,因此操作总数是对内部序列进行排序的最小数之和(只需考虑X和Y的相同内部序列中的元素)加上必须从一个内部序列移动到另一个内部序列的元素数


要确定对内部序列中已正确包含的元素进行排序的(第一个)操作数,只需忽略(取消)必须移动到另一个内部序列的元素。然后使用上面描述的通用方法,对顶点为不移动元素组成的序列集的图进行处理。如果移动元素(即应用第一个操作)将一个顶点(=序列)转换为另一个顶点,则图中存在的两个顶点是连接的。

我认为可以简化为:

  • 忽略不属于此序列的元素,将属于此序列的元素重新排列为正确的顺序。这是一个简单但不寻常的排序问题。
  • 移除不需要的元素。
  • 插入缺失的元素(在正确的位置)。 把第一步做得最少是棘手的部分;我不清楚如何证明给定的移动序列是最小的。但既然你似乎不在乎