Algorithm 加权无序字符串编辑距离
我需要一种有效的方法来计算两个无序符号集合之间的最小编辑距离。就像Levenshtein距离一样,它只适用于序列,我需要插入、删除和替换,每个符号的成本不同。我还对恢复编辑脚本感兴趣 由于我试图完成的工作与计算字符串编辑距离非常相似,所以我认为它可能被称为无序字符串编辑距离,或者可能只是设置编辑距离。然而,谷歌没有发现任何与这些搜索词有关的东西,所以我有兴趣了解这个问题是否被其他人知道 澄清一下,这个问题将由Algorithm 加权无序字符串编辑距离,algorithm,edit-distance,Algorithm,Edit Distance,我需要一种有效的方法来计算两个无序符号集合之间的最小编辑距离。就像Levenshtein距离一样,它只适用于序列,我需要插入、删除和替换,每个符号的成本不同。我还对恢复编辑脚本感兴趣 由于我试图完成的工作与计算字符串编辑距离非常相似,所以我认为它可能被称为无序字符串编辑距离,或者可能只是设置编辑距离。然而,谷歌没有发现任何与这些搜索词有关的东西,所以我有兴趣了解这个问题是否被其他人知道 澄清一下,这个问题将由 def unordered_edit_distance(target, source)
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
现在比较两张地图,如果你缺少任何字符,当然你需要插入它,如果你有额外的字符,你就删除它。就这样 让我们暂时忽略替换 现在,只确定第一个集合中的元素(可以算作删除)和第二个集合中的元素(可以算作插入)就成了一个相当简单的问题。这可以通过以下两种方式轻松实现:
- 对集合进行排序并同时迭代,或
- 将第一个集合中的每个元素插入到哈希表中,然后从哈希表中删除第二个集合中的每个元素,每个未找到的元素都是一个插入,每个元素在完成删除后仍保留在哈希表中