Nieformalne oświadczenie o problemie:
Biorąc pod uwagę ciąg znaków, np. , chcemy pokolorować niektóre litery na czerwono, a niektóre na niebiesko (a niektóre wcale), tak że czytanie tylko czerwonych liter od lewej do prawej daje taki sam wynik jak czytanie tylko niebieskie litery.
W przykładzie możemy je pokolorować w następujący sposób:
Dlatego mówimy, że to powtarzająca się podsekwencja . Jest to również najdłuższy powtarzany podciąg (który można łatwo sprawdzić).
Czy możemy efektywnie obliczyć najdłuższe powtarzające się podsekwencje?
Formalne pytanie:
Czy trudno jest NP zdecydować o łańcuchu i pewnym , czy w łańcuchu istnieje powtarzająca się podsekwencja długości k ?
- Jeśli tak: Który problem można ograniczyć do tego problemu?
- Jeśli nie: co to jest wydajny algorytm? (oczywiście tego algorytmu można następnie użyć do obliczenia najdłuższego powtarzanego podsekwencji)
Pytanie bonusowe:
Czy zawsze będą to powtarzające się podsekwencje długości jeśli rozmiar alfabetu jest ograniczony stałą?
(Wiadomo, że tak jest w przypadku alfabetów binarnych).
Edycja 2: Negatywna odpowiedź na pytanie bonusowe jest już znana dla alfabetów wielkości co najmniej . W rzeczywistości dla alfabetów o rozmiarze istnieją ciągi z najdłuższymi powtarzanymi podsekwencjami o długości zaledwie . Losowe ciągi wystarczy, aby to pokazać. Wynik już istniał, ale przeoczyłem go.
Edycja: Uwaga:
Niektóre osoby mają na myśli „podciąg”, gdy mówią „podciąg”. Ja nie. To nie jest problem ze znalezieniem podciągów dwukrotnie.
Odpowiedzi:
Można to rozwiązać wG (i,j) S S[i]=S[j] u v u v
czas wielomianowyprzez skonstruowanie wykresu którym każdy węzeł reprezentuje punkt ( i , j ) w niektórych powtarzanych podsekwencjach S, tak że S [ i ] = S [ j ] . Krawędź między węzłami u i v oznacza, że u można kontynuować przez v, tworząc powtarzające się podsekwencje o długości 2.1. Znajdź węzły. Można tego dokonać w czasie , budując posortowaną listę indeksów dla każdego znaku c , a następnie wyliczając unikalne pary. Nie ma więcej niż m = n 2 węzłów.O(n2) c m=n2
2. Znajdź krawędzie. Potrzeba w celu sprawdzenia, czy węzeł u może być kontynuowana przez węzeł v , tak, rozważając wszystkie pary ( u , v ), ten etap wykonuje O ( m 2 ) czasu.O(1) u v (u,v) O(m2)
3. Zauważ, że najdłuższa ścieżka w może nie być prawidłową powtarzaną podsekwencją. Rozważ ścieżki a b i b c . Jeśli istnieje krawędź a c, to a b c jest prawidłowym powtarzanym podsekwencją długości 3. Dlatego znalezienie wszystkich powtarzających się podsekwencji długości zajmuje O ( m 4 ) . W ogólnym przypadku sprawdzenie, czy dwa prawidłowe ścieżki o długości n można łączyć w prawidłową ścieżkę o długości n + 1 .G ab bc ac abc O(m4) n n+1
4. Powtarzaj krok 3, aż nie będzie już można znaleźć ścieżek.
źródło