我正在做一项医学研究和以下算法,对人类来说很简单,我发现很难实现。
情况:
我们有一系列不断增加的自然数。读者试图按顺序大声读出这些数字。他们可能会说错号或跳过一个数字。最后一个数字总是正确的。读者的反应将是另一个阵列。我的目标是弄清楚读者在两个数组中犯了多少错误。
例如:给定
[1,2,3,4,5,6]
[1,2,3,4,4,6]
一个错误(在5个插槽中读取4个)
读者回答[1,2,3,5,6]
。一个错误(一跳)[1,2,3,3,6]
。两个错误(1个跳过和1个错误)
我尝试使用邻接匹配,但当读者说出错误的数字并连续跳过多次时,它很容易失败。
你会如何实现这样的算法? 正如评论中所建议的那样,Levenshtein与某些改变的距离似乎可以解决这个问题。 Damerau_Levenshtein没有必要,因为读者不太可能交换答案。
答案 0 :(得分:1)
正如其他人所指出的,这个问题可以通过类似于DP方法中的标准“编辑距离”问题的方式来解决。该问题的Wiki reference将提供更多细节。
满足您需求所需的更改将仅允许3个操作中的2个操作(插入,删除,替换)。
为您的问题映射的操作:
下面的python实现应该是一个起点。
def get_mistakes(s1, s2):
m = [[0 for j in range(len(s2)+1)] for i in range(len(s1)+1)]
for i in range(len(s1)+1):
for j in range(len(s2)+1):
if i == 0:
m[i][j] = sum(bytearray(s2[:j]))
elif j == 0:
m[i][j] = sum(bytearray(s1[:i]))
elif s1[i-1] == s2[j-1]:
m[i][j] = m[i-1][j-1]
else:
skip = 1
substitute = 1
m[i][j] = min(m[i-1][j-1] + substitute, m[i][j-1] + skip)
return m[len(s1)][len(s2)]
希望它有帮助!