Python中的字符串匹配

Python中的字符串匹配,python,algorithm,string-matching,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.inde

我在列表中存储了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”

更新

我已经尝试使用源代码构建后缀树。此程序基于以下内容构建后缀树

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


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

您可以使用一个。它将把你带到O(mn),其中m是字符串的长度。它仍然是二次的,但是因为m这是一个非常酷和非常有趣的问题。我研究过子集种子算法,现在已经有很多了

你听说过BLAST算法吗?
GUI:

您是否能猜出有多少字符串是其他字符串的子字符串?这可能会影响最有效的方法,这些字符串的性质是什么?它们是句子吗?如果是,它们用什么语言?它们只是随机字符吗?它们是dna的表示,因此只包含“g”、“t”、“c”和“a”?@RobWatts是的,它们是dna序列,只包含“g”、“c”、“t”和“a”。我不知道有多少字符串将成为子字符串。因为您的字母表太小,所以更有理由使用后缀树:如何使用后缀树来查找要比较的两个字符串?我所能看到的是,一旦你决定比较哪两个字符串,这将如何加快速度。如果一个单词是任何单词的子字符串,那么它就是一个子字符串。因此,根据连接在一起的所有单词(在它们之间有一个间隔符)构建一个后缀树。这应该取O(nm),因为新的字符串长度是n*m。然后,对后缀树运行每个单词,也应该是O(nm),因为每次搜索都需要O(m)时间。@kevmo314所以我想对于每个单词,如果我们能找到它两次以上,那么这个单词就是一个子字符串,因为我们可以在后缀树中至少找到每个单词一次,对吗?是的,这是最简单的方法。也许有一种更聪明的方法可以做到这一点,而不必检查每个单词两次。例如,如果您找到的“子字符串”由两个间隔符限定,则它是原始字符串而不是子字符串,但前者可能更容易实现。