数组相邻元素匹配算法

时间:2017-06-12 20:28:41

标签: arrays algorithm

我正在做一项医学研究和以下算法,对人类来说很简单,我发现很难实现。

情况:

我们有一系列不断增加的自然数。读者试图按顺序大声读出这些数字。他们可能会说错号或跳过一个数字。最后一个数字总是正确的。读者的反应将是另一个阵列。我的目标是弄清楚读者在两个数组中犯了多少错误。

例如:给定 [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没有必要,因为读者不太可能交换答案。

1 个答案:

答案 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)]

希望它有帮助!