Строковые повторяющиеся подпоследовательности и сжатие

Я хотел бы сделать какой-то алгоритм «поиска и замены», который будет, по возможности, эффективным образом идентифицировать подстроку строки, которая встречается более одного раза, и заменять все вхождения этой подстроки токеном.

Например, учитывая строку «AbcAdAefgAbijkAblmnAbAb», обратите внимание, что «A» повторяется, поэтому в первом проходе уменьшите ее до «#1bc#1d#1efg#1bijk#1blmn#1b#1b», где #_ — это индексированный шаблон (обратите внимание на шаблоны в индексированной таблице), затем обратите внимание, что "#1b" повторяется, поэтому уменьшите его до "#2c#1d#1efg#2ijk#2lmn#2#2". В строке больше нет шаблонов, поэтому мы закончили.

Я нашел некоторую информацию о «самых длинных общих подпоследовательностях» и алгоритмах сжатия, но, похоже, ничего подобного. Они предназначены либо для сравнения двух строк, либо для получения какого-то оптимального для хранения результата.

Моя цель, с другой стороны, состоит в том, чтобы свести геном к его «словам», а не к «буквам». т.е. вместо gatcatcgatc я хочу видеть 2c1c2c. После этого я мог бы сделать некоторое регулярное выражение, чтобы найти такие вещи, как «# 42 * # 42»; было бы здорово увидеть повторяющиеся скобки в ДНК.

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


person SG1    schedule 28.06.2010    source источник


Ответы (1)


Кодирование пары байтов делает что-то очень близкое к тому, что вы хотите. Вместо непосредственного поиска самой длинной повторяющейся строки (сверху вниз) каждый проход кодирования пары байтов ищет повторяющиеся пары байтов (снизу вверх). Но в конце концов он обнаруживает самую длинную повторяющуюся строку (*).

  • gatcatcgatc
  • 1=at g1c1cg1c
  • 2=атк g22g2
  • 3=управление 2=управление 323

Как видите, он нашел самую длинную повторяющуюся строку «gatc».

(*) кодирование пары байтов либо в конечном итоге находит самую длинную повторяющуюся строку, либо останавливается раньше после выполнения (2^8 - uniquechars(source) ) замен. Я подозреваю, что можно настроить кодировку пары байтов, чтобы немного ослабить условие ранней остановки - возможно, (2^9 - uniquechars(source)) или 2^12 или 2^16. Даже если это ухудшит производительность сжатия, возможно, это даст интересные результаты для таких приложений, как ваше.

person David Cary    schedule 18.06.2011