我有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)个字符。我对这个程序不满意。
是否有其他后缀树构建算法可以处理这个大字符串?
答案 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/