Biorąc pod uwagę ciąg , Chciałbym znaleźć najdłuższą powtarzającą się (przynajmniej dwukrotnie) podsekwencję. To znaczy, chciałbym znaleźć ciąg który jest podciągiem (nie musi być ciągły) z takie, że . To jest,to ciąg, którego połówki pojawiają się dwa razy z rzędu. Zauważ, że jest podsekwencją , ale niekoniecznie podłańcuch.
Przykłady:
W przypadku „ababccabdc” będzie to „abcabc”, ponieważ „abc” = „abc” i „abc” pojawia się (przynajmniej) dwa razy w „ababccabdc”.
W przypadku „addbacddabcd” jedną z opcji jest „dddd”, ponieważ „dd” pojawia się dwukrotnie (nie mogę użyć tej samej litery kilka razy, ale tutaj mam 4 'd, więc jest w porządku), ale ma siłę 4. Mogę znaleźć lepszą o długości 8: „abcdabcd”, ponieważ „abcd” jest podciągiem „addbacddabcd”, który pojawia się dwukrotnie.
Jestem zainteresowany znalezieniem najdłuższego powtarzającego się podciągu. Nazywa się to również „znajdowaniem najdłuższego / największego kwadratu”, ale przeczytałem wiele artykułów, w których kwadrat jest zdefiniowany dla podłańcucha, a nie podsekwencji.
Mogę łatwo użyć algorytmu brutalnej siły, który zajmie poprzez iterację wszystkich opcji punktu przerwania w ciągu, a następnie będę mieć dwa ciągi, w których będę szukał największej / najdłuższej wspólnej podsekwencji, ale każde sprawdzenie zajmie za pomocą techniki programowania dynamicznego, więc cały czas będzie . Znalazłem bardziej wydajny algorytm dla najdłuższego wspólnego podciągu, który zajmuje , więc będzie czas pracy .
Szukam bardziej wydajnego algorytmu dla najdłuższego powtarzającego się problemu z podsekwencją. Być może mój pomysł iteracji po wszystkich punktach przerwania marnuje zbyt dużo czasu i może zostać zredukowany do mniejszej liczby iteracji. A może algorytm o innym podejściu może rozwiązać ten problem.
Szukałem w wielu czasopismach i poprzednich pytaniach, a większość wyników, które znalazłem, dotyczyły podciągów, a nie podsekwencji.
Czytałem również, że można to zrobić za pomocą drzewek sufiksów, ale to również dotyczyło podłańcuchów i nie jestem pewien, czy taki pomysł można rozszerzyć na podsekwencje.
Szukam rozwiązania, które działa na czas . Jeśli istnieje jeden na czas będzie jeszcze lepiej (nie jestem pewien, czy takie istnieje).
$
, który nie pojawia się w żadnym z nichOdpowiedzi:
Oto rozwiązanie do programowania dynamicznego.
Załóżmy, że ciąg wejściowy tox1…xn . Utwórz tabelęT których wiersze i kolumny są indeksowane 0,…,n (gdzie n jest długością ciągu), wypełnianą przez regułę
źródło
if
dp[i][j] = dp[i - 1][j - 1] + 1