2013-08-08 6 views
2

У меня есть строки 300K, хранящиеся в списке, а длина каждой строки составляет от 10 до 400. Я хочу удалить те, которые являются подстрокой других строк (строки с более короткой длиной имеют более высокую вероятность быть подстрокой других).string match в Python

В настоящее время я сначала сортирую эти строки 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 на второй кусок и т. Д. Но в этом случае строки в каждом куске имеют одинаковую длину, и они могут не подстроить других в одном куске. Так что это не хорошая стратегия разделения.

Любые хорошие идеи?

Edit: эти строки представляют собой последовательности ДНК, и содержат только 'г', 'C', 'T' и 'а'

Update:

Я попытался построить суффикс дерева, используя код от https://github.com/kvh/Python-Suffix-Tree. Эта программа создает дерево суффиксов на основе Ukkonen's algorithm.

Общая длина конкатенированной строки составляет около 90 000 000. Это большое количество. Программа работает полчаса и обрабатывается всего ~ 3 000 000 (1/30) символов. Я не удовлетворен этой программой.

Есть ли другой алгоритм построения дерева суффикса, который может обрабатывать эту большую строку?

+1

Есть ли у вас какие-либо предположения относительно того, сколько строк вы найдете подстроками других строк? Это может повлиять на то, что будет лучше всего работать –

+0

Также, какова природа этих строк? Являются ли они предложениями и, если да, на каком языке они? Это просто случайные персонажи? Являются ли они представлениями dna и поэтому будут содержать только «g», «t», «c» и «a»? –

+1

@RobWatts Да, они являются последовательностями ДНК и содержат только 'g' 'c' 't' 'a'. И я понятия не имею, сколько строк будет подстрокой. – mitchelllc

ответ

2

Вы можете использовать suffix tree. Это приведет вас к O (mn), где m - длина строк. Он по-прежнему квадратичен, но поскольку в вашем случае m < < n, это обеспечило бы заметное улучшение.

These lecture notes обеспечивает довольно хорошее визуальное объяснение того, как вы можете использовать дерево суффикса, чтобы найти подстроки.

+0

Как бы вы использовали суффиксные деревья, чтобы найти, какие две строки сравнивать?Все, что я вижу, это то, как это ускорит процесс, как только вы решите, какие две строки для сравнения. –

+0

Слово является подстрокой, если это подстрока любого из слов, поэтому создайте дерево суффиксов на основе всех слов, объединенных вместе (с промежуток между ними). Это должно взять O (nm), поскольку новая длина строки n * m. Затем запустите каждое слово против дерева суффикса, которое также должно взять O (nm), так как каждый поиск принимает время O (m). – kevmo314

+0

@ kevmo314 Итак, я думаю, для каждого слова, если мы сможем найти его более двух раз, то это слово является подстрокой, так как мы можем найти каждое слово хотя бы один раз в дереве суффиксов, правильно? – mitchelllc