【发布时间】:2013-08-10 19:52:17
【问题描述】:
我在列表中存储了 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) 个字符。我对这个程序不满意。
有没有其他的后缀树构建算法可以处理这个大字符串?
【问题讨论】:
-
你有没有猜测你会发现多少个字符串是其他字符串的子字符串?这可能会影响最有效的方法
-
另外,这些字符串的性质是什么?它们是句子吗?如果是,它们是用什么语言编写的?它们只是随机字符吗?它们是 dna 的表示形式,因此只包含“g”、“t”、“c”和“a”吗?
-
@RobWatts 是的,它们是 DNA 序列,仅包含“g”“c”“t”“a”。而且我不知道有多少字符串是子字符串。
-
由于您的字母表很小,因此更有理由使用后缀树。 :D
标签: python algorithm string-matching