将N个字符串转换为最多K个编辑的公共目标字符串

时间:2012-02-16 16:16:32

标签: string algorithm hamming-distance

我有一组字符串[S1 S2 S3 ... Sn],我要计算所有这些目标字符串T,以便S1 S2... Sn中的每一个都可以转换为T总共K次修改。
所有字符串都是固定长度L,此处的编辑是hamming distance

我所有的都是蛮力的方法。 所以,如果我的字母大小为4,我的样本空间为O(4 ^ L),并且需要O(L)时间来检查它们中的每一个。我似乎无法将指数的复杂性降低到一些多边形或伪多边形!有没有办法修剪样本空间以做得更好?

我试图将其可视化为L维向量空间。我得到了N分,并且必须计算与给定N点的距离之和小于或等于K的所有点。
i.e. d1 + d2 + d3 +...+ dN <= K
是否有任何已知的几何算法以更好的复杂性解决了这个或类似的问题?请指出我正确的方向或任何提示表示赞赏 谢谢

2 个答案:

答案 0 :(得分:1)

您可以通过动态编程有效地完成此任务。

关键的想法是你不需要枚举所有可能的目标字符串,你只需要知道在我编写之后只考虑字符串指示的K编辑可以使用多少种方法。

alphabet = 'abcd'
s = [ 'aabbbb', 'bacaaa', 'dabbbb', 'cabaaa']

# use memoized from http://wiki.python.org/moin/PythonDecoratorLibrary          
@memoized
def count(edits_left, index):
  if index == -1 and edits_left >= 0:
    return 1
  if edits_left < 0:
    return 0
  ret = 0
  for char in alphabet:
    edits_used = 0
    for mutate_str in s:
      if mutate_str[index] != char:
        edits_used += 1
    ret += count(edits_left - edits_used, index - 1)
  return ret

答案 1 :(得分:0)

大声思考,在我看来,这个问题归结为一个组合问题。

通常对于长度为L的字符串S,总共有可以替换的C(L,K)(二项式系数)位置,因此(ALPHABET_SIZE ^ K)* C(L,K)目标字符串T从汉明的距离K。

使用动态编程和Pascal三角形可以很容易地计算二项式系数......不需要对因子等感到疯狂......

现在处理了一个字符串大小写,处理多个字符串有点棘手,因为你可能会重复计算目标。直观地说,如果S1远离S2,那么两个字符串将生成相同的目标集,因此在这种情况下您不会重复计算。这最后的陈述可能是一个长镜头,这就是为什么我确保“直观地”说:)

希望它有所帮助,