小编典典

回文检测效率

algorithm

我对乔恩·林贾普Jon
Limjap)的采访事故
感到好奇,并开始寻找有效的方法来进行回文检测。我检查了回文高尔夫球场的答案,在我看来,答案中只有两个算法,即反转字符串并从尾巴和头部进行检查。

def palindrome_short(s):
    length = len(s)
    for i in xrange(0,length/2):
        if s[i] != s[(length-1)-i]: return False
    return True

def palindrome_reverse(s):
    return s == s[::-1]

我认为这些方法都不能用于检测巨大DNA序列中的精确回文。我四处张望,却没有找到任何免费的文章介绍这可能是一种超高效的方法。

一个好的方法可能是采用分而治之的方法并行化第一个版本,为每个线程或处理器分配一对char数组1..n和length-1-n..length-1。

有什么更好的方法?

你知道任何?


阅读 262

收藏
2020-07-28

共1个答案

小编典典

仅考虑一个回文,您将必须在O(N)中进行,是的。如您所说,通过分割字符串可以使多处理器获得更高的效率。

现在说您要进行精确的DNA匹配。这些字符串的长度为数千个字符,并且非常重复。这使我们有机会进行优化。

假设您将1000个字符的字符串分成5对100,100。该代码将如下所示:

isPal(w[0:100],w[-100:]) and isPail(w[101:200], w[-200:-100]) ...

等等…第一次进行这些匹配时,您将不得不对其进行处理。但是,您可以将完成的所有结果添加到哈希表对对的布尔值映射中:

isPal = {("ATTAGC", "CGATTA"): True, ("ATTGCA", "CAGTAA"): False}

等等…这将占用太多内存。对于100,100对,哈希映射将具有2 * 4 ^ 100个元素。假设您仅存储两个32位的字符串哈希作为键,那么您将需要10 ^
55兆字节,这太可笑了。

也许如果您使用较小的字符串,该问题可能很容易解决。然后,您将拥有一个巨大的哈希图,但是至少回文(假设10x10对将采用O(1)),因此检查1000字符串是否是回文将需要100次查找而不是500次比较。仍然是O(N)…

2020-07-28