Algorithm 加权无序字符串编辑距离

Algorithm 加权无序字符串编辑距离,algorithm,edit-distance,Algorithm,Edit Distance,我需要一种有效的方法来计算两个无序符号集合之间的最小编辑距离。就像Levenshtein距离一样,它只适用于序列,我需要插入、删除和替换,每个符号的成本不同。我还对恢复编辑脚本感兴趣 由于我试图完成的工作与计算字符串编辑距离非常相似,所以我认为它可能被称为无序字符串编辑距离,或者可能只是设置编辑距离。然而,谷歌没有发现任何与这些搜索词有关的东西,所以我有兴趣了解这个问题是否被其他人知道 澄清一下,这个问题将由 def unordered_edit_distance(target, source)

我需要一种有效的方法来计算两个无序符号集合之间的最小编辑距离。就像Levenshtein距离一样,它只适用于序列,我需要插入、删除和替换,每个符号的成本不同。我还对恢复编辑脚本感兴趣

由于我试图完成的工作与计算字符串编辑距离非常相似,所以我认为它可能被称为无序字符串编辑距离,或者可能只是设置编辑距离。然而,谷歌没有发现任何与这些搜索词有关的东西,所以我有兴趣了解这个问题是否被其他人知道

澄清一下,这个问题将由

def unordered_edit_distance(target, source):
    return min(edit_distance(target, source_perm) 
               for source_perm in permuations(source))
例如,
无序的编辑距离('abc','cba')
将是
0
,而
编辑距离('abc','cba')
2
。不幸的是,排列的数量增长非常快,即使对于中等大小的输入也不实用

编辑更清楚地说明操作与不同的成本相关。

对它们进行排序(无需),然后删除两组中相同(且数量相等!)的项目。
然后,如果集合的大小相等,则需要替换的数量;如果一个更大,那么您还需要一些插入或删除。无论如何,您需要的操作数等于第一阶段后剩余较大集合的大小。

关键观察:您只关心字符串中有多少个“a”、“b”、“z”或其他字母字符,因为您可以对每个字符串中的所有字符重新排序

因此,问题归结为以下几点:拥有
s['a']
a字符,
s['b']
b字符,…,
s['z']
t['a']t['b']t['b']b字符,…,
t['z']
t['z']。如果您的字母表很短,
s[]
t[]
可以是数组;一般来说,它们是从字母到整数的映射,如C++中的代码> map < /> >、<代码> DITC<代码>、Python等。 现在,对于每个字符
c
,您知道
s[c]
t[c]
。如果
s[c]>t[c]
,则必须从第一个无序字符串(
s
)中删除
s[c]-t[c]
字符
c
。如果
s[c]
,则必须将
t[c]-s[c]
字符
c
添加到第二个无序字符串(
t

X
,所有
c
s[c]-t[c]
之和,这样
s[c]>t[c]
,您将得到必须从
s
中删除的字符总数。取
Y
,所有
c
t[c]-s[c]
之和,这样
s[c]
,您将得到必须从
t
中删除的字符总数


现在,让Z=min(X,Y)
。我们可以进行
Z
替换,剩下的是
X-Z
插入和
Y-Z
删除。因此,操作的总数是
Z+(X-Z)+(Y-Z)
,或者
X+Y-min(X,Y)

虽然您的观察是正确的,但实际上您使一个简单的问题变得更复杂

由于源代码可以是原始源代码的任何排列,因此首先需要检查字符级别的差异

让两个映射每个映射计算目标字符串和源字符串中的单个字符数:

例如: a:2 c:1 d:100


现在比较两张地图,如果你缺少任何字符,当然你需要插入它,如果你有额外的字符,你就删除它。就这样

让我们暂时忽略替换

现在,只确定第一个集合中的元素(可以算作删除)和第二个集合中的元素(可以算作插入)就成了一个相当简单的问题。这可以通过以下两种方式轻松实现:

  • 对集合进行排序并同时迭代,或
  • 将第一个集合中的每个元素插入到哈希表中,然后从哈希表中删除第二个集合中的每个元素,每个未找到的元素都是一个插入,每个元素在完成删除后仍保留在哈希表中
现在,为了包含替换,剩下的就是找到插入元素和删除元素的最佳配对。这实际上是:

稳定婚姻问题(SMP)是在给定每个元素的一组偏好的情况下,在两组元素之间找到稳定匹配的问题。匹配是从一个集合的元素到另一个集合的元素的映射。当以下两种情况均不存在时,匹配是稳定的:

  • 第一个匹配集的某个给定元素A优先于第二个匹配集的某个给定元素B,而不是A已经匹配到的元素,以及
  • B也更喜欢A,而不是B已经匹配的元素
  • 这可以通过以下方式解决:

    Gale–Shapley算法涉及许多“循环”(或“迭代”)。在第一轮中,首先a)每个未结婚的男人向他最喜欢的女人求婚,然后b)每个女人对她最喜欢的求婚者回答“可能”,对所有其他求婚者回答“不”。然后,她暂时与她迄今为止最喜欢的求婚者“订婚”,而该求婚者也同样与她暂时订婚。在随后的每一轮中,首先a)每个未结婚的男人向他尚未求婚的最喜欢的女人求婚(无论该女人是否已经订婚),然后b)每个女人回答“可能”她最喜欢的求婚者(无论她现有的临时伴侣还是其他人),并拒绝其余的求婚者(同样,可能包括她目前的临时合伙人)。约定的临时性质保持不变