• Nie Znaleziono Wyników

niezmienniczy względem transpozycji

8.4. Algorytm hybrydowy

przedniego eksperymentu. Ciągi zostały wygenerowane z użyciem generatora liczb pseudolo-sowych o rozkładzie równomiernym. Algorytmy zaproponowane w niniejszym podrozdziale okazują się znacznie wolniejsze od algorytmuHBP dla małych alfabetów oraz szybsze dla al-fabetów relatywnie dużych. Dlaσ= 128 różnica w prędkości działania pomiędzy algorytmami Deo-4 oraz HBP jest mniejsza niż w poprzednim eksperymencie, co wynika prawdopodob-nie ze specyfiki danych wejściowych. W danych rzeczywistych rozkład częstości występowania symboli daleki jest bowiem od równomiernego.

8.4. Algorytm hybrydowy

8.4.1. Algorytm

W niniejszym podrozdziale przedstawiony zostanie algorytm hybrydowy LCTS-Hybrid zaproponowany przez autora w [103, 73].

Wyniki eksperymentalne dla problemu LCTS pokazują, że dla stosunkowo dużych alfa-betów zaproponowany algorytm oparty na metodzie Hunta–Szymanskiego (LCTS-HS-3) jest szybszy niż algorytm oparty na metodzie równoległości bitowej, w którym dla każdej transpo-zycji podciąg LCS wyznaczany jest za pomocą algorytmu LCS-BP-Length (podrozdz. 7.3.4).

Oba te algorytmy wyznaczają jednak w zasadzie podciągi LCS dla różnych transpozycji. Ana-lizując czasy działania tych algorytmów dla poszczególnych transpozycji, można zauważyć, że algorytm LCTS-HS-3 jest szybszy od algorytmu LCS-BP-Length, jeśli liczba dopasowań jest znacznie mniejsza niż nm. W przeciwnym przypadku szybszy jest algorytm równoległości bitowej. Ponieważ w problemie LCTS liczba dopasowań silnie zależy od transpozycji (w przy-bliżeniu im wartość bezwzględna transpozycji większa, tym mniej dopasowań), więc można zaproponować podejście hybrydowe, w którym transpozycje z małą liczbą dopasowań będą rozwiązywane metodą HS (algorytm LCTS-HS-3), a te z dużą liczbą dopasowań metodą BP (algorytm LCS-BP-Length).

W proponowanym algorytmie hybrydowym,5 na etapie przetwarzania wstępnego wyzna-czana jest liczba dopasowań dla każdej z transpozycji. Złożoność czasowa tego etapu jest O(n+

m2). Następnie transpozycje są sortowane według liczby dopasowań w czasie O(σlogσ) lub O(σlogσn) (z użyciem sortowania pozycyjnego).6

5Algorytm ten jest opisany również w [102], będącej rozprawą habilitacyjną drugiego autora tego algorytmu.

6Etap zliczania liczby dopasowań dla transpozycji może być także wykonany w czasie O(n + m +σlogσ) z użyciem szybkiej transformaty Fouriera (FFT), jeśli tylko dopuści się nieco bardziej ogólny model obliczenio-wy, w którym wśród operacji podstawowych są operacje mnożenia i dzielenia liczb zespolonych. W tym celu należy utworzyć dwie tablice NAoraz NBzawierające 2σ− 1 elementów. Tablica NAzawiera liczbę wystąpień symboli alfabetu w A, a NBw B na pozycjach 0..σ−1. Pozostałe elementy tych tablic są wypełnione zerami. Następnie wy-znaczana jest cykliczna korelacja dyskretnych ciągów NAoraz NB, co może być wykonane z użyciem FFT w czasie O(σlogσ). Otrzymane 2σ− 1 współczynników zawiera liczbę dopasowań dla każdej z 2σ− 1 transpozycji.

W dalszej części opisu algorytmu stosowana będzie notacja R(t), która oznacza dla trans-pozycji t jej rangę w tablicy transtrans-pozycji posortowanej według liczby dopasowań. Zachodzi przy tym 0 ≤ R(t) < 2σ− 1, a więc R(t) = 0, jeśli t jest transpozycją, dla której liczba dopa-sowań jest maksymalna (jeśli istnieje wiele takich transpozycji, to wybierana jest którakolwiek z nich). Przez d(t) będzie oznaczana liczba dopasowań dla transpozycji t. Następnie wyko-nywane jest przetwarzanie wstępne dla algorytmów LCTS-HS-3 i LCS-BP-Lenght w sposób podany poniżej.

