Thuật toán quy hoạch động giải quyết bài toán xâu con chung dài nhất khá hiệu quả với ma trận phương án có thể truy xuất lại xâu rất nhanh. Tuy nhiên khi dữ liệu lớn với số chuỗi tăng lên, phương pháp lưu trữ bằng ma trận như vậy sẽ không hiệu quả. Đặc biệt, khi độ dài chuỗi tăng dần, kích thước ma trận sẽ tăng đột biến và khi đạt đến một cỡ đủ lớn thì máy tính sẽ bị tràn bộ nhớ. Để giải quyết vấn đề này một cách hiệu quả, Hakata và Imai [8] đã đưa ra phương pháp phần tử trội để lưu trữ các phương án tìm xâu con chung dài nhất. Phương pháp này như sau:
Giả sử L là ma trận phương án với d chiều tương đương với d xâu ký tự
d
s ,..., s ,
s1 2 trên bảng chữ cái a1,a2,...,aN. pp1,p2,...,pdlà một điểm trên ma trận L với mỗi thành phần số nguyên pi là các vị trí tương ứng trên xâu si. Giá trị của vị trí p trong ma trận L được ký hiệu là L p . Tương tự như vậy, với một xâu
s, ký tự a ở vị trí thứ k trong xâu s được ký hiệu là a s k . Định nghĩa điểm khớp
Một điểm pp1,p2,...,pd trong L được gọi là một điểm “khớp” nếu:
p s p ... sd pd
s1 1 2 2 . Điểm khớp p tương ứng với một ký tự a được ký hiệu là p a .[8]
Định nghĩa điểm trội
Một điểm pp1,p2,...,pd được gọi là trội hơn điểm qq1,q2,...,qd nếu
d i
q
pi i, 1,2,..., . Nếu điểm p trội hơn điểm q thì ta ký hiệu là pq.
Tương tự như vậy, một điểm pp1,p2,...,pd được gọi là trội hơn hẳn điểm
q q qd
q 1, 2,..., nếu pi qi,i1,2,...,d. Nếu điểm p trội hơn điểm q thì ta ký hiệu là pq.
Một điểm pp1,p2,...,pd không trội hơn điểm qq1,q2,...,qd nếu
d i
i
,1 sao cho pi qi. Nếu điểm p không trội hơn điểm q thì ta ký hiệu là
q p . [8]
Định nghĩa điểm k trội
Một điểm khớp p a được gọi là một điểm k trội (phần tử k trội) nếu: (i) L p k;
(ii) Không có một điểm khớp q a nào thỏa mãn (i) và q p. Ký hiệu k
D là tập tất cả các điểm k trội. Ký hiệu D là tập tất cả các điểm trội. [8]
Định nghĩa điểm cha
Một điểm khớp p a được gọi là điểm cha của điểm q, nếu q p và không có một điểm khớp r a nào thỏa mãn qr p. Ký hiệu Par ,q a là tập tất cả các điểm cha của điểm q, ParA,a là tập tất cả các điểm cha của tập các điểm A và
A,
Par là tập tất cả các điểm cha (a ParA,a) của tập các điểm A. [8] Định nghĩa thành phần nhỏ nhất:
Một điểm p trong tập các điểm A được gọi là thành phần nhỏ nhất của A, nếu qA:q p. Nếu A 1, khi đó thành phần duy nhất chính là thành phần nhỏ nhất của A.
Bảng 2.2 Ví dụ về các điểm trội trong ma trận phương án.
H E A G A W G H E E A 0 0 1 1 1 1 1 1 1 1 W 0 0 1 1 1 2 2 2 2 2 H 1 1 1 1 1 2 2 3 3 3 E 1 2 2 2 2 2 2 3 4 4 A 1 2 3 3 3 3 3 3 4 4 E 1 2 3 3 3 3 3 3 4 5
Bảng 2 nêu ví dụ về các phần tử trội trong ma trận phương án của bài toán tìm xâu con chung dài nhất của hai xâu s1 "HEAGAWGHEE" và s2 "AWHEAE". Các
điểm được khoanh tròn là các điểm trội. Các điểm được khoanh ô vuông là các điểm có vị trí khớp nhưng không phải là điểm trội.
Cho s1,s2,...,sd là d xâu ký tự trên bảng chữ cái và L là ma trận phương án. Khi đó chúng ta có nhận xét sau:
- Mỗi một vị trí trên xâu con chung dài nhất của d xâu ký tự trên là một vị trí khớp trên ma trận phương án L. Như vậy chúng ta chỉ cần tập trung vào tất cả các điểm khớp trên ma trận phương án L.
- Số lượng các mức của phần tử trội chính là độ dài của xâu con chung dài nhất của d xâu. Hơn nữa, tại mỗi mức k sẽ có ít nhất một k phần tử trội tương ứng với vị trí của ký tự thứ k trong xâu con chung dài nhất của d xâu.
- Các phần tử trội của L có thể được tính một cách thông qua tập các phần tử trội trước đó, tức là việc tính toán k1
D sẽ trực tiếp dựa vào
k
D .
- Tập các k1 phần tử trội Dk1 chính là tập con của tập các điểm cha của tập Dk hay Dk1ParDk,.
- Phần tử nhỏ nhất trong tập các phần tử cha của tập các phần tử trội chính là các phần tử trội.
Qua các nhận xét trên, có thể thấy rằng các phần tử trội ở mức cao hơn luôn trội hơn hẳn một phần tử trội ở mức thấp hơn một bậc. Như vậy, để tìm các phần tử trội, chúng ta thực hiện như sau:
Xuất phát với k1, Dk . Dò tìm lần lượt trên các xâu ký tự, nếu gặp điểm khớp p đầu tiên thì đó chính là phần tử trội ở mức 1. Bổ sung p vào 1
D . Giả sử ta
đã có i
D D
D1, 2,..., là tập các phần tử trội nhỏ hơn hoặc bằng mức i (i1). Khi tìm thấy một điểm khớp q, chúng ta sẽ kiểm tra xem q trội hơn so với các phần tử k
q với các phần tử trong k1
D . Khi tìm được k là mức lớn nhất mà q trội hơn ít nhât một phần tử trong tập Dk, chúng ta sẽ kiểm tra xem q có trội hơn hẳn một phần tử trội nào trong tập Dk hay không. Nếu có thì q chính là phần tử trội của tập Dk1, ngược lại thì q không phải là phần tử trội.
Truy xuất tìm xâu con chung dài nhất khi biết phần tử trội
Khi có được tập tất cả các phần tử trội, chúng ta hoàn toàn có thể xây dựng ma trận phương án như sau:
Giả sử s1,s2,...,sd là d xâu ký tự trên bảng chữ cái và L là ma trận phương án với tất cả các phần tử bằng 0. Xâu con chung dài nhất với độ dài là l.
Xuất phát từ tập tất cả các phần tử trội ở mức lớn nhất (mức l). Tại vị trí này ta đánh số l. Tất cả vị trí trội hơn các phần tử trội này cũng sẽ đều được đánh số l. Sau đó giảm xuống l1 và lại đánh số như trên. Cần lưu ý rằng các vị trí đã được đánh số khác 0 thì sẽ không được đánh số lại nữa. Cứ tiếp tục như vậy ta sẽ có ma trận phương án.
Bảng 2.3 mô tả việc dựng lại ma trận bảng phương án khi biết các phần tử trội. Bảng đang thể hiện việc xây dựng ma trận ở đối với các phần tử trội ở mức 3.
Bảng 2.3. Ví dụ về việc xây dựng lại ma trận phương án với các phần tử trội.
H E A G A W G H E E A 1 W 2 H 1 3 3 3 E 2 3 4 4 A 3 3 3 3 3 3 4 4 E 3 3 3 3 3 3 4 5
Thuật toán tìm phần tử trội như sau:
Thuật toán 2.3. Thuật toán tìm phần tử trội
Ví dụ như trong bảng 2.3, xâu con chung dài nhất của hai xâu
" HEAGAWGHEE "
s1 và s2 "AWHEAE" là "AWHEE".
Mặt khác, khi biết được tập các phần tử trội, chúng ta có thể dễ dàng tìm trực tiếp ra xâu con chung dài nhất như sau:
Xuất phát từ một phần tử pl trong tập các phần tử trội Dl, tìm một phần tử
1
l
p trong tập l1
D sao cho pl pl1, rồi lại tiếp tục áp dụng tương tự với các tập
1 2,..., D
Dl . Như vậy, tập các điểm p1,p2,...,pl chính là các điểm trên xâu gốc mà tại đó là các ký tự trên xâu con chung dài nhất. Nói cách khác, xâu con chung dài nhất chính là si p1si p2 ....si pl với 1id.
Đánh giá về độ phức tạp tính toán đối với bài toán tìm xâu con chung dài nhất, Hakata và Imai [8] đã đưa ra đánh giá như sau: Bài toán tìm xâu con chung dài nhất với số chuỗi d 3 với độ dài n được tính toán trong khoảng thời gian là
function findDominant(b,X[1..m],i,j) Đầu vào: các xâu S1,S2,...,Sd
Đầu ra: tập các phần tử trội D
Các bước: 1. D0 0,0,...,0 ; k 0; 2. While k D con khác trống 3. A; 4. for pDk 5. Parp, = cha (p); 6. AAParp,; 7. k1 D = phần tử nhỏ nhất của A 8. k; 9. endWhile
d DN d n N nN
O logd 3 logd 2 , với D là số tất cả các phần tử trội, N là số chữ cái trong bảng chữ cái (N .) Ước lượng này dựa trên việc tính toán các phần tử cực tiểu của một tập mất thời gian t1Odmlogd 2 m để tính toán các phần tử cức tiểu của m trong d chiều. Tuy nhiên ước lượng này là quá rộng, Korkin và các cộng sự [7] đã đưa ra một ước lượng tốt hơn cho bài toán này, vào cỡ
k k D n d N
O 2 , với Dk là tập tất cả các phần tử k trội, do số lượng các phần
tử trội là ít hơn rất nhiều so với số điểm của ma trận phương án.