• Nie Znaleziono Wyników

Wyznaczanie ciągu wynikowego

niezmienniczy względem transpozycji

9.3.3. Wyznaczanie ciągu wynikowego

Algorytm CLCS-BP-Length umożliwia wyznaczenie tylko długości podciągu CLCS, co czasami jest niewystarczające. Uzyskanie także podciągu CLCS jest jednak stosunkowo proste i opiera się na podobnej idei jak w przypadku problemu LCS (por. podrozdz. 7.3.4).

Oprócz struktur dotychczas opisanych, tworzona jest trójwymiarowa macierz binarna T o wymiarach (n +1) ×(m+1)×(r +1). Dla wygody prezentacji pominięte tu zostaną szczegó-ły implementacyjne i zaznaczone zostanie tylko, że w praktyce jest to dwuwymiarowa macierz o wymiarach (n + 1) × (r + 1) zawierająca w każdej komórce tablicę d(m + 1)/we słów kom-puterowych. Macierz T jest wypełniana przez rozszerzone wersje algorytmów CLCS-BP-Strip (rys. 9.15) i CLCS-BP-Level (rys. 9.16). Ogólna idea polega na przechowywaniu w T (i, j, k) wartości bitowej pełniącej rolę „drogowskazu”, do której z sąsiednich komórek należy przejść przy wyznaczaniu podciągu CLCS. Jeśli T (i, j, k) = 0, to drogowskaz wskazuje lewą komór-kę (T (i − 1, j,k)), w przeciwnym przypadku górną (T (i, j − 1,k)). Wartość tego bitu nie ma znaczenia, jeśli bieżąca komórka reprezentuje dopasowanie, ponieważ wiadomo, że dla do-pasowania silnego należy przejść do T (i − 1, j − 1,k − 1), a dla dodo-pasowania niesilnego do T(i − 1, j − 1,k).

Dopasowania obsługiwane są przez algorytm konstruujący wynik w sposób szczególny i w tym akapicie pominięta zostanie ta kwestia, a uwaga zostanie skupiona na komórkach