Jeśli dla każdej transpozycji przetwarzanie wstępne w algorytmie LCS-BP-Length wyko-nywane jest niezależnie, to jego sumaryczna złożoność czasowa jest O(dm/weσ2+mσ). Można ten wynik bardzo prosto poprawić do O(dm/weσ+ m). W tym celu wystarczy utworzyć listy wystąpień każdego symbolu alfabetu w każdym ciągu oraz wektory masek bitowych dla cią-gu B i przy przetwarzaniu transpozycji t oraz kolumny opisanej symbolem ai wziąć wektor masek bitowych dla symbolu (ai−t). Ta prosta idea pozwala wyeliminować niepotrzebne, wie-lokrotne wykonywanie przetwarzania wstępnego, a przeprowadzone eksperymenty pokazują, że uzyskiwana oszczędność czasu to ok. 20%. Można ponadto zauważyć, że niezerowych wek-torów masek bitowych może być co najwyżej min(m,σ), wobec czego pamięć na pozostałe wektory nie musi być alokowana. Dodatkowy wkład do złożoności czasowej tej modyfikacji jestΘ(m +σ).

Czas przetwarzania wstępnego można zredukować jeszcze bardziej, w nieco mniej oczywi-sty sposób, do O(m). Wymaga to zwiększenia rozmiaru zajmowanej pamięci o stały czynnik.

Zysk czasowy jest osiągany przez powstrzymanie się od zerowania wektorów bitowych na eta-pie ich inicjalizacji. W tym celu należy wykorzystać metodę inicjalizacji tablic [155, rozdz.

III 8.1], która wymaga zastosowania dodatkowych tablic, przez co zajętość pamięci rośnie co najwyżej trzykrotnie. Navarro [162] zaprezentował ulepszenie tej metody, dzięki czemu dodat-kowa pamięć wymagana dla tablicy rozmiaru N to jedynie N + o(N) bitów. Przekłada się to na dm/we + o(dm/we) dodatkowych bitów w rozważanym problemie. Wadą tej metody jest jednak konieczność trzykrotnego dostępu do pamięci, aby uzyskać informację o wektorze ma-sek bitowych, co przy relatywnie niedużej zajętości pamięci przez te wektory powoduje, że ta optymalizacja pamięciowa ma znaczenie raczej teoretyczne.

Po przetwarzaniu wstępnym transpozycje dzielone są pomiędzy algorytmy LCTS-HS-3 oraz LCS-BP-Length. Ponieważ algorytm LCTS-HS-3 lepiej nadaje się do transpozycji z małą licz-bą dopasowań, a algorytm LCS-BP-Length z dużą ich liczlicz-bą, więc podział polega na znalezie-niu takiej granicznej liczby dopasowań, że wszystkie transpozycje o mniejszej ich liczbie będą przetwarzane algorytmem LCTS-HS-3, a pozostałe algorytmem LCS-BP-Length. Kryterium podziału jest wyznaczane na podstawie czasów obliczeń dla kilku wstępnie wybranych transpo-zycji. W szczególności: dla transpozycji t1rangi 0 i t2rangi d(2σ− 1)/3e − 1 wykonywany jest

8.4. Algorytm hybrydowy 143 algorytm LCS-BP-Length, a czasy działania to odpowiednio: τ(t1) oraz τ(t2). Transpozycje te są następnie usuwane ze zbioru wszystkich transpozycji (dla nich długość podciągów LCS została właśnie policzona). Teraz wybierane są transpozycje t3oraz t4o rangach odpowiednio:

d(2σ− 3)/3e − 1 oraz 2σ− 4 (najrzadsza transpozycja) i dla nich wykonywany jest algorytm LCTS-HS-3. Uzyskane czasy to odpowiednio:τ(t3) orazτ(t4).

