Регулярное выражение для обнаружения повторяющихся подстрок медленное - PullRequest
0 голосов
/ 27 августа 2010

Я пытаюсь найти расширенное регулярное выражение GNU, которое обнаруживает повторяющиеся подстроки в строке битов в кодировке ascii. У меня есть выражение, которое работает - вроде. Проблема в том, что он выполняет очень медленно , когда ему дается строка, которая может иметь много решений

Выражение

([01] +) (\ 1) +

компилируется быстро, но выполняется около минуты для строки

1010101010101010101010101010101010101010101010101010101010

Я использую реализацию регулярных выражений из glibc 2.5-49 (поставляется с CentOS 5.5.)

FWIW, библиотека pcre выполняется быстро, как непосредственно в gregexp или perl. Таким образом, очевидный, но неправильный ответ - «используйте libpcre». Я не могу легко ввести новую зависимость в моем проекте. Мне нужно работать в библиотеке std C, которая поставляется с CentOS / RHEL.

1 Ответ

3 голосов
/ 28 августа 2010

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

Такая структура данных представляет собой дерево суффиксов . Для строки S ее суффиксное дерево по существу является Patricia trie всех ее суффиксов. Несмотря на кажущуюся сложность, он может быть построен за линейное время.

Suffix tree for BANANA Дерево суффиксов для "BANANA" (любезно предоставлено Википедией)

С суффиксным деревом можно действительно эффективно выполнять многие виды запросов, например, поиск всех вхождений подстроки, самой длинной подстроки, которая встречается как минимум дважды, и т. д. Тип строк, которые вы ищете, называется , тандем повторяется . Чтобы упростить этот запрос, вам необходимо предварительно обработать дерево суффиксов за линейное время, чтобы вы могли выполнять запросов с наименьшим общим предком в постоянное время.

Эта проблема очень распространена в вычислительной биологии, где ДНК можно рассматривать как строку VERY длиной, состоящую из букв в ACGT. Таким образом, производительность и эффективность имеют первостепенное значение, и эти очень сложные алгоритмы и методы были разработаны.

Вы должны изучить реализацию этих методов с нуля для вашей двоичной последовательности, или, возможно, проще сопоставить вашу двоичную последовательность с "поддельной" цепочкой ДНК, а затем использовать один из многих инструментов, доступных для исследования генов.

Смотри также

...