Việc so khớp hai xâu bất kì thực chất là so khớp lần lượt r vị trí liên tiếp (r ℓ). Do vậy, chắc chắn trong quá trình so khớp ta phải nhiều lần so khớp các đoạn cĩ độ dài r giống nhau. Cơng việc này làm tốn nhiều thời gian tính tốn. Để khắc phục nhược điểm đĩ, trong tập các xâu lưu trong S, ta cĩ thể loại những xâu trùng nhau để tăng hiệu suất sử dụng bộ nhớ. Tuy nhiên cơng việc này lại địi hỏi mất thêm thời gian tính tốn.
Phương pháp tối ưu cho cơng việc này là sử dụng bảng băm.
2.4.2.1.Thuật tốn
- Tư tưởng: Ta sử dụng bảng A kiểu Boolean cĩ n hàng và m cột với: n = 2r và m = ℓ – r + 1
giá trị là i trong hệ cơ số 10.
+ A[i, j] = 0: trong trường hợp ngược lại.
- Bảng A được xây dựng bằng cách đọc lần lượt các đoạn r bit liên tiếp của các xâu trong S rồi tính giá trị thập phân của đoạn bit đĩ và gán A[i, j] tương ứng cĩ giá trị bằng 1.
Input: Tập các xâu S, ℓ, r Output: ChunkD(S,r)
Procedure CHUNK_DETECTOR_NSA Begin //Tạo bảng A
Khởi tạo mảng A[2r, ℓ – r + 1] với giá trị bằng 0; foreach s in S do
for j=1 to ℓ-r+1 do begin
i = giá trị thập phân của đoạn xâu nhị phân s[j…j+r]; A[i,j] = 1; end; //Sinh bộ dị dạng r-chunk D = ; For i:=0 to 2r do For j:=1 to ℓ-r+1 do
If A[i, j] = 0 then D := D (i2, j); End;
2.4.2.2.Độ phức tạp thuật tốn
Kích thước của bảng A phụ thuộc vào độ lớn của hai tham số ℓ và r. Với các giá trị tham số hợp lý thì hồn tồn cĩ thể lưu A ở bộ nhớ trong.
Các xâu bit cĩ đoạn r bit tương ứng giống nhau sẽ tự động được loại bỏ vì ta chỉ cần biết đoạn bit đĩ nằm ở vị trí nào và cĩ giá trị trong hệ 10 là
Vì A là bảng hai chiều, được lưu trữ trên bộ nhớ trong nên việc truy cập đến phần tử A[i,j] chỉ mất thời gian là O(1). Dù dữ liệu bảo vệ cĩ thay đổi, rất lớn đi nữa thì ta vẫn chỉ cần một bảng A kích thước cố định 2r dịng, (ℓ - r + 1) cột.
Độ phức tạp thuật tốn tạo mảng A là O(|S|(ℓ - r + 1)) và độ phức
tạp thuật tốn sinh tập bộ dị là O(2r.(ℓ - r + 1)). Vậy độ phức tạp của thủ tục CHUNK_DETECTOR_NSA là (2r + |S|)(ℓ - r + 1) Ví dụ 2.4. Cho S = {01011; 11001; 01010; 10110; 00101} Ta cĩ ℓ = 5 và chọn r = 3. Vì vậy: Số dịng của bảng A: n = 2r = 23 = 8 Số cột của bảng A: m = ℓ – r + 1 = 5 – 3 + 1 = 3 * Xét xâu 1: s1 = 01011
+ Với j = 1: ta cĩ đoạn bit 010 (010)2 = (2)10 Vậy A[2, 1] = 1 + Với j = 2: ta cĩ đoạn bit 101
(101)2 = (5)10 Vậy A[5, 2] = 1
+ Với j = 3: ta cĩ đoạn bit 011 (011)2 = (3)10 Vậy A[3, 3] = 1 * Xét xâu 2: s2 = 11001
+ Với j = 1: ta được đoạn bit 110 (110)2 = (6)10 Vậy A[6, 1] = 1 + Với j = 2: ta được đoạn bit 100
(100)2 = (4)10 Vậy A[4, 2] = 1 +Với j = 3: ta cĩ đoạn bit 001 (001)2 = (1)10 Vậy A[1, 3] = 1 * Xét xâu 3: s3 = 01010
+ Với j = 1: ta cĩ đoạn bit 010 (010)2 = (2)10
+ Với j = 2: ta được đoạn bit 101 (101)2 = (5)10
Ta thấy rằng A[5, 1] đã nhận giá trị là 1, do vậy đoạn bit 010 ở vị trí thứ hai đã trùng với đoạn bit ở vị trí thứ hai của một xâu trước đĩ. Vậy nên ta đã loại được các bit giống nhau.
+ Với j = 3: ta được đoạn bit 010 (010)2 = (2)10 Vậy A[2, 3] = 1 Thực hiện tương tự với hai xâu cịn lại ta sẽ thu được kết quả là bảng A như sau: Bảng 2.1. Kết quả bảng băm A. 1 2 3 0 0 0 0 1 1 0 1 2 1 1 1 3 0 1 1 4 0 1 0 5 1 1 1 6 1 0 1 7 0 0 0 Như vậy, ta sẽ được tập bộ dị r – chunk là:
(000,1) (000,2) (000,3) (011,1) (001,2) (100,3) (100,1) (110,2) (111,3) (111,1) (111,2)