nie-CLCS-BP-Sequence(A, B, P, M, T , `)

Wejście: A, B – ciągi główne, dla których wyznaczany jest podciąg CLCS P– ciąg ukierunkowujący

M– macierz programowania dynamicznego

T – macierz bitowa zawierająca informacje o sposobie przechodzenia macierzy programowania dynamicznego

` – długość podciągu CLCS Wyjście: podciąg CLCS

1 `← `; k ← r; i ← m; j← n 2 while ` > 0 do

3 if ai= bj then

4 if k > 0 and ai= pkthen k ← k − 1 5 s` ← ai; `← `− 1

6 i← i − 1; j← j − 1

7 else

8 if j-ty bit T (i,k) jest równy 1 then j ← j − 1

9 else i ← i − 1

10 return s1s2. . . s`

Rys. 9.17. Algorytm wyznaczania podciągu CLCS Fig. 9.17. Traceback procedure to obtain an CLCS

reprezentujących dopasowań. Algorytm obliczający pasek zapisuje zawartość wektora V do T (rys. 9.15, wiersz 11), ponieważ jeśli T (i, j, k) = 0, to wiadomo (jeśli j nie jest granicą pa-ska), że M(i, j, k) > M(i, j − 1,k), a więc należy przejść w lewo do wartości równej M(i, j,k).

W przeciwnym przypadku należy przejść w górę, ponieważ M(i, j − 1,k) = M(i, j,k). Dla po-zycji będącej dolną krawędzią paska wymagane jest nieco inne podejście, ponieważ różnica pomiędzy komórkami z wertykalnie sąsiednich pasków nie jest przechowywana w V . Zamiast tego można jednak skorzystać z macierzy M, ponieważ dla dolnego wiersza paska wartości M są policzone wprost, a więc porównując M(i − 1, j1, k) z M(i, j1, k), można określić, jaką war-tość ma mieć drogowskaz T (i, j1, k). Jeśli wskazane wartości są równe, to drogowskaz może wskazywać komórkę lewą, a w przeciwnym przypadku górną, ponieważ M(i, j1− 1,k) musi być wtedy równe M(i, j1, k).

Dla dopasowań wartości bitów z T są niepoprawne, ale nie ma to żadnego znaczenia, po-nieważ o tym, czy aktualnie występuje dopasowanie czy nie, można się dowiedzieć porównując symbole ciągu. Algorytm wyznaczający podciąg CLCS działający w sposób opisany powyżej przedstawiony jest na rys. 9.17. Ilustracja jego działania pokazana jest na rys. 9.18.

9.3.4. Szczegóły implementacyjne i analiza złożoności

Przedstawiony opis algorytmu wyznaczania długości podciągu CLCS sugeruje, że złożo-ność pamięciowa jest O(nmr) słów z powodu konieczności reprezentowania macierzy M. Ponie-waż w tym algorytmie wynikiem jest długość podciągu CLCS, więc wystarcza przechowywanie

9.3. Algorytm równoległości bitowej 179

Rys. 9.18. Przykład działania algorytmu wyznaczającego podciąg CLCS. Ciągi wejściowe to: A = ABAADACBAABC, B = CBCBDAADCDBA, P = CBB. Górna część rysunku (pokazana tylko dla porównania) przedstawia zawartość macierzy M. Dolna część rysunku przedstawia zawartość macierzy T . Ciemnoszare komórki oznaczają dopasowania brane do wyniku. Jasno-szare komórki oznaczają komórki odwiedzane przez algorytm. Ciąg wynikowy to BCBAAB (podkreślone symbole tworzą ciąg ukierunkowujący)

Fig. 9.18. Example of the traceback procedure. The sequences are: A = ABAADACBAABC, B = CBCBDAADCDBA, P = CBB. Upper part shows (only for comparison) the contents of the matrix M. The bottom part shows the contents of the traceback array T . The dark gray bo-xes denote matches taken to the result. The light gray bobo-xes denote the visited. The output sequence is BCBAAB (underlined symbols form constrained sequence)

tylko dwóch poziomów macierzy M, k-tego i (k −1)-szego. Co więcej, z poziomu (k−1)-szego potrzebne są wartości tylko tych komórek M(i − 1, j − 1,k − 1), dla których (i, j,k) jest dopa-sowaniem silnym. Niech liczba dopasowań silnych na poziomie k będzie oznaczona przez dksm (jeśli k ≤ 0 lub k > r, to z definicji dksm= 0). Wartości komórek dla tych dopasowań mogą być przechowywane w kolejce FIFO, ponieważ są one potrzebne przy wyznaczaniu poziomu k-ego w tej samej kolejności, w jakiej były obliczane na poziomie (k − 1)-szym. Ponadto, po-nieważ na każdym poziomie kolumny przetwarzane są kolejno od lewej do prawej, więc wystar-cza przechowywanie tylko dwóch wektorów bitowych V dla kolumn o indeksach i oraz i − 1.

Dodatkowo, należy przechowywać wektory masek bitowych dla wszystkich symboli alfabetu w ramach jednego poziomu. Z powyższego, sumaryczna złożoność pamięciowa tego algoryt-mu jest

Rozważona teraz zostanie złożoność czasowa tego algorytmu. Liczba pasków w pojedyn-czej kolumnie na poziomie k jest Θ(βk), ale paski rozmiaru większego niż w są emulowane przez tablice słów komputerowych, wobec czego sumaryczna liczba słów komputerowych ko-niecznych do reprezentowania wektora V jest O(βk+ dm/we). Dla każdego słowa komputero-wego zawierającego pasek lub jego fragment czas operacji bitowych na nim jest O(1) na każdą kolumnę. Ponadto, istnieje Θ(αk+1) kolumn, dla których zachodzi konieczność wyznaczenia wartości M dla dopasowań silnych na wyższym poziomie (αk= |{ai: ai= pk, 0 < i ≤ n}|, z de-finicjiα0r+1= 0). Obliczenia te zajmują czas O(m) na każdą kolumnę. Istnieje także ko-nieczność usunięcia pewnej liczby najmniej znaczących wartości0 z wektorów V w kolumnach zawierających dopasowania silne. Dla każdej zαk takich kolumn czas tej operacji jest O(m).

Z powyższego, sumaryczna złożoność czasowa proponowanego algorytmu jest:

r jest O(nmr). Złożoność czasowa w przypadku pesymistycznym może być jednak wyrażona także w zależności od sumarycznej liczby dopasowań silnych, Dsm=∑rk=0dsmk . Wtedyαkβk=

dksm) dla każdego poprawnego k. Otrzymuje się więc następujące oszacowanie złożoności czasowej:

r

9.3. Algorytm równoległości bitowej 181 Dla ustalonego Dsm suma∑rk=0p

dsmk ma wartość maksymalną, jeśli wszystkie dksmsą równe dla 0 < k ≤ r. Wobec tego można sformułować wniosek:

Wniosek 9.5. Złożoność czasowa algorytmu równoległości bitowej dla problemu CLCS wynosi