Ngày nay máy tính đã được sử dụng trong mọi lĩnh vực của đời sống, vì vậy kho thông tin trong máy tính tăng trưởng không ngừng và thật khókhăn cho công tác tìm kiếm (nhất là tìm kiếm trên các file văn bản). Vì lẽ đó bài toán tìm kiếm văn bản là bài toán rất thiết thực đang được nhiều người quan tâm, vấn đề cấp thiết đặt ra là giải quyết bài toán tìm kiếm văn bản sao cho hiệu quả, đáp ứng được nhu cầu của người sử dụng. Chuyên đề này định hướng nghiên cứu sử dụng giải thuật toán so khớp để tìm trong file văn bản các đoạn văn bản giống hoặc gần giống với mẫu (từ khoá) cần tìm kiếm. Mục đích của chuyên đề là: nghiên cứu các phương pháp tìm kiếm văn bản và tìm cách ứng dụng chúng vào một số bài toán cụ thể, trên cơ sở đó xây dựng phần mềm ứng dụng tìm kiếm văn bản một cách hiệu quả và thiết thực. Đề tài tập trung vào bài toán tìm kiếm văn bản theo hướng tiếp cận sau: Tìm các vị trí trong văn bản có xuất hiện chuỗi văn bản giống hoặc gần giống với chuỗi văn bản mẫu (xuất hiện gần giống trong trường hợp văn bản tìm kiếm không chứa chuỗi văn bản mẫu). Các thuật toán được nghiên cứu trong đề tài gồm 7 thuật toán: 1. Simon algorithm 2. Colussi algorithm 3. Galil_Giancarlo algorithm 4. Apostolico_Crochemore algorithm 5. Not So Naive algorithm 6. Forward Dawg Matching algorithm 7. Boyer- Moore algoritth
Trang 1TRƯỜNG ĐẠI HỌC HẢI PHÒNG
KHOA TOÁN TIN
- -
TÌM KIẾM VÀ SO KHỚP CHUỖI
Chuyên đề: Truyền số liệu
Trang 2LỜI NÓI ĐẦU
Ngày nay máy tính đã được sử dụng trong mọi lĩnh vực của đời sống, vì vậy kho thông tin trong máy tính tăng trưởng không ngừng và thật khókhăn cho công tác tìm kiếm (nhất là tìm kiếm trên các file văn bản) Vì lẽ đó bài toán tìm kiếm văn bản là bài toán rất thiết thực đang được nhiều người quan tâm, vấn đề cấp thiết đặt ra là giải quyết bài toán tìm kiếm văn bản sao cho hiệu quả, đáp ứng được nhu cầu của người sử dụng Chuyên đề này định hướng nghiên cứu sử dụng giải thuật toán so khớp để tìm trong file văn bản các đoạn văn bản giống hoặc gần giống với mẫu (từ khoá) cần tìm kiếm
Mục đích của chuyên đề là: nghiên cứu các phương pháp tìm kiếm văn bản và tìm cách ứng dụng chúng vào một số bài toán cụ thể, trên cơ sở đó xây dựng phần mềm ứng dụng tìm kiếm văn bản một cách hiệu quả và thiết thực
Đề tài tập trung vào bài toán tìm kiếm văn bản theo hướng tiếp cận sau: Tìm các vị trí trong văn bản có xuất hiện chuỗi văn bản giống hoặc gần giống với chuỗi văn bản mẫu (xuất hiện gần giống trong trường hợp văn bản tìm kiếm không chứa chuỗi văn bản mẫu) Các thuật toán được nghiên cứu trong đề tài gồm 7 thuật toán:
1 Simon algorithm
2 Colussi algorithm
3 Galil_Giancarlo algorithm
4 Apostolico_Crochemore algorithm
5 Not So Naive algorithm
6 Forward Dawg Matching algorithm
7 Boyer- Moore algorit
Do kiến thức còn hạn chế nên trong đề tài còn nhiều chỗ ngôn từ vẫn chưa thể hiện hết ý của thuật toán, mong thầy góp để chúng em làm tốt hơn
Trang 3NHẬN XÉT CỦA GIÁO VIÊN
ĐÁNH GIÁ VÀ CHO ĐIỂM
Trang 4
MỤC LỤC
Lời nói đầu
Mục lục
CHƯƠNG 1 : THUẬT TOÁN SIMON 5
1.1 Các đặc điểm chính 5
1.2 Mô tả 5
3.1 Mã C 6
4.1.Ví dụ 9
CHƯƠNG 2: THUẬT TOÁN COLUSSI 12
1 1 Các tính năng chính 12
2.1 Mô tả 12
3.1 mã C 15
4.1 Các ví dụ 19
CHƯƠNG 3 THUẬT TOÁN GALIL_GIANCARLO 22
1.1 Các chức năng chính 22
3.1 The C code 23
4.1 Ví dụ 24
CHƯƠNG 4 : APOSTOLICO_CROCHEMORE ALGORITHRM 26
1.1 Đặc điểm chính 26
2.1 Mô tả 27
3.1 Lệnh C 28
4.1 Ví dụ 29
CHƯƠNG 5: NOT SO NAIVE ALGORITHM 32
1.1 Các đặc điểm chính: 32
1.1 Mô tả: 32
3.1 Code C 32
4.1 Ví dụ 34
CHƯƠNG 6: THUẬT TOÁN FORWARD DAWG MATCHING 38
1.1 Các tính năng chính 38
2.1 Mô tả 38
3.1 Mã C Error! Bookmark not defined 4.1 Ví dụ: 41
CHƯƠNG 7 : THUẬT TOÁN BOYER-MOORE 43
1 1 Các đặc điểm chính: 43
2 1 Mô tả: 43
3.1 Code C 46
4.1 Ví dụ: 49
KẾT LUẬN 51
Trang 5Chương 1 : Thuật toán Simon
1.1 Các đặc điểm chính
Thực hiện một cách tiết kiệm A (x) tối thiểu Deterministic Finite Automaton công nhận
∑*x;
Giai đoạn tiền xử lý trong thời gian O(m) và không gian phức tạp;
Giai đoạn tìm kiếm độ phức tạp thời gian là O (m + n) (độc lập với kích thước bảng chữ cái);
Nhiều nhất là 2n -1 văn bản so sánh phần tử trong giai đoạn tìm kiếm;
Thời gian trễ giới hạn Min{1 + log2m, σ}
Mỗi trạng thái được đại diện bởi chiều dài của tiền tố liên quan của nó trừ đi 1 để mỗi cạnh dẫn đến phần tử i, với -1 ≤ i ≤ m -1 gọi là x [i] do đó nó không phải là cần thiết để lưu trữ các tên của các cạnh Các cạnh phía trước có thể dễ dàng được suy ra từ mô hình, do đó chúng không được lưu trữ Nó chỉ còn lại để lưu trữ các cạnh có ý nghĩa
Sử dụng một bảng L, kích thước m-2, danh sách liên kết Các phần tử L [i] cho danh sách các mục tiêu của các cạnh bắt đầu từ trạng thái i Để tránh để lưu trữ các danh sách trạng thái
Trang 6m -1, trong việc tính toán của bảng L, các số nguyên l được tính toán như vậy mà l +1 là chiều dài của đường biên giới dài nhất của x
Giai đoạn1: Tiền xử lý của thuật toán Simon bao gồm bảng L và số nguyên l Nó có thể được thực hiện trong không gian O(m) và phức tạp thời gian
Giai đoạn 2: Tìm kiếm thực hiện tương tự như trong những tìm kiếm với một automaton Khi một sự xuất hiện của mô hình được tìm thấy, trạng thái hiện tại được cập nhật bởi trạng thái l Giai đoạn này có thể được thực hiện trong thời gian O (m + n) Các thuật toán Simon thực hiện nhiều nhất là 2n -1 so sánh phần tử văn bản trong giai đoạn tìm kiếm Sự chậm trễ (tối đa số so sánh cho một phần tử văn bản duy nhất) được bao giới hạn Min{1 + log2m, σ }
Trang 7void setTransition(int p, int q, List L[]) {
Trang 94.1.Ví dụ
Mẫu: gcagagag
Xâu: gcatcgcagagagtatacagtacg
Giai đoạn 1:Tiền xử lý
Giai đoạn 2: Tìm kiếm
Trạng thái ban đầu: -1
Trang 12Chương 2: THUẬT TOÁN COLUSSI
1 1 Các tính năng chính
Phân vùng các thiết lập vị trí mô hình thành hai tập con rời nhau, các vị trí trong tập đầu tiên được quét từ trái sang phải và khi không phù hợp không xảy ra các vị trí của các tập hợp con thứ hai được quét từ phải sang trái;
Giai đoạn tiền xử lý trong thời gian O (m) và sự phức tạp không gian ;
Tìm kiếm giai đoạn phức tạp thời gian O (n);
Thực hiện n so sánh nhân vật văn bản trong trường hợp xấu nhất
2.1 Mô tả
Các thiết kế của thuật toán Colussi sau một phân tích chặt chẽ của thuật toán Knuth, Morris
và Pratt if
Các thiết lập vị trí mẫu được chia thành hai tập con rời nhau
Gồm hai giai đoạn:
- Trong giai đoạn đầu tiên, so sánh được thực hiện từ trái sang phải với các ký tự văn
bản phù hợp với vị trí mô hình cho giá trị của chức năng kmpNext là đúng lớn hơn -1
Các vị trí and put này được gọi là noholes;
- Giai đoạn thứ hai bao gồm so sánh các vị trí còn lại (gọi là lỗ) từ phải sang trái
Trang 13Đối với 0 <i <m nếu kmin [i -1] ≠ 0 sau đó i là một nohole cách khác là một lỗ
Thứ 1 là số lượng noholes trong x
H bảng đầu tiên có chứa thứ 1 noholes trong thứ tự tăng dần và sau đó m - nd -1 lỗ trong thứ
tự giảm dần :
Cho 0 ≤i ≤ nd, h [i] là một nohole và h [i] <h [i +1] để 0 ≤ i <nd;
Cho nd <i <m, h [i] là một lỗ và h [i]> h [i +1] cho nd <i <m -1
Nếu i là một lỗ hổng sau đó rmin [i] là khoảng thời gian nhỏ nhất của x lớn hơn i
Giá trị đầu tiên [u] là nhỏ nhất số nguyên v như là u ≤ h [v]
Sau đó, giả sử x là phù hợp với y [j j + m -1 Nếu x [h [k]] = y [j + h [k]] 0 ≤ k <r <nd x
y [ j '+ h [đầu tiên [h [r] - kmin [h [r ]]]]]
Hình 9.1: không phù hợp với nohole Noholes là những vòng tròn màu đen và được so
sánh từ trái sang phải
Trong tình hình này, sau khi thay đổi, nó không phải là cần thiết để so sánh hai noholes đầu tiên một lần nữa
Nếu x [h [k]] = y [j + h [k]] 0 ≤ k <r và x [h [r]] ≠ y [k + h [r] với thứ ≤ r <m Hãy
Trang 14j = k + rmin [h [r] Sau đó, không có sự xuất hiện của đầu x trong y [j j '] và x có thể được chuyển kmin [h [r]] vị trí bên phải
Hơn nữa x [0 m -1 - rmin [h [r]]] = y [j ' k + m -1] ý nghĩa rằng sự so sánh có thể được tiếp tục với x [h đầu tiên [m -1 - rmin [h [r ]]]]] và y [j '+ h [đầu tiên [m -1 - r min [h [r ]]]]]
Hình 9.2: không phù hợp với một lỗ trống Noholes là những vòng tròn màu đen và được
so sánh từ trái sang phải trong khi lỗ là những vòng tròn màu trắng và được so sánh từ phải sang trái
Trong tình hình này, sau khi thay đổi, nó không phải là cần thiết để so sánh tiền tố phù hợp của mô hình một lần nữa
Để tính toán các giá trị của kmin, Hmax bảng được sử dụng và được xác định như sau:
Hmax [k] là như vậy mà x [k Hmax [k] -1] = x [0 Hmax [k] - k -1 và
x [Hmax [k]] ≠ x [Hmax [k] - k]
Giá trị của nhd0 [i] là số lượng noholes đúng nhỏ hơn i
Bây giờ chúng ta có thể xác định hai chức năng thay đổi và tiếp theo như sau :
Thay đổi [i] = kmin [h [i] và sau [i] = nhd0 [h [i] - kmin [h [i]]] thứ <i;
Thay đổi [i] = rmin [h [i] và sau [i] = nhd0 [m - rmin [h [i]]] nd ≤ <m;
Thay đổi [m] = rmin [0] và sau [m] = nhd0 [m - rmin [h [m -1]]]
Như vậy, trong một nỗ lực nơi cửa sổ được đặt trên các yếu tố văn bản y [j j + m -1, khi không phù hợp xảy ra từ x [h [r]] và y [j + h [r]] cửa sổ phải được chuyển bằng cách thay đổi
[r] và so sánh có thể được tiếp tục với vị trí mô hình h [sau [r]]
Giai đoạn tiền xử lý có thể được thực hiện trong không gian (m) O và thời gian
Giai đoạn tìm kiếm sau đó có thể được thực hiện trong phức tạp thời gian O (n) và hơn nữa, ở
hầu hết các n so sánh nhân vật văn bản được thực hiện trong giai đoạn tìm kiếm
Trang 18void COLUSSI(char *x, int m, char *y, int n) {
while (i < m && last < j + h[i] &&
x[h[i]] == y[j + h[i]])
Trang 19}
4.1 Các ví dụ
nd=3 (giá trị trùng nhau cuối cùng)
Giai đoạn tìm kiếm
Trang 22Chương 3 Thuật toán Galil_Giancarlo
1.1 Các chức năng chính
Là sự kết tinh tinh tế của thuật toán Colussi
Giai đoạn tiền xử lý có sự phức tạp không gian và thời gian là O (m)
Giai đoạn tìm kiếm có độ phức tạp là O (n); Thực hiện 4
3n phép so sánh kí tự văn bản
trong trường hợp xấu nhất;
2.1 Mô tả
Các thuật toán GalilGiancarlo là một biến thể của thuật toán Colussi (xem chapter9) Nhưng
có sự thay đổi can thiệp trong giai đoạn tìm kiếm Phương pháp này áp dụng khi x không phải
là 1 nguồn của 1 ký tự đơn Như vậy x cm với c khi l là chỉ số cuối trong mẫu thử như là cho 0 <= i <= L, x [0] = x [i] và x [0] khác x [L +1] Giả sử rằng trong việc thử tất cả các noholes có được lần xuất hiện và một hậu tố mô hình đã được ghép ý nghĩa rằng sau khi thay đổi tương ứng với một tiền tố của mô hình sẽ vẫn còn phù hợp với một phần của văn bản
Do đó, cửa sổ được đặt trên các yếu tố văn bản y[ j j + m-1] và các phần y [j last] nối vs x [0 last -j] Sau đó, thuật toán sẽ quét bắt đầu ký tự văn bản với y[last +1] cho đến khi kết thúc của văn bản là giữ đc hoặc một kí tự x [0] khác y [j + k] được tìm thấy Trong trường hợp thứ hai này hai subcases có thể phát sinh;
- x [L 1] khác y [j + k] hoặc quá ít x [0] đã được tìm thấy vs (k <= L) sau đó cửa sổ được thay thế và chuyển vào vị trí trên các yếu tố văn bản y [k +1 k + m], các chức năng quét của văn bản tiếp tục (như trong thuật toán Colussi) với các nohole đầu tiên và tiền tố ghi nhớ của mô hình là từ trống
- x [L +1] = y [j + k] và đủ của x [0] đã được tìm thấy (k> L) sau đó cửa sổ được chuyển
và vị trí trên các yếu tố văn bản y [k-L-1 k-L + m -2] các chức năng quét của văn bản tiếp tục (như trong thuật toán Colussi) với nohole thứ hai (x [L +1] là một trong những th đầu tiên)
và các tiền tố ghi nhớ của mô hình là x [0 L +1] Tiền xử lý giai đoạn này chính xác giống
Trang 23gian O (m) Giai đoạn tìm kiếm sau đó có thể được thực hiện trong phức tạp thời gian O (n)
và hơn nữa ở hầu hết các 4
3n văn bản so sánh kí tự được thực hiện trong giai đoạn tìm kiếm
3.1 The C code
The function preColussi
void GG(char *x, int m, char *y, int n)
{
int i, j, k, ell, last, nd;
int h[XSIZE], next[XSIZE], shift[XSIZE];
Trang 24last = j -1;
} else
}
else
{
while (i < m && last< j + h[i] &&
x[h[i]]== y[j +h[i]])
++i;
if (i >= m || last >= j + h[i])
{ OUTPUT(j);
i = m;
}
if (i> nd) last = j + m -1;
Trang 27Giai đoạn tiền xử lý O(m) và sự phức tạp về ko gian
Giai đoạn tìm kiếm phức tạp trong thời gian O(n)
Thực hiện so sánh ký tự văn bản 3/2n trong trường hợp xấu nhất
2.1 Mô tả
Apostocolico-crochemore sử dụng bảng chuyển đổi kmpNext để tính toán việc thay đổi tên Để L= 0 nếu x là lũy thừ của ký tự đơn đầu tiên (x = c^m với c thuộc Z) và L bằng với vị trí của ký tự đầu tiên của x khác x[0] khác(x = aLb.u cho a.b thuộc Z, u thuộc Z* và a#b) Trong nỗ lực mỗi so sánh đc thực hiện với vị trí mẫu theo thứ tự sau: L,L+!,… ,m-2,m-
1,0,1,……L-1.Trong quá trình tìm kiếm tìm kiếm giai đoạn(i,j,k) chúng ta xem xét 3 hình thức:
- Cửa sổ đc đặt trên các yếu tố văn bản y[j…j+m-l];
Nếu x[i]=y[i+j] sau đó thì 3 cái tiếp theo sẽ là (i+1,j,k)
Nếu x[i] # y[i+j] thì 3 cái tiếp theo sẽ là (L,j+1,max{0,k-1})
- L<i<m
Nếu x[i] = y[i+j] thì 2 TH xuất hiện sẽ phụ thuộc vào giá trị của kmpNext[i]:
- kmpNext[i]≤L: thì 3 cáii tiếp theo sẽ là
(L,i+j-kmpNext[i],max{0,kmpNext[i]})
- KmpNext[i]>l: thì 3 cái tiếp theo sẽ là
(kmpNext[i],i+j-kmpnext[i],l)
- I = m
Trang 28Nếu k<l và x[k] =y[j+k] thì tiếp theo sẽ là (I,j,k=1) nói cách khác hoắc là k<l và x[k] # y[j+k], hoặc k=L nếu k=L thì trường hợp x sẽ xảy ra Trong cả hai trường hợp 3 cái tiếp theo sẽ đc tính toán theo 1 cách tương tự nnhuw trong trường hợp L<i<m
Giai đoạn tiền xử lý bao gồm trong việc tính toán bảng KmpNext và số nguyên tố L Nó có thể thực hiện đc trong không gian và thời gian 0(m).gia đoạn tìm kiếm phức tạp này cúng với thuật toán apostolico-………… được biểu hiện ở hầu hét phép so sánh kí tự văn bản 3/2n trong trường hợp xấu nhất
Trang 30x[i]
kmpNext[i]
G C A G A G A G
-1 0 0 -1 1 -1 1 -1 L=1
Tìm kiếm giai đoạn
Trang 31Shift by 1 ( i – kmpNext[i] = 1- 0 )
Lần thử thứ 5 :
Shift by 1 (i – kmpNext[i] = 0 - -1 )
Trang 32Chương 5: Not So Naive Algorithm
1.1 Các đặc điểm chính:
Trong giai đoạn đầu xử lý có độ phức tạp là không đổi về thời gian
Độ phức tạp về không gian đặc biệt liên tục
Giai đoạn tìm kiếm có độ phức tạp là O(m x n)
Hơi phụ tuyến tính trong trường hợp trung bình
hoặc nếu x[0] # x[1] và x[1]=y[j+1]
các mẫu chuyển bởi 2 vị trí cuối của lần thử và bằng 1 nếu không
Do đó, trong giai đoạn đầu xử lý có thể thực hiện trong thời gian và không gian liên tục Giai đoạn tìm kiếm của thuật toán “Not So Naive” có một trường hợp tồi tệ nhất là bậc hai nhưng nó là hơi phụ tuyến tính trong trường hợp trung bình
Trang 38Chương 6: Thuật toán chuyển tiếp phù hợp Dawg
1.1 Các tính năng chính
Sử dụng automaton hậu tố của x ;
Độ phúc tạp thời gian trường hợp xấu nhất O (n);
Thực hiện chính xác n kiểm tra kí tự văn bản
2.1 Mô tả
Các thuật toán Forward Dawg Matching tính toán các yếu tố dài nhất của mô hình kết thúc tại mỗi vị trí trong văn bản Điều này là bằng cách có thể sử dụng automaton hậu tố nhỏ nhất (cũng gọi là Dawg cho đồ thị Đạo Lời mạch hở) của mô hình Các hậu tố tự động nhỏ
nhất một từ w là một automaton hữu hạn xác định S (w) = (Q, q 0, T, E) Ngôn ngữ được chấp
nhận bởi S (w) là L (S (w)) = { u trong *: Tồn tại v * W = vu}
Giai đoạn tiền xử lý của các thuật toán phù hợp Forward Dawg bao gồm trong việc tính
toán các hậu tố tự động nhỏ nhất cho mẫu x Nó là tuyến tính trong thời gian và không gian
trong chiều dài của mô hình
Trong giai đoạn tìm kiếm các thuật toán Forward Dawg Matching phân tích các kí tự
của văn bản từ trái sang phải với S automaton (x) bắt đầu với trạng thái q0 Đối với mỗi trạng
thái q trong S (x) được ký hiệu là con đường dài nhất từ q 0 để p theo chiều dài (q) Cấu trúc này sử dụng rộng rãi các khái niệm liên kết hậu tố Đối với mỗi p, các liên kết hậu tố của p được ký hiệu là S [p ] Đối với một trạng p, hãy để đường dẫn (p) = (0 p, p, 1 , p ) Được con đường hậu tố của p p 0 = p, cho 1 i , P i = S [p i -1] và p = Q 0. Đối với mỗi ký tự văn bản
y [j] tuần tự, thay p là trạng thái hiện tại, sau đó các thuật toán Forward Dawg Matching có một sự chuyển đổi quy định cho y [j] cho các tiểu bang đầu tiên của Con Đường (p) cho quá trình chuyển đổi như vậy được định nghĩa Trạng thái P hiện tại được cập nhật với các mục