Tập bộ dị dạng r-contiguous thường cĩ khả năng phát hiện thay đổi kém hơn so với tập bộ dị dạng r-chunk nhưng nĩ thích hợp cho dữ liệu cĩ tính cấu trúc.
2.4.3.1. Thuật tốn
Output: ContD(S,r)
Procedure CONTIGUOUS_DETECTOR_NSA Begin Tạo bảng A tương tự như r-chunk;
//Sinh tập bộ dị r – contiguous
//sử dụng hai tập hợp để chứa bộ dị D1 và D2
D1 = giá trị của i khi đổi về dạng nhị phân r bit ứng với phần tử a[i, 1] (i = 1,…, n) cĩ giá trị bằng 0 và D2 = ;
for i=2 to ℓ-r+1 do begin
D2=;
for mỗi dD1 do begin
if copy(d,i,r-1)+’0’ mà A[k,i] = 0 then D2 copy(d,i,r-1)+’0’ if copy(d,i,r-1)+’1’ mà A[k,i] = 0 then D2 copy(d,i,r-1)+’1’ end; end; D1= D2; End; ContD(S,r) = D1; 2.4.3.2. Độ phức tạp thuật tốn
Độ phức tạp thuật tốn tìm tập ContD(S,r) là O(r.2r(ℓ-r+1)).
Ví dụ 2.5. S = {01011 ; 11001 ; 10110 ; 00101 ; 01010}, với ℓ = 5, r = 3. Ta cĩ bảng A như sau: 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
Tại cột 1 của bảng A ta thấy: + A[0, 1] = 0 Vậy D1[1] = 000 + A[3, 1] = 0 Vậy D1[2] = 011
+ A[4, 1] = 0 Vậy D1[3] = 100
+ A[7, 1] = 0 Vậy D1[4] = 111 i = 2 < ℓ - r + 1 nên Với D1[1] = 000
*) Xâu = 0001 s = (001)2 = (1)10
Thấy A[s, 2] = A[1, 2] = 0 Vậy D2[1] = 0001 *) Xâu = 0000
s = (000)2 = (0)10
Thấy A[s, 2] = A[0, 2] = 0 Vậy D2[2] = 0000 Với D1[2] = 011
*) Xâu = 0111 s = (111)2 = (7)10
Thấy A[s, 2] = A[7, 2] = 0 Vậy D2[3] = 0111 *) Xâu = 0110
s = (110)2 = (6)10
Thấy A[s, 2] = A[6, 2] = 0 Vậy D2[4] = 0110 Với D1[3], D1[4] ta làm tương tự và được
D2[5] = 1001, D2[6] = 1000 D2[7] = 1111, D2[8] = 1110 D1 = D2; D2 = ; i = 3 <= ℓ-r+1 nên Với D1[1] = 0001 *) Xâu = 00011 s = (011)2 = (3)10
Thấy A[s, 3] = A[3, 3] = 1 nên khơng lưu 00011 vào mảng D2 *) Xâu = 00010
s = (010)2 = (2)10
Thấy A[s, 3] = A[2, 3] = 1 nên khơng lưu 00011 vào mảng D2 Với D1[2] = 0000
s = (001)2 = (1)10
Thấy A[s, 2] = A[1, 3] = 1 nên khơng lưu 00001 vào mảng D2
+ Xâu = 00000
s = (010)2 = (0)10
Thấy A[s, 2] = A[0, 3] = 0 Vậy D2[1] = 00000
Với D1[3], D1[4], D1[5], D1[6], D1[7], D1[8] làm tương tự ta được D2[2] = 00000, D2[3] = 01100 D2[4] = 01111, D2[5] = 10000 D2[6] = 11111 D1 = D2; D2 = D1; i = 4 > ℓ - r +1 nên kết thúc. Vậy tập bộ dị tìm được là: D[1] = 00000 D[4] = 10000 D[2] = 01100 D[5] = 11100 D[3] = 01111 D[6] = 11111
Như vậy với phương pháp sử dụng bảng băm A, tốc độ sinh tập bộ dị sẽ tăng nhanh, với độ phức tạp thời gian là O(2r.(ℓ-r+1)).