我在列表中存储了 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 算法构建后缀树。
连接字符串的总长度约为 90,000,000。这是一个很大的数字。该程序已运行半小时,仅处理了约 3,000,000 (1/30) 个字符。我对这个程序不满意。
有没有其他可以处理这个大字符串的后缀树构建算法?