Самая длинная повторяющаяся (рассеянная) подпоследовательность в строке

26

Неформальная постановка задачи:

Для строки, например, , мы хотим, чтобы некоторые буквы были окрашены в красный цвет, а некоторые - в синий (а некоторые нет), чтобы чтение только красных букв слева направо давало тот же результат, что и чтение только синих букв.ACCABBAB

В примере мы могли бы покрасить их так:ACCABBAB

Поэтому мы говорим, что - это повторяющаяся подпоследовательность . Это также самая длинная повторяемая подпоследовательность (которую легко проверить).A C C A B B A BCABACCABBAB

Можем ли мы эффективно вычислить самые длинные повторные подпоследовательности?

Формальный вопрос:

Трудно ли NP решить для строки и некоторого , существует ли в строке повторяющаяся подпоследовательность длины ?кkk

  • Если так: какую проблему можно свести к этой проблеме?
  • Если нет: что такое эффективный алгоритм? (очевидно, этот алгоритм может быть использован для вычисления самой длинной повторяющейся подпоследовательности)

Бонусный вопрос:

Будут ли они всегда повторяться в подпоследовательности длины если размер алфавита ограничен константой?n/2o(n)

(Известно, что это верно для двоичных алфавитов.)

Изменить 2: Отрицательный ответ на бонусный вопрос уже известен для алфавитов размером не менее . Фактически для алфавитов размером Σ существуют строки с самыми длинными повторяющимися подпоследовательностями длиной всего O (n · Σ ^ {- 1/2}) . Случайных строк достаточно, чтобы показать это. Результат уже существовал, но я его упустил.5ΣO(n·Σ1/2)

Редактировать: Примечание:

Некоторые люди имеют в виду «подстрока», когда говорят «подпоследовательность». Я не. Это не проблема поиска подстрок дважды.

Sekti
источник
Секти, спасибо. Вы правы: мой первый комментарий был ошибочным; Я сейчас удалил это. С другой стороны, мой оставшийся комментарий будет говорить о несмежных подпоследовательности. Если фиксировано, есть способ решить вашу проблему (с несмежными подпоследовательностями, которые должны быть непересекающимися) за время или около того. Каждая подзадача dp отслеживает индексы всех красных букв и всех синих букв, выбранных до сих пор. Это, вероятно, неинтересно, потому что это не говорит нам, что происходит, когда является частью ввода. O ( n 2 k + 2 ) kkO(n2k+2)k
DW
@DW Почему на эту модификацию самой длинной общей подпоследовательности нельзя ответить эффективно на формальный вопрос ? Возможно, я что-то упускаю, и кто-то может прояснить для меня.
Брайс Килл
@BryceKille, я не знаю; возможно это может Если вы поймете, как это сделать, я надеюсь, что вы напишите ответ!
DW

Ответы:

-2

Это может быть решено в полиномиальное времяпутем построения графа где каждый узел представляет точку в некоторой повторяющейся подпоследовательности такой что . Край между узлами и означает, что можно продолжить с помощью чтобы сформировать повторяющуюся подпоследовательность длины 2.( i , j ) S S [ i ] = S [ j ] u v u vG(i,j)SS[i]=S[j]uvuv

1. Найдите узлы. Это можно сделать за , построив отсортированный список индексов для каждого символа , а затем перечислив уникальные пары. Здесь не более узлов.c m = n 2O(n2)cm=n2

2. Найдите края. Требуется время, чтобы проверить, может ли узел быть продолжен узлом , поэтому, учитывая все пары этот шаг занимает времени.u v ( u , v ) O ( м 2 )O(1)uv(u,v)O(m2)

3. Обратите внимание, что самый длинный путь в может не быть действительной повторяющейся подпоследовательностью. Рассмотрим пути и . Если существует ребро то является допустимой повторяющейся подпоследовательностью длины 3. Следовательно, требуется время, чтобы найти все повторяющиеся подпоследовательности длины 3. В общем случае требуется линейное время, чтобы проверить, являются ли два действительных пути длины можно объединить в правильный путь длины .a b b c a c a b c O ( m 4 ) n n + 1GabbcacabcO(m4)nn+1

4. Повторяйте шаг 3, пока пути не будут найдены.

noplogist
источник
Хм. Слишком быстро. На шаге 3 количество подпоследовательностей для рассмотрения становится все больше и больше. Так что это не полином.
Ноплогист
1
Добро пожаловать в CS.SE, и спасибо за попытку решить эту проблему! Боюсь, я не понимаю ваш алгоритм. Что такое шаг 3? Все, что я вижу в «3». некоторые декларативные заявления / наблюдения, но я не вижу процедурной спецификации того, что алгоритм должен делать. Кроме того, я не понимаю, что означает повторение шага 3, или обоснование вашего утверждения о том, что времени достаточно. Ваш последующий комментарий звучит так, будто вы больше не верите, что ваш ответ правильный. Если так, то может быть лучше удалить ответ, чтобы избежать путаницы. O(nnm2)
DW
Вы всегда можете отменить удаление или опубликовать новый ответ, если выясните ответ позже.
DW
DW, спасибо. Входными данными для шага 3 являются все повторяющиеся подпоследовательности длины n, а выходными данными являются все повторяющиеся подпоследовательности длины n + 1. Я считаю, что алгоритм правильный, но это не алгоритм за полиномиальное время. Теперь я отметил претензии, которые считаю неверными.
Ноплогист
Спасибо. Я понимаю. К сожалению, с этими изменениями, я боюсь, что этот ответ не отвечает на вопрос, который был задан. Вопрос был: это NP-сложный? Есть ли эффективный алгоритм? Показ того, что существует алгоритм экспоненциального времени, не помогает ответить на любой из этих вопросов. Действительно, уже тривиально видеть, что для этой задачи существует алгоритм экспоненциального времени, без использования каких-либо изощренных методов. Я ценю вашу попытку.
DW