Istotą działania algorytmu hybrydowego jest założenie, że dla każdego z algorytmów, LCTS-HS-3i LCS-BP-Length, czas działania z dobrym przybliżeniem zależy liniowo od liczby do-pasowań. Oczywiście założenie to nie jest spełniane dokładnie, ale wstępne eksperymenty po-kazały, że przyjęta strategia sprawdza się całkiem dobrze w praktyce. Zależność czasu działa-nia algorytmu LCTS-HS-3 od liczby dopasowań jest dość oczywista. W przypadku algorytmu LCS-BP-Lengthjuż tak nie jest, ale eksperymenty pokazują, że prawdopodobnie z powodów zależnych od sprzętu też daje się taką zależność zauważyć, choć jest ona słaba. Otrzymane 4 czasy dla 4 transpozycji są wystarczające, aby poprowadzić dwie proste i na podstawie ich punktu przecięcia wyznaczyć zakresy transpozycji do przetwarzania przez poszczególne algo-rytmy składowe. W szczególności pierwsza prosta prowadzona jest przez punkty: (d(t1),τ(t1)) i (d(t2),τ(t2)), a druga przez punkty: (d(t3),τ(t3)) i (d(t4),τ(t4)). Transpozycje o liczbie do-pasowań większej niż pierwsza współrzędna otrzymanego punktu przecięcia przetwarzane są algorytmem LCS-BP-Length, a pozostałe algorytmem LCTS-HS-3. Oczywiście cztery wcze-śniej policzone transpozycje nie są ponownie przetwarzane. Kolejnym ulepszeniem algorytmu LCTS-HS-3jest przedwczesne jego przerwanie, jeśli na którymś etapie wiadomo już, że dla bie-żącej transpozycji niemożliwe jest poprawienie najlepszego uzyskanego wyniku, nawet gdyby dla każdego kolejnego wiersza długość podciągu LCS wzrastała o 1. Ponieważ, statystycznie rzecz biorąc, dla gęstszych transpozycji jest większa szansa otrzymania dłuższych wspólnych podciągów, więc najpierw uruchamiany jest algorytm LCS-BP-Length, a po nim dopiero al-gorytm LCTS-HS-3, dzięki czemu ta idea przedwczesnego zakończenia przetwarzania w algo-rytmie LCTS-HS-3 jest częściej stosowana.

