将所有字符串(DNA)分开,距离为Hamming = 1

时间:2016-06-30 12:33:38

标签: string algorithm hamming-distance

我有一系列DNA序列,例如:

  

AA
TA
AC
CC

我搜索一个更快的方法来计算所有序列对之间的汉明距离(可能通过排序......),然后是天真的方法(O(N ^ 2))

For motif1 in array
   For motif2 in array
      calculate Hamming_Distance(motif1 , motif2)
   end
end

我需要具有汉明距离= 1

的对的序列

1 个答案:

答案 0 :(得分:5)

如果您的n>> k,然后你可以试试

您的原始复杂度为O(n n k),其中k是序列的长度(因为汉明距离比较需要k步)。让我们尝试改进。

  1. 创建包含其中所有字符串的hashmap(由于散列而导致复杂度为O(n * k))
  2. 对于输入中的每个字符串,创建距离它1的所有字符串,看看它们是否包含在hashmap中 - 如果是,则找到一对(复杂度O(n k k) )因为你需要为每个n个字符串中的每个k变量散列O(k)
  3. 这样,你已经用O(n k k)代替了O(n n k),如果n>>那么这应该是有益的。 ķ。

    对于k>>你可能并不真正关心n ^ 2部分,所以使用琐碎的算法。

    对于接近n的k,您可以尝试我在评论中建议的内容

    1. 通过将所有字母与0,1,2,3(复杂度O(n * k))相加来为每个序列创建伪哈希
    2. 对它们进行排序(复杂度为O(n * logn),如果您使用开箱即用排序,或O(n)使用基数/桶排序)
    3. 比较通过排序序列的对,仅查看彼此相距最多3的事物(复杂性取决于您的情况,在大多数病态情况下将是O(n n k),但是使用真实世界数据,它可以更接近O(n k f(n)),其中f(n)将非常小)