Python中的字符串匹配

时间:2013-08-08 22:27:12

标签: python algorithm string-matching

我有300K字符串存储在列表中,每个字符串的长度在10到400之间。我想删除那些是其他字符串的子字符串(长度较短的字符串更有可能成为子字符串的子字符串)其他)。

目前,我首先根据长度对这些300K字符串进行排序,然后使用以下方法。

sorted_string = sorted(string_list, key=length, reverse=True)
for item in sorted_string
    for next_item in sorted_string[sorted_string.index(item)+1:]
        if next_item in item:
            del sorted_string[sorted_string.index(next_item)]

此方法的运行时间为O(n ^ 2)。由于我有300K字符串,我对这种方法不满意。

我试图将这些排序后的字符串划分为不同的块,并使用多处理来计算每个块。我的第一个想法是将第一个10K放到第一个块,然后将第二个10K放到第二个块,等等。但是这样,每个块中的字符串具有相似的长度,并且它们可能不是同一块中其他块的子串。所以这不是一个好的分裂策略。

有什么好主意吗?

编辑:这些字符串代表DNA序列,只包含'g','c','t'和'a'

更新

我尝试使用https://github.com/kvh/Python-Suffix-Tree中的代码构建后缀树。该程序基于Ukkonen's algorithm构建后缀树。

连接字符串的总长度约为90,000,000。这是一个很大的数字。该程序已运行半小时,只处理约3,000,000(1/30)个字符。我对这个程序不满意。

是否有其他后缀树构建算法可以处理这个大字符串?

2 个答案:

答案 0 :(得分:2)

您可以使用suffix tree。它会到达O(mn),其中m是字符串的长度。它仍然是二次的,但是因为m <&lt;在你的情况下,它会提供明显的改善。

These lecture notes提供了一个很好的视觉解释,说明如何使用后缀树来查找子字符串。

答案 1 :(得分:0)

这是一个非常酷且非常有趣的问题。我研究了子集种子算法,并且已经有很多种算法。

您听说过BLAST算法吗? http://blastalgorithm.com/ GUI:http://blast.ncbi.nlm.nih.gov/