Na koniec warto odnotować, że sumaryczna złożoność czasowa proponowanego algorytmu jest O(ndm/weσ+ nmdlogσ/ log we), wliczając czas przetwarzania wstępnego dla obu składo-wych algorytmów w najgorszym przypadku (przy założeniu że w = O(logO(1)n).

8.4.2. Wyniki eksperymentalne

W celu porównania algorytmu zaproponowanego w podrozdz. 8.4.1 z innymi algorytma-mi dla problemu LCTS przeprowadzono serię eksperymentów podobnych do tych opisanych w podrozdz. 8.3.3. W testach zastosowano komputer wyposażony w procesor AMD Athlon64 5000+ (zegar 2600 MHz) i 2048 MB RAM, działający pod kontrolą systemu operacyjnego MS Vista64. Wszystkie algorytmy zostały zaimplementowane w języku C++, a do kompilacji użyto

0 20 40 60 80 100 0

20 40 60 80 100

RAND64 n=m=1024

MUSIC n=m=1024

% transpozycji

%dopasow

Rys. 8.7. Skumulowana procentowa liczba dopasowań (począwszy od transpozycji najrzadszych) w za-leżności od rangi transpozycji (problem LCTS)

Fig. 8.7. Cumulative % matches vs. % transpositions counted from the most rare transpositions (LCTS problem)

MS Visual C++ 2005 z opcją-Ox (maksymalna optymalizacja pod kątem szybkości działania).

Eksperymenty przeprowadzono zarówno dla w = 32, jak i w = 64.

Dane użyte do testów były trzech rodzajów:

• MUSIC: dane rzeczywiste z plików MIDI (te same, których użyto w podrozdz. 8.3.3),

• RAND: ciągi wygenerowane za pomocą generatora liczb pseudolosowych o rozkładzie rów-nomiernym,

• GAUSS: ciągi wygenerowane za pomocą generatora liczb pseudolosowych o rozkładzie Gaussa (średnia w połowie alfabetu, a odchylenie standardowe –σ/8).

Z wyjątkiem pierwszego rodzaju danych ciągi były generowane dla różnych rozmiarów alfabetu.

W pierwszym eksperymencie, dla zestawu MUSIC, ciągi do testów zostały utworzone jako losowo wybrane fragmenty tego ciągu bazowego. Dla każdej długości ciągów (n = m) wyge-nerowano 101 par, a otrzymane czasy są medianą czasów wykonań dla tych par. Rysunek 8.7 pokazuje zależność pomiędzy procentową liczbą transpozycji z najmniejszą liczbą dopasowań a sumaryczną procentową liczbą dopasowań, które te transpozycje zawierają. Można z niego od-czytać, że, dla danych rzeczywistych (MUSIC), 20% najczęstszych transpozycji zawiera ponad 50% wszystkich dopasowań, a 60% istniejących transpozycji zawiera ponad 90% dopasowań.

Dla danych losowych krzywa ta jest znacznie bardziej płaska.

Na rys. 8.8 pokazano sumaryczny czas działania proponowanego algorytmu hybrydowego w zależności od maksymalnej liczby dopasowań w ramach transpozycji przetwarzanych przez algorytm składowy LCTS-HS-3. Analogiczną zależność przedstawiono na rys. 8.9, z tą różnicą, że tu pokazano wykresy dla alfabetów różnych rozmiarów. (Skrajne wartości progów dotyczą sytuacji, w której wszystkie transpozycje przetwarzane są przez ten sam algorytm składowy).

W większości przypadków, dla alfabetów do rozmiaru 64 lub 128 (w zależności od zestawu danych i wersji, 32- lub 64-bitowej), szybszym z dwóch algorytmów składowych okazywał się LCS-BP-Length. Jedynie dla większych alfabetów wygrywała składowa HS. Można

rów-8.4. Algorytm hybrydowy 145

a) MUSIC b) RAND-64 c) GAUSS-64

Rys. 8.8. Czasy działania algorytmu LCTS-Hybrid dla problemu LCTS dla zmieniającego się progu podziału maksymalnej liczby dopasowań w transpozycji przetwarzanej przez składową LCTS-HS-3. Górne pary krzywych dla n = m = 4096, dolne pary dla n = m = 512

Fig. 8.8. Processing time of LCTS-Hybrid algorithm with varying threshold of the maximal number of matches in transpositions handled by the LCTS-HS-3 component. Top pairs of curves for n= m = 4096, bottom pairs for n = m = 512

Rys. 8.9. Czas działania algorytmu LCTS-Hybrid dla problemu LCTS dla zmiennego progu podziału maksymalnej liczby dopasowań w transpozycji przetwarzanej przez składową LCTS-HS-3. n = m= 4096,σ= 16, . . . , 256, w = 64

Fig. 8.9. Processing time of LCTS-Hybrid algorithm with varying threshold of maximal number of mat-ches in transpositions handled by the LCTS-HS-3 component. n = m = 4096,σ= 16, . . . , 256, w= 64

nież zauważyć, że w przypadku danych gaussowskich czas działania algorytmu bardziej zależy od drobnych zmian progu podziału transpozycji pomiędzy składowymi LCTS-HS-3 i LCS-BP-Length.

Z testów wynika, że najlepszym punktem podziału dla danych rzeczywistych jest prze-twarzanie około 80–90% dopasowań (z najczęstszych transpozycji) przez algorytm LCS-BP-Length, a pozostałych 10–20% przez wariant algorytmu LCTS-HS-3 (tabele 8.1–8.4). Inny-mi słowy (rys. 8.7), mniej niż 40% najczęstszych transpozycji powinno być przetwarzanych przez składową LCS-BP-Length. Można również zauważyć, że składowa LCS-BP-Length przetwarzająca wszystkie transpozycje jest szybsza o około 25% (implementacja 32-bitowa) lub 100% (implementacja 64-bitowa) niż składowa LCTS-HS-3 przetwarzająca wszystkie transpo-zycje.

W celu określenia, jak dobrze wykonywany jest podział transpozycji pomiędzy obie składo-we, wyznaczony został także najlepszy możliwy próg (kolumna „Czas najl.”). Jak można

