Najdłuższy wspólny podciąg

Article on other languages:

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

Najdłuższy wspólny podciąg dla danych dwóch ciągów ich najdłuższym wspólnym podciągiem nazywamy ten z ich wspólnych podciągów, który ma największą długość.

  • Dla ciągów abaabbaaa i babab ich NWP to baba.
  • Dla ciągów POLITECHNIKA i TOALETA ich NWP to OLTA i OLEA.
  • Dla ciągów 123 oraz 543 ich NWP to 3.

Spis treści

Algorytm znajdujący tablicę długości NWP dwóch ciągów

Idea

Problem NWP dwóch ciągów A i B o długościach odpowiednio n i m może być rozwiązany za pomocą metody programowania dynamicznego.

Algorytm ten tworzy tablicę dwuwymiarową C[0..n][0..m]] taką, że wartość C[i][j] jest długością NWP podciągów A[1..i] i B[1..j]. A więc po zakończeniu wypełniania tablicy C komórka C[n][m] będzie zawierała wartość będąca długością NWP oryginalnych ciągów wejściowych A i B.

Optymalne rozwiązanie podproblemów

Załóżmy, że w danym kroku algorytmu chcemy obliczyć wartość komórki C[i][j], tj. długość NWP dla podciągów A[0..i] i B[0..j]. Jeżeli A i B są identyczne na pozycjach odpowiednio i i j (A[i]=B[j]) to należy włączyć ten wspólny znak do znalezionego wcześniej wspólnego wspólnego podciągu. Wtedy

\! C[i][j]\ =\ C[i-1][j-1]\ +\ 1

ponieważ długością NWP ciągów A[1..i] i B[1..j] będzie długość NWP podciągów A[1..i-1] i B[1..j-1] plus jeden wspólny element z pozycji A[i] i B[j].

Jeżeli znaki A[i] i B[j] są różne, to obliczenie C[i][j] sprowadza się do sprawdzenia, który z wspólnych podciągów słów A[1..i-1] i B[1..j] oraz A[1..i] i B[1..j-1] jest dłuższy, i włączenie go do tablicy wynikowej.

C[i][j]\ =\max\ \{C[i][j-1],\ C[i-1][j]\}

A więc algorytm wypełniania tablicy C można zapisać jako:

C[i][j] = 
\begin{cases} 
\ C[i-1][j-1] + 1, & \ A[i]=B[j]\\
\max\ \{C[i-1][j],\ C[i][j-1]\}, & \ A[i]\neq B[j]\\
\end{cases}

Stany początkowe

Do obliczenia tablicy C potrzeba jeszcze tylko tzw. stanów początkowych, tj. wartości początkowych rekurencjnych wzrów na C[i][j]. Z obserwacji, iż C[i][0] będzie zawsze równe 0 (ponieważ długość NWP ciągu i znaków i ciągu pustego jest zawsze równa zero, ponieważ NWP jest wtedy ciągiem pustym) wynika, że \forall_{i \in <0\cdots n>} C[i][0]\ =\ 0. analogiczne rozumowanie można przeprowadzić dla C[0][j] (\forall_{j \in <0\cdots m>} C[0][j]\ =\ 0).

Algorytm w pseudokodzie

      for i from 0 to n do:   //wypelnienie stanow poczatkowych
              C[i][0] = 0
      for j from 1 to m do: 
              C[0][j] = 0

      for i from 1 to n do:
         for j from 1 to m do:
             if A[i]==B[j]:
                   C[i][j] = C[i-1][j-1] + 1  // znaleziono kolejny element NWP
             else:
                   C[i][j] = max(C[i-1][j],C[i][j-1]);

Po zakończeniu działania powyższej procedury komórka C[n][m] będzie zawierać długość NWP ciągów A i B

Algorytm odtwarzający NWP

Mając gotową tablicę C długości wspólnych podciągów podciągów A i B można łatwo odtworzyć NWP.

Stub sekcji Ta sekcja jest zalążkiem. Jeśli możesz, rozbuduj ją.

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net