zauwa-Tabela 8.1 Czasy działania algorytmu LCTS-Hybrid (w = 32) dla problemu LCTS, dane: MUSIC

n=m Czas BP Czas HS Czas najl. Czas hyb. Próg najl. Próg hyb. Trans. BP Dopas. BP

[ms] [ms] [ms] [ms] [%] [%] [%] [%]

256 0,3157 0,5167 0,2686 0,2768 1,6928 1,3930 45,4 83,8

512 1,4366 1,7222 0,9210 0,9686 1,8621 1,5752 42,1 80,5

1024 5,5727 6,3598 3,0630 3,1441 1,6928 1,4759 40,2 81,5

2048 23,2568 25,5058 13,3131 13,5623 1,5389 1,4969 34,8 78,3

4096 91,7169 95,0223 44,9423 45,6610 1,3990 1,4930 34,7 80,9

8192 381,6627 381,3309 185,5993 188,4778 1,5389 1,5642 33,6 79,9

Tabela 8.2 Czasy działania algorytmu LCTS-Hybrid (w = 64) dla problemu LCTS, dane: MUSIC

n=m Czas BP Czas HS Czas najl. Czas hyb. Próg najl. Próg hyb. Trans. BP Dopas. BP

[ms] [ms] [ms] [ms] [%] [%] [%] [%]

256 0,1842 0,5183 0,1842 0,2151 0,0000 0,7371 61,9 92,4

512 0,6811 1,7288 0,5669 0,5868 0,8687 0,7022 61,2 93,1

1024 3,0936 6,3303 2,0560 2,1032 1,1562 0,8202 55,0 91,1

2048 12,2291 25,5285 8,3442 8,6279 0,8687 0,7895 52,1 90,1

4096 47,1900 95,0745 28,4840 29,0666 0,7897 0,7683 48,9 91,8

8192 193,8347 380,7648 112,5319 113,1798 0,8687 0,7952 43,7 91,2

Tabela 8.3 Czasy działania algorytmu LCTS-Hybrid (w = 64) dla problemu LCTS, dane: RAND-128 n=m Czas BP Czas HS Czas najl. Czas hyb. Próg najl. Próg hyb. Trans. BP Dopas. BP

[ms] [ms] [ms] [ms] [%] [%] [%] [%]

256 0,7996 1,4635 0,7677 0,7771 0,1890 0,1898 75,6 93,6

512 2,7441 4,5429 2,4480 2,4640 0,2287 0,2248 71,3 91,2

1024 11,8452 15,4458 9,6989 9,7430 0,3044 0,2938 62,3 85,3

2048 42,9331 56,6781 34,5518 34,7321 0,3044 0,2914 62,3 85,6

4096 164,4345 215,2981 130,7266 131,3415 0,3044 0,2933 62,3 85,3 8192 729,7012 877,4197 572,9071 576,5836 0,3349 0,3295 57,6 81,8

żyć, zaproponowany sposób podziału transpozycji oparty na idei znalezienia punktu przecięcia prostych zachowuje się całkiem dobrze, ponieważ strata w stosunku do najlepszego możliwego do uzyskania wyniku wynosi zwykle nie więcej niż 2% (najgorszy przypadek to n = m = 256 w tabeli 8.2, gdzie wynosi ona 6%).

Szczegółowe czasy działania algorytmów: LCTS-HS-3, LCS-BP-Length i proponowanej wersji hybrydowej podane są w tabelach zarówno dla wersji 32-, jak i 64-bitowej. Kolejne wiersze tabeli zawierają dane dla różnych długości ciągów wejściowych od n = m = 256 do n= m = 8192. Krótkiego wyjaśnienia wymaga prawa część kolumn tabel. Kolumna „Próg najl.”

określa minimalną procentową liczbę dopasowań w transpozycji, dla której algorytm LCS-BP-Lengthdziała szybciej niż algorytm LCTS-HS-3. Kolumna „Próg hyb.” zawiera podobną in-formację, z tą różnicą, że wartości w niej umieszczone zostały wyznaczone przez proponowany algorytm hybrydowy. Zgrubnie można stwierdzić, że im bliższe wartości w tych dwu