Thuật toán này có những ưu điểm nổi bật là có thể tìm kiếm đồng thời sự xuất hiện của nhiều từ mẫu và có thời gian tính toán là tuyến tính tỉ lệ thuận với chiều dài của dữ liệu vào.. Điề
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-
LÊ QUỐC THI
NGHIÊN CỨU THUẬT TOÁN SONG SONG TRÊN MÔI TRƯỜNG MPI CHO BÀI TOÁN SO KHỚP XÂU
Chuyên ngành : Công nghệ thông tin
LUẬN VĂN THẠC SĨ KỸ THUẬT CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC
TS NGUYỄN TUẤN DŨNG
Hà Nội – Năm 2014
Trang 2LỜI CAM ĐOAN
Tôi – Lê Quốc Thi - Cam kết luận văn này là công trình nghiên cứu của bản thân tôi dưới sự hướng dẫn của TS Nguyễn Tuấn Dũng
Các kết quả nêu trong luận văn là trung thực, không phải là sao chép toàn văn của bất kỳ công trình nào khác
Trang 3LỜI CẢM ƠN
Trước hết, tôi xin gửi lời cảm ơn trân trọng nhất tới TS.Nguyễn Tuấn Dũng, bộ môn Khoa học máy tính, Viện Công nghệ thông tin và Truyền thông, trường Đại học Bách Khoa Hà Nội, người đã hướng dẫn, tận tình chỉ bảo và hỗ trợ tôi trong suốt quá trình làm luận văn tốt nghiệp
Tôi xin gửi lời cám ơn tới các thầy cô trong Viện Công nghệ thông tin và Truyền thông cùng toàn thể các thầy cô trường Đại học Bách Khoa Hà Nội đã cùng giúp
đỡ, hỗ trợ tôi trong suốt quá trình nghiên cứu và thực hiện luận văn này
Hà Nội, tháng 02 năm 2014
Học viên : Lê Quốc Thi
Trang 4MỤC LỤC
MỤC LỤC 4
DANH MỤC HÌNH VẼ 5
DANH MỤC CÁC TỪ VIẾT TẮT VÀ THUẬT NGỮ 6
Chương 1 - Đặt vấn đề và định hướng giải pháp 7
1.1 Bài toán so khớp xâu 7
1.2 Một số thuật toán so khớp xâu 11
1.2.1 Các cách tiếp cận cơ bản 11
1.2.2 Phương pháp Aho-corasick 15
1.2.3 Phương pháp phân tách Head-Body 19
1.2.4 Thực hiện bài toán so khớp xâu trong môi trường song song 26
Chương 2 - Cài đặt và phân tích các thuật toán cho bài toán so khớp xâu 30
2.1 Phân tích, cài đặt và đánh giá thuật toán tuần tự 30
2.1.1 Phân tích phương pháp Aho-corasick 30
2.1.2 Phân tích phương pháp phân tách Head-Body 37
2.2 Xây dựng bài toán MSM trong môi trường song song 43
2.2.1 Cài đặt thuật toán trong môi trường song song MPI 43
2.2.2 Phương pháp Head Body trong môi trường song song 43
2.2.3 Phương pháp song song Master – Slave cho thuật toán Head Body 44
2.2.4 Cài đặt phương pháp Head Body với MPI 46
Chương 3 - Kết quả thu được từ thực nghiệm và ứng dụng của bài toán 51
3.1 Kết quả thu được từ thực nghiệm 51
3.2 Ứng dụng của bài toán 57
Chương 4 - Kết luận và hướng phát triển 59
4.1 Kết luận 59
4.2 Hướng phát triển 59
TÀI LIỆU THAM KHẢO 61
Trang 5DANH MỤC HÌNH VẼ
Hình 1 Các hàm goto, failure, output sinh ra từ thuật toán AC 16
Hình 2 Ảnh hưởng tỉ lệ so khớp tới hiệu năng của thuật toán [6] 20
Hình 3: Automat AC-DFA cho từ điển S [6] 24
Hình 4: H-DFA và B-NFA cho từ điển S [6] 24
Hình 5 Phương pháp song song cho thuật toán Head-Body 44
Hình 6: Biểu đồ so sánh hiệu năng của phương pháp song song Head-Body với tỉ lệ so khớp và kích thước subtext 51
Hình 7: Biểu đồ so sánh hiệu năng phương pháp song song và tuần tự với số processor khác nhau 52
Hình 8: Biểu đồ so sánh phương pháp HB song song và AC song song 53
Hình 9: Biểu đồ so sánh hiệu năng phương pháp HB song song và AC song song trong môi trường nhiều máy 56
Hình 10 Mô hình kiến trúc hệ thống IDS 57
Trang 6DANH MỤC CÁC TỪ VIẾT TẮT VÀ THUẬT NGỮ
MSM Multi String Matching Bài toán tìm kiếm nhiều từ mẫu
AC Aho-Corasick algromith Thuật toán Aho-Corasick
DFA Deterministic finite
automata
Automat hữu hạn tiền định
NFA Nondeterministic finite
automata
Automat hữu hạn không tiền định
HB Head-Body algromith Thuật toán phân tách Head Body
H-DFA Head DFA Phần head có dạng DFA trong
thuật toán Head-Body
B-NFA Body NFA Phần body có dạng NFA trong
thuật toán Head-Body STT State transition table Bảng chuyển trạng thái
Trang 7Chương 1 - Đặt vấn đề và định hướng giải pháp
1.1 Bài toán so khớp xâu
Bài toán so khớp xâu (Multi String Matching) là bài toán xuất hiện nhiều trong các ứng dụng thực tế Giải thuật string matching kiểm tra và phát hiện sự xuất hiện của nhiều kí tự liên tiếp trong một tập dữ liệu Bên cạnh những ứng dụng nổi tiếng về cơ sở dữ liêu và xử lý văn bản, các giải thuật này chính là cơ sở trong nhiều ứng dụng thực tế khác Các giải thuật
là chìa khóa trong việc phân tích thành phần các chuỗi DNA và protein, data mining, các hệ thống bảo mật cũng như các hệ thống phát hiện xâm nhập: Intrusion Detection Systems (IDS) cho mạng (Networs IDS - NIDS), ứng dụng (Applications - APIDS), giao thức (Protocol IDS - PIDS) hay hệ thống Host (Host-based IDS - HIDS), phầm mềm diệt virus
và các vấn đề về học máy (machine learning) Tất cả các ứng dụng này đều
có đặc điểm chung là phải xử lý một lượng dữ liệu rất lớn dạng văn bản với yêu cầu rất cao về hiệu năng nhằm đưa ra kết quả tốt trong khoảng thời gian
có thể chấp nhận được Với yêu cầu đó, đã có rất nhiều thuật toán về string matching được đưa ra, một trong số các thuật toán hiệu quả nhất là Aho-corasick (AC) , đặc biệt trong việc xử lý text và các ứng dụng bảo mật Thuật toán này có những ưu điểm nổi bật là có thể tìm kiếm đồng thời sự xuất hiện của nhiều từ mẫu và có thời gian tính toán là tuyến tính tỉ lệ thuận với chiều dài của dữ liệu vào
Rất nhiều nghiên cứu đã được thực hiện với thuật toán AC, trên nhiều khía cạnh nhua trong đó có việc thực thi thuật toán trên nhiều nền tảng Các nền tảng đã sử dụng bao gồm vi mạch dùng cấu trúc mảng phần tử logic lập trình được FPGA, các hệ thống đa bộ xử lý (bxl) như Cray XMT, heterogeneous processors như Cell Broadband Engine Gần đây, các bộ xử lý đồ họa (GPU) cũng được sử dụng, đặc biệt là các bộ xử lý của NVIDIA với công nghệ CUDA hỗ trợ lập trình song song Hầu hết các phương pháp này đều tập trung vào việc cải thiện tốc độ Chỉ vài năm gần đây, các khía cạnh khác
Trang 8như sự ổn định hiệu suất, khả năng làm việc với các từ điển lớn bắt đầu được quan tâm, đặc biệt là vấn đề từ điển lớn Tuy nhiên, thuật toán AC thường chỉ cho hiệu năng tốt khi có ít sự so khớp trên đầu vào, tức là kích thước của các mẫu tìm được trên kích thước dữ liệu đầu vào là thấp Khi tỷ lệ này tăng lên, hiệu năng của thuật toán thường bị giảm nhanh chóng Điều này rất dễ gây ra các tấn công từ chối dịch vụ (DoS) trên các hệ thống bảo mật mạng có sử dụng MSM
Hơn nữa, việc hiệu suất thay đổi khi thực hiện với các dữ liệu đầu vào và từ điển có kích thước khác nhau luôn là một nhược điểm của các phương pháp dựa trên phần mềm Điều này đặc biệt đúng với các kiến trúc dựa trên bộ nhớ cache: khi phép toán tìm kiếm được thực hiện bên trong bộ nhớ cache, thuật toán sẽ thực hiện rất hiệu quả Tuy nhiên nếu việc tìm kiếm thực hiện ở bộ nhớ chính - main memory, hiệu năng của thuật toán khá thấp Điều này là dễ xảy
ra với các ứng dụng mà dữ liệu đầu vào không thể đoán trước, như các ứng dụng lọc các gói tin trên mạng, lượng dữ liệu biến thiên liên tục theo thời gian Lúc này thuật toán sẽ phải truy nhập dữ liệu từ những vị trí trong bộ nhớ chính, dẫn đến sự thay đổi về hiệu năng
Để khắc phục được các nhược điểm này, nhiều phương pháp giúp cải thiện thuật toán AC đã được đưa ra Trong đó có hai thuật toán là sử dụng bảng băm và thuật toán phân tách Head-Body
Việc sử dụng bảng băm giúp giảm kích thước dữ liệu phải xử lý do thuật toán
AC sinh ra, tuy nhiên việc hàm băm có chi phí cao và dễ xảy ra va chạm băm làm cho thuật toán này trong nhiều trường hợp không tỏ ra hiệu quả Một phương pháp mới là phân tách Head-Body sẽ tiếp cận bài toán theo hướng khác với hàm băm, vẫn giảm kích thước dữ liệu để đủ cho việc tìm kiếm có thể diễn ra trong bộ nhớ cache đồng thời hiệu năng không thay đổi nhiều trên các từ điển và các dữ liệu đầu vào khác nhau
Luận văn sẽ trình bày cơ sở lý thuyết và tập trung vào hướng tiếp cận thứ hai – Head Body Phương pháp và kỹ thuật trong hướng tiếp cận này sẽ được phân tích, so sánh và đánh giá với thuật toán AC
Với việc xây dựng bài toán MSM dựa trên phần mềm, một phương pháp cải
Trang 9thiện hiệu năng tất yếu được nghĩ tới là sử dụng nhiều máy tính cùng thực hiện bài toán
Đây chính là mục đích của tính toán song song phân cụm (Cluster), một hệ thống máy tính song song được xây dựng từ các nút tính toán và thiết bị mạng thông dụng, mỗi nút tính toán đóng vai trò điều khiển vào/ra là một hệ thống làm việc hoàn chỉnh, có khả năng làm việc độc lập
Việc thiết lập hệ thống tính toán song song phân cụm từ những máy tính có cấu trúc đơn giản, sử dụng công nghệ mạng phổ biến đã được bắt đầu từ năm
1994 với mô hình Beowulf Cluster của Thomas Sterling cùng Donal Becker Một hệ thống như vậy rẻ hơn nhiều so với một siêu máy tính cùng sức mạnh, điều này làm cho chúng phổ biến và đặc biệt phù hợp với các nước đang phát triển cũng như các trường đại học Tuy nhiên các hệ thống tính toán cluster cũng có các nhược điểm như quá trình triển khai, cấu hình hệ thống tương đối phức tạp, hệ thống hoạt động không ổn định bằng các siêu máy tính
và nhược điểm lớn nhất là chi phí truyền thông giữa các nút tính toán
Tuy nhiên, luận văn sẽ không đi sâu về phía phần cứng mà tập trung vào việc thiết kế phần mềm chạy trên các bộ xử lý đa nhân với cấu trúc như các cluster, với thư viện lập trình song song được sử dụng là Message Passing Interface-MPI
Bài toán MSM có thể được thực hiện song song bằng cách chia đoạn dữ liệu đầu vào thành tập hợp các đoạn dữ liệu nhỏ hơn dữ liệu ban đầu và được gửi đến mỗi bộ xử lý để thực hiện tìm kiếm Tuy nhiên, để có được hiệu suất tối
đa trên tất cả các bộ xử lý cần đòi hỏi những thuật toán hiệu quả trong việc cân bằng tải
Luận văn sẽ đưa ra các thuật toán song song áp dụng cho bài toán MSM và thực hiện so sánh, phân tích hiệu quả các thuật toán đó trên dữ liệu đầu vào, từ điển và số bộ xử lý khác nhau Ngoài ra, luận văn sẽ xây dựng mô hình song song cho thuật toán Head-Body để kiểm tra hiệu quả của nó trên cơ chế truyền thông điệp Về ứng dụng của bài toán, trong những năm gần đây, bài toán MSM ngày càng được quan tâm hơn do sự bùng nổ của lượng thông tin trên mạng internet và nhu cầu tìm kiếm của người dùng
Trang 10Với những nôi dung trình bày ở trên, luận văn bao gồm các phần tóm tắt như sau:
Chương 1: Đặt vấn đề và định hướng giải pháp, phần này bao gồm các cơ
sở lý thuyết và các thuật toán cho bài toán MSM
Chương 2: Cài đặt và phân tích các thuật toán cho bài toán Multi String Matching
Chương 3: Kết quả thu được từ thực nghiệm và ứng dụng của bài toán Chương 4: Kết luận và hướng phát triển của đề tài
Trang 111.2 Một số thuật tốn so khớp xâu
1.2.1 Các cách tiếp cận cơ bản
1.2.1.1 Cách tiếp cận ngây thơ
Phương pháp đầu tiên và đơn giản nhất cĩ thể nghĩ đến ngay là lần lượt xét từng vị trí i trong xâu ký tự gốc từ 1 đến n-m+1, so sánh T[i…(i+m-1)] với P[1 m] bằng cách xét từng cặp ký tự một và đưa ra kết quả tìm kiếm Người ta cịn gọi phương pháp này là cách tiếp cận ngây thơ (Nạve string search) Dưới đây là thủ tục đặc tả của phương pháp này :
9 return false // khơng cĩ vị trí nào thỏa mãn
Dễ thấy độ phức tạp trung bình của thuật tốn là O(n+m), nhưng trong trường hợp tồi nhất độ phức tạp là O(n.m), ví dụ như tìm kiếm mẫu “”aaaab” trong xâu “aaaaaaaaab”
1.2.1.2 Thuật tốn Rabin-Karp
Tư tưởng chính của phương pháp này là sử dụng phương pháp băm (hashing) Tức là mỗi một xâu sẽ được gán với một giá trị của hàm băm (hash function), ví dụ xâu “hello” được gán với giá trị 5, và hai xâu được gọi là bằng nhau nếu giá trị băm của nĩ bằng nhau Như vậy thay vì việc phải đối sánh các xâu con của T với mẫu P, ta chỉ cần so sánh giá trị hàm băm của chúng và đưa
ra kết luận
Đặc tả chúng thuật tốn như sau :
Trang 121 function Rabin_Karp(string T[1 n], string P[1 m])
2 hsub := hash(P[1 m]) // giá trị băm của xâu P
3 hs := hash(T[1 m]) // giá trị băm của xâu T
4 for i from 1 to n-m+1
5 if hs = hsub
6 if T[i i+m-1] = P
7 return i
8 hs := hash(T[i+1 i+m]) // giá trị băm của xâu T[i+1 i+m]
9 return not found
Vấn đề đặt ra ở đây là khi có quá nhiều xâu sẽ tồn tại các trường hợp các xâu khác nhau có giá trị băm giống nhau, do đó khi tìm thấy hai xâu có giá trị băm giống nhau vẫn phải kiểm tra lại xem chúng có thực sự bằng nhau hay không (dòng 6), may mắn là trường hợp này rất ít xảy ra với một hàm băm thiết kế đủ tốt
Phân tích thuật toán ta thấy : dòng 2,3,6,8 có độ phức tạp là O(m), nhưng dòng 2,3 chỉ thực hiện duy nhất một lần, dòng 6 chỉ thực hiện khi giá trị băm bằng nhau (rất ít), chủ yếu là dòng số 8 sẽ quyết định độ phức tạp của thuật toán Bởi khi tính giá trị băm cho T[i+1 i+m] ta mất thời gian là O(m), công việc này được thực hiện trong n-m+1 lần như vậy độ phức tạp không hơn gì so với phương pháp ở phần 2
Như vậy ta phải tính lại giá trị hs trong thời gian hằng số (constant time), cách giải quyết ở đây là tính giá trị băm của T[i+1 i+m] dựa vào giá trị băm của T[i i+m-1] bằng cách sử dụng cách băm tròn (rolling hash, là cách băm mà giá trị đầu vào được băm với một kích thước cửa số cổ định trượt trên độ dài của giá trị cần băm) Cụ thể trong bài toán này, ta sử dụng công thức sau để tính giá trị băm tiếp theo trong một khoảng thời gian hằng số :
hash(T[i+1…i+m]) = hash(T[i+1…i+m-1]) – ASCII(T[i]) + ASCII (T[i+m]), trong đó ASCII(i) là mã ASCII của ký tự i
Như vậy trong trường hợp này độ phức tạp chỉ còn là O(n) Đó là một cách băm đơn giản, dưới đây sẽ trình bày một hàm băm phức tạp và tốt hơn cho các trường hợp dữ liệu lớn Đó là sử dụng các số nguyên tố lớn
Trang 13Ví dụ như xâu “hi” băm bằng số nguyên tố 101 sẽ có giá trị băm là 104 × 1011 + 105 × 1010 = 10609 (ASCII của ký tự 'h' là 104 và của ký tự 'í là 105)
Thêm nữa, ta có thể tính giá trị băm của một xâu con dựa vào các xâu con trước nó, ví dụ như ta có xâu "abracadabra", ta cần tìm một mẫu tìm kiếm có
độ dài là 3 Ta có thể tính giá trị băm của xâu “bra” dựa vào giá trị băm của xâu “abr” (xâu con trước nó) bằng cách lấy giá trị băm của “abr” trừ đi giá trị băm của ký tự „a‟ đầu tiên (ví dụ như 97 × 1012 (97 là giá trị ASCII của ký tự 'á và 101 là số nguyên tố đang sử dụng) và cộng thêm giá trị băm cảu ký tự „a‟ cuối cùng trong xâu “bra” (ví dụ như 97 × 1010 = 97)
1.2.1.3 Thuật toán Knuth-Morris-Pratt
Ý tưởng chính của phương pháp này như sau: trong quá trình tìm kiếm vị trí của mẫu P trong xâu gốc T, nếu tìm thấy một vị trí sai ta chuyển sang vị trí tìm kiếm tiếp theo và quá trình tìm kiếm sau này sẽ được tận dụng thông tin từ quá trình tìm kiếm trước để không phải xét các trường hợp không cần thiết
Ví dụ : tìm mẫu P = “ABCDABD” trong xâu T = “ABC ABCDAB ABCDABCDABDE” giả sử m và i là chỉ số chạy thuật toán tương ứng đối với xâu T và P Ta lần lượt có các bước của thuật toán như sau :
+ Đầu tiên, m=0, i=0
m: 01234567890123456789012
T: ABC ABCDAB ABCDABCDABDE
P: ABCDABD
i: 0123456
Ta thấy m=3 và i=3 xâu T và mẫu P không khớp nhau (T[3] = space, P[3] =
„D‟), nên sẽ dừng so sánh và bắt đầu lại với m=1 Ta chú ý là ký tự đầu tiên của P là „A‟ không xuất hiện trong T từ vị trí 0 đến 3 nên ta chuyển đến xét m=4
+ m=4, i=0
m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
Trang 14i: 0123456
Tại m=10, i=6 xâu T và mẫu P không khớp nhau (T[10] = space, P[6] = „D‟)
Ta lại thấy chuỗi “AB” trong mẫu P không xuất hiện trong T từ vị trí 5 đến vị trí 7, nên ta chuyển sang m=8
Ta tìm được kết quả mẫu P xuất hiện trong xâu T ở vị trí 15
Như vậy qua ví dụ ta thấy vấn đề chủ yếu ở đây là tìm vị trí tiếp theo để kiểm tra sau khi bắt gặp một vị trí sai Ta hãy xem cách giải quyết của KMP
Bây giờ ta giả sử có bảng đối sánh thành phần (partial match table) chỉ cho ta biết điểm xuất phát tiếp theo khi gặp một ví trí đối sánh sai (mismatch) F[1 m] trong đó giá trị F[i] là tổng số ký tự ta lùi lại để xét tiếp trên xâu T sau khi gặp một vị trí sai trong khi đang xét đến ký tự thứ i trong xâu mẫu tìm kiếm Tức là nếu ở vị trí m mà T[m+i] khác P[i] thì ta sẽ xét tiếp vị trí m+i-F[i] trên xâu T
Có hai ưu điểm ở đây : thứ nhất là F[0]=-1 tức là nếu P[0] là vị trí sai thì ta sẽ chuyển ngay đến ký tự tiếp theo, thứ hai là mặc dù ta quay lại vị trí m+i-F[i] là
Trang 15vị trí kiểm tra tiếp theo nhưng thực sự ta chỉ cần đối sánh mẫu từ vị trí P[F[i]] Chi tiết về xây dựng bảng này sẽ được đề cập đến ở phần cuối của mục này
Cụ thể với bảng trên, lược đồ thuật toán KMP như sau :
1 Bắt đầu với i = m = 0; giả sử P có n ký tự và T có k ký tự
2 If m + i = k then
- Thoát, không có trường hợp nào thỏa mãn Else
- So sánh P[i] với T[m + i]:
- If (bằng nhau) then i ← i+1 If i = n then ta tìm được xâu con của T thỏa mãn bắt đầu từ vị trí m;
- If (không bằng nhau), gán e = T[i] m=m+i-e, if i > 0, gán i = e
Tùy từng trường hợp mà bộ chữ này là khác nhau Đối với bài toán tìm kiếm từ trên đoạn văn bản, bộ chữ là bảng mã ASCII với 256 kí tự, nhưng đối với bài toán tìm kiếm mà mẫu là các chuỗi bit (như bài toán kiểm tra file xem có chứa mã độc hay không) thì bộ chữ này chỉ bao gồm các bit 0 và 1
Gọi từ điển K = { y1, y2, y3, …., y4 } là tập hợp hữu hạn các từ mẫu Gọi x là một xâu đầu vào Yêu cầu của bài toán là xác định tất cả các từ mẫu trong K mà
là xâu con của x kèm theo vị trí của xâu con đó trong x Các từ mẫu này có thể chồng lên nhau, tức là một từ mẫu A mà là tiền tố của từ mẫu B thì sự xuất hiện của từ mẫu B phải tính cả sự xuất hiện của A
Mô hình tìm kiếm này sẽ được biểu diễn bởi một tập hợp các trạng thái được đánh chỉ số Mô hình sẽ xử lý đầu vào x bằng cách thực hiện việc đọc từng kí tự của x và dựa vào kí tự này để thực hiện việc chuyển trạng thái thông qua hàm dịch chuyển, nếu gặp trạng thái phù hợp sẽ đưa ra output của trạng thái đó
Trang 16Một mô hình tìm kiếm như vậy được mô tả bởi ba hàm :
(c).Output function
Hình 1 Các hàm goto, failure, output sinh ra từ thuật toán AC
Với hàm goto được biểu diễn bởi cây như hình a, có một trạng thái được gọi là trạng thái bắt đầu, thường được kí hiệu là 0 Các trạng thái còn lại lần lượt là
1, 2, … , 7 Để định nghĩa một cách hình thức cho hàm goto, ta có thể coi hàm này là tập hợp các cặp, mỗi một cặp bao gồm một trạng thái và một kí
Trang 17tự đầu vào hoặc một trạng thái và một thông điệp “fail”
Ví dụ, như hình (a) thì với cạnh có nhãn h đi từ đỉnh 0 đến đỉnh 1 thì hàm goto tương ứng là :g(0, h) = 1
Ví dụ với state 1 thì ngoài 2 kí tự là e và h được biểu diễn trên hình,các kí tự còn lại là tập các kí tự fail với state 1 và được biểu diễn g(1, σ) = fail với σ là tập tất cả các kí tự trong bảng chữ trừ h và e
Riêng đối với trạng thái 0, ngoài các kí tự để trạng thái 0 chuyển sang trạng thái khác, tất cả các kí tự còn lại đều thuộc hàm goto mà trạng thái chuyển đến chính là trạng thái 0 Tính chất này nhằm đảm bảo cho bất kì kí
tự nào trong xâu đầu vào cũng được xử lý
Hàm failure cũng là hàm chuyển trạng thái Hàm này được xây dựng khi hàm goto trả lại thông điệp fail
Một số trạng thái được chỉ định là trạng thái output, tức là trạng thái mà sẽ cho ra một số từ mẫu trong từ điển K nếu nó được thăm Hàm output sẽ kết hợp mỗi trạng thái với một tập từ mẫu Tập từ mẫu này có thể rỗng để thể hiện trạng thái đó không có output Ví dụ với đồ thị ở trên, khi xâu đầu vào đi đến trạng thái 7 thì tức là các kí tự đầu vào trước đó là t, h, e, Do đó output của 7
là xâu “the” output(7) = “the”
Ngoài 3 trạng thái có output như ở bảng (c) – Hình 1 - thì các trạng thái còn lại đều có hàm output là rỗng Một chu trình trên thuật toán AC sẽ được thực hiện như sau:
Gọi s là trạng thái hiện tại của mô hình và a là kí tự hiện tại đang được xử lý của xâu đầu vào x Khởi tạo, trạng thái hiện tại là trạng thái 0 và kí hiệu hiện tại là kí hiệu đầu tiên của x
1 Nếu g(s, a) = s‟ thì AC sẽ thực hiện một hàm dịch chuyển Lúc này s‟ trở thành trạng thái hiện tại và kí tự sau a trong xâu x sẽ là kí tự được xử lý Sau đó, chúng ta sẽ thực hiện kiểm tra output(s‟) Nếu output(s‟) khác rỗng thì chúng ta sẽ có được tập các từ mẫu xuất hiện trong x là kết quả của hàm output(s‟) và vị trí xuất hiện từ mẫu chính là vị trí của kí tự đầu vào trừ đi chiều dài từ mẫu Một chu trình được hoàn thành
2 Nếu g(s,a) = fail, mô hình sẽ gọi đến hàm failure và thực hiện quá
Trang 18trình chuyển trạng thái failure Nếu f(s) = s‟ thì lúc này ta coi s‟ như trạng thái hiện tại và a là kí tự đang được xử lý và quay trở lại bước 1
Ví dụ : Với xâu đầu vào x=”there”
Quá trình thực hiện của mô hình tìm kiếm:
x tương ứng với hàm output(7) là {the}
Với trạng thái hiện tại là 7, kí tự được xử lý là r Vì g(7,r)=fail nên mô hình
sẽ gọi đến hàm failure Hàm failure được gọi sẽ cho kết quả f(7) = 2 và vì g(2,r)
= 3 nên 3 sẽ là trạng thái hiện tại và kí tự tiếp theo trong xâu là r được chọn để làm kí tự xử lý
Tương tự, output(3) khác rỗng và cho ta kết quả là {her} Ta có từ mẫu thứ 2 tìm được là: “her” Tiếp đó, g(3.r)=4 nên ta có 4 là trang thái tiếp theo được xử lý, output(4) khác rỗng, cho ra kết quả là các từ mẫu {her,here} Kết thúc quá trình là g(4,r)=fail
Trang 191.2.3 Phương pháp phân tách Head-Body
1.2.3.1 Tổng quan về phương pháp phân tách Head – Body (HB)
Bài toán MSM có thể được giải quyết hiệu quả bởi thuật toán corasick sử dụng DFA khi không gian tương đối nhỏ, tức là số trạng thái sinh ra bởi AC-DFA là không nhiều Khi làm việc trên các không gian lớn, việc tìm kiếm trạng thái tiếp theo của hàm δ(s,a) có thể sử dụng bảng băm để tạo ra bảng chỉ chứa các trạng thái dịch chuyển hợp lệ
Aho-Với cả hai phương pháp sử dụng bảng đầy đủ hay sử dụng bảng băm của bảng dịch chuyển trạng thái (STT) trên các từ điển lớn thì đều gặp khó khăn trên các hệ thống/thiết bị có bộ nhớ nhỏ (như các mạch phần cứng)
1) Nếu sử dụng một bảng STT đầy đủ, kích thước của bảng này có thể trở lên rất lớn và khó khăn trong việc thực hiện thuật toán trên bộ nhớ nhỏ Giả sử ta sử dụng một bảng chữ ASCII với 256 kí tự thì với mỗi một trạng thái sẽ có 256 trạng thái chuyển đổi tương ứng
Nếu mỗi trạng thái được biểu diễn bởi 4byte thì 256 trạng thái chuyển đổi sẽ cần một bộ nhớ 256 x 4=1k bytes
Như vậy với một bộ nhớ cache 10MB sẽ chỉ lưu trữ được 10.000 state Trong khi một MSM với hàng chục ngàn mẫu có thể sinh ra tới trăm ngàn trạng thái 2) Nếu chúng ta sử dụng bảng băm, mỗi lần truy nhập STT yêu cầu một lượng thời gian nhất định để băm Giả sử mất 30 chu kì CPU để tính toán địa chỉ băm, 3 chu kì để phát hiện xung đột băm và 12 chu kì để so sánh các nhãn chuyển tiếp và thiết lập các biến trạng thái tiếp theo Trên một bộ nhớ 2.6GHz, hiệu suất tốt nhất có thể bị giới hạn bởi 2600/(30+15)=58MBytes/sec (chưa tính trường hợp va chạm băm hoặc cache miss)
Ngược lại, sử dụng môt bảng STT không băm sẽ chỉ mất 2600/12 ~ 217 Mb/giây Một yếu tố quan trọng khác ảnh hưởng đến hiệu năng của thuật toán AC là tỉ lệ so khớp-match ratio, là tỉ lệ giữa kích thước các từ mẫu tìm được trên toàn bộ kích thước dữ liệu đầu vào Tỉ lệ này tỉ lệ nghịch với hiệu năng của thuật toán Điều này được biểu diễn thông qua đồ thị sau với hiệu năng được tính bằng số dự liệu xử lý được trên 1 giây:
Trang 20Hình 2 Ảnh hưởng tỉ lệ so khớp tới hiệu năng của thuật toán [6]
Thuật toán Head Body (HB) được xây dựng để khắc phục hạn chế của hai phương pháp này Với phương pháp HB, chúng ta sẽ chia AC-DFA thành hai phần: một phần nhỏ “head” xử lý dữ liệu đầu vào để tìm các từ có khả năng
Ngoài ra, việc tách automat thành hai phần riêng biệt giúp thuật toán Head- Body có nhiều thuận lợi để song song hóa Thay vì phải thực hiện lần lượt phần head sau đó đến body, mỗi bxl có thể thực hiện riêng một phần và trao đổi phần xâu khả năng làm từ mẫu với nhau
Trang 211.2.3.2 Xây dựng H-DFA và B-NFA
Thuật toán phân chia head-body bao gồm việc xây dựng head DFA DFA) và body NFA (B-NFA) từ một AC-DFA
(H-a Xây dựng H-DFA
Gọi S là từ điển dùng để xây dựng AC-DFA, P được gọi là một compatible prefixs của S nếu P là tập hợp các xâu tiền tố của các từ mẫu trong S và trong các xâu thuộc P, không có xâu nào vừa là tiền tố thực sự của một xâu trong S, vừa là hậu tố thực sự của một xâu khác trong P
Ở đây, tiền tố thực sự và hậu tố thực sự là tiền tố và hậu tố mà có chiều dài nhỏ hơn xâu ban đầu (một xâu có thể được coi là tiền tố hoặc hậu tố của chính nó)
Với Prefix(s, i) là xâu tiền tố của từ mẫu s có chiều dài i và Prefix(s, *) và Suffix(s, *) là tập hợp các xâu tiền tố và hậu tố có chiều dài bất kỳ của từ mẫu s
Một phương pháp để xây dựng một tập xâu tiền tố từ một từ điển S thỏa mãn yêu cầu trên được thực hiện như sau:
1 Khởi tạo một tập rỗng P, xác định một số lH làm chiều dài xâu tiền tố
2 Với mỗi xâu s thuộc tập từ điển S
a) Nếu chiều dài của s ≤ lH thì thêm chính s vào P
b) Nếu chiều dài của s > lH thì thêm Prefix(s, lH) vào P
P là tập xâu tiền tố của S thỏa mãn định nghĩa hình thức trên vì rõ ràng P là tập hợp các xâu tiền tố của các từ mẫu trong S Các xâu tiền tố thực sự có chiều dài đúng bằng lH vì nếu nhỏ hơn lH thì xâu tiền tố chính là từ mẫu Do
đó các xâu tiền tố này không thể là hậu tố thực sự của nhau
Sau khi tìm được P, H-DFA có thể được xây dựng bằng thuật toán AC-DFA trên các từ trong P
Định Nghĩa: Với một tập S được biểu diễn bởi một AC-DFA gồm 8 phần
(Q, Σ, q0, δ,M, λ, g, f ) thì H-DFA có 6 phần (QH, Σ, q0, δH, MH, QR) trong đó:
Trang 22- Bảng chữ Σ giống như AC-DFA
- Trạng thái bắt đầu q0 như AC-DFA
- Một tập hợp hữu hạn các trạng thái QH là tập con của Q, tức là với mọi qa thuộc QH, qb thuộc đường dẫn ngắn nhất từ q0 đến qa thì qb cũng thuộc QH
- Một hàm dịch chuyển trạng thái δH : QH x Σ => QH
- Một tập hợp các trạng thái kết thúc MH = {QH ∩ M}
- Một tập hợp các trạng thái body-root QR là tập con của {QH\q0} thỏa mãn: Với g(q,*) là tập hợp tất cả các trạng thái được sinh ra từ hàm goto của trạng thái q
b Xây dựng B-NFA
Gọi T là tập hợp các xâu hậu tố của S tương ứng với P nếu việc ghép mỗi xâu trong P với một xâu trong T sinh ra từ điển S Định nghĩa hình thức cho tập T: Ở đây, biểu thức p.t là ghép nối hai xâu p và t
Việc xây dựng B-NFA là sự mở rộng từ tập hợp các body-root của H-DFA Mỗi một body-root trở thành gốc của một cây trong tập hợp các cây B-NFA B-NFA lúc này được xây dựng như xây dựng hàm goto của thuật toán Aho-corasick
Mô tả hình thức B-NFA :
Với một AC-DFA (Q, Σ, q0, δ, M, λ, g, f ) và một H-DFA (QH, Σ, q0, δH,MH,QR) Thành phần B-NFA tương ứng gồm 5 phần (QB, QR, Σ, gB, MB) được mô tả như sau :
- Bảng chữ Σ như AC-DFA
- Tập hợp các body-root QR như H-DFA
- Một tập hợp các trạng thái QB = {Q\QH} ∪ QR
- Một hàm goto gB: QB x Σ → { QB\ QR} và ∀ q ∈ QB , c ∈ Σ thì gB ( q, c) = q' ⇒ g (q, c) = q'
- Một tập hợp trạng thái kết thúc MB = {M\MH}
B-NFA xây dựng như trên bao gồm một số các cây body-tree, đầu của mỗi cây này là một body-root thuộc QR Mỗi trạng thái được mô tả bởi một nút
Trang 23goto
c Thực hiện tìm kiếm trên H-DFA và B-NFA
H-DFA nhận dữ liệu đầu vào, bắt đầu từ trạng thái q0 và thực hiện các hàm dịch chuyển trạng thái giống như với thuật toán AC-DFA Khi đến được một body- root, body-root và vị trí đầu vào sẽ được lưu lại và gửi tới B-NFA
để tìm kiếm ở phần body Bắt đầu từ body-root, B-NFA sẽ thực hiện tìm kiếm phần xâu còn lại qua một loạt các trạng thái bằng hàm goto.Việc tìm kiếm trên phần body sẽ kết thúc khi kí tự đầu vào không khớp với nhãn chuyển tiếp Cùng lúc với tìm kiếm phần body, H-DFA sẽ tiếp tục xử lý xâu đầu vào để tạo ra các tìm kiếm trên các B-NFA với body-root khác
Bất kỳ sự tìm kiếm nào xảy ra thành công trong cả H-DFA và B-NFA đều được ghi lại và coi như là tìm thấy một từ mẫu
Một ví dụ minh họa về phương pháp phân tách Head-Body:
Ta có một từ điển S={aril, act, account, interact, illustrate, ill, counting, counter, coincide} với bảng chữ là các chữ cái tiếng anh
Thuật toán AC-DFA được xây dựng như trên hình 4 Để tránh phức tạp, các hàm dịch chuyển quay trở lại các nút có chiều sâu 0 và 1 được loại bỏ (rất nhiều), các đường mũi tên màu xám không ghi kí tự vì nó cùng kí tự với các hàm mũi tên màu đen có cùng trạng thái đích AC-DFA ở trên được chia thành 2 phần head và body
Phần head bao gồm tập hợp các xâu tiền tố của S là P = {aril, act, acco, inte, illu, ill, coun, coun, coin}
Trang 24Hình 3: Automat AC-DFA cho từ điển S [6]
Hình 4: H-DFA và B-NFA cho từ điển S [6]
Trang 25Ở đây, ta chọn chiều dài xâu tiền tố là 4 Với những từ có nhỏ hơn 4 kí tự,bản thân từ này sẽ được đưa vào trong P Kết quả ta được H-DFA được tạo ra như hình vẽ (bên trái)
Các body-root được tô màu vàng và đi kèm theo sau là các body NFA tương ứng với body-root này Các phần body sẽ được xây dựng bằng cách mở rộng các body-root để thực hiện tiếp việc so khớp với phần suffix còn lại.Với chú
ý rằng chỉ có ánh xạ 1-1 từ body-root trong phần head tới một body-tree trong phần body
Việc tìm kiếm được bắt đầu ở phần head và được thực hiện như với một DFA thông thường
Giả sử xâu đầu vào là “accountillustrate”.Các trạng thái trong phần head sẽ là:
0-a-2-c-7-c-11-o-19-u-9-n-21-t-0-i-1-l-4-l-15-u-17-s-0 -a-2-t-0-e-0
Ở đây có 3 body-root đến được là 19,21 và 17 tương ứng với 3 body tree như hình vẽ Hai từ “account” và “illustrate” sẽ được so khớp trong phần body, trong khi từ “ill” sẽ được so khớp trong phần head
Sẽ không có bất kỳ một hàm chuyển nào đi từ B-NFA quay trở lại H-DFA hoặc hàm chuyển nào đi từ trạng thái của cây này đến cây khác
Tính chất “hướng về trước ” (foward-only) này làm giảm số lượng các bước dịch chuyển trong B-NFA
Như vậy, ưu điểm chính của phương pháp head-body này là giảm từ AC-DFA xuống một H-DFA đủ nhỏ để chứa trong bộ nhớ có thể truy cập nhanh như cache và một cấu trúc đơn giản các body-tree dễ dàng trong việc xử lý và lưu trữ hiệu quả
Trang 261.2.4 Thực hiện bài toán so khớp xâu trong môi trường
song song
1.2.4.1 Ý tưởng của phương pháp song song Master Slave
Để nâng cao tốc độ cho bài toán MSM, một ý tưởng tất yếu là thực thi bài toán trong môi trường song song Với dung lượng lưu trữ dường như không giới hạn và dễ dàng nâng cấp, dung lượng của dữ liệu không phải là vấn đề với hệ thống này, trong khi điều này là một thách thức với các hệ thống phần cứng như mạch FPGA hoặc GPU Tốc độ của việc song song hóa cũng dễ dàng được nâng cao khi chúng ta tăng số bộ xử lý hoặc số máy tính thực hiện lên Đặc biệt với sự xuất hiện của các bộ xử lý đa nhân, ta cũng có thể song song hóa bài toán ngay trên một máy tính Sau khi tìm hiểu các thuật toán cho bài toán MSM trong môi trường tuần tự, chúng ta sẽ tiến hành cải thiện hiệu năng trong môi trường song song trên các bộ xử lý(bxl) đa nhân Ý tưởng cơ bản của thuật toán là chia đoạn text thành các text nhỏ và phân phối mỗi text cho một bộ xử lý (bxl), mỗi bxl thực hiện việc tìm kiếm tuần tự trên cùng một AC-DFA nếu sử dụng thuật toán Aho-corasick hoặc cùng một H-DFA và B-NFA nếu sử dụng thuật toán Head-Body Tuy nhiên, hiệu năng trên mỗi đoạn subtext phụ thuộc nhiều vào số các từ mẫu tìm được Mỗi lần tìm kiếm được
từ mẫu, chương trình phải mất thời gian xử lý như kiểm tra trạng thái và ghi ra tệp tin Do vậy nếu số lượng từ mẫu tìm được ở mỗi bxl chênh lệch nhau nhiều thì có thể gây mất cân bằng về chi phí tính toán, ảnh hưởng đến hiệu năng của thuật toán song song
Với kiến trúc phân tán bộ nhớ, chúng ta có thể sử dụng một cơ chế để cân bằng tải giữa các bxl bằng MPI Chúng ta sẽ phát triển một cơ chế Master-Slave, trong đó master sẽ chịu trách nhiệm phân bổ text nhỏ còn slave sẽ chịu trách nhiệm tính toán Mỗi slave sẽ tương ứng với một nhân trong bộ xử lý hoặc một máy tính độc lập và thực hiện việc tìm kiếm Việc tính toán và xây dựng các automat được phía master thực hiện, sau khi tính toán xong, các automat sẽ được gửi đến các slave
Trang 27Sau đó phía Master sẽ chia các đoạn text thành các khối có kích thước cố định gửi đến slave, số các khối này có kích thước đủ nhỏ để đảm bảo sự cân bằng
về số lượng từ mẫu tìm được giữa các slave Vì số lượng các khối có thể vượt quá số slave nên mỗi khi một slave thực hiện xong, nó sẽ thông báo cho master biết để master tiếp tục phân phối các khối dữ liệu tiếp theo Hơn nữa, ngay cả khi việc tính toán trên mỗi slave được tối ưu thì thời gian truyền khối
dữ liệu giữa master/slave cũng có thể gây giảm hiệu năng Vì vậy một phương pháp để giảm thời gian tính là việc tính toán và truyền dữ liệu được gối lên nhau, điều này có thể được thực hiện với cơ chế gửi nhận non blocking trong MPI
Trong giai đoạn master tính toán automat và gửi đến các slave, việc sử dụng các automat có kích thước nhỏ như thuật toán Head-Body sẽ giúp giảm thời gian truyền thông, thuận lợi trong các hệ thống mà số lượng từ mẫu thay đổi nhiều và thường xuyên Ở đây chúng ta không thực hiện tính toán automat cùng lúc trên cả master và slave vì điều này gây tốn tài nguyên mà không cải thiện được hiệu năng tính toán, đồng thời cũng khó khăn trong việc thay đổi, cập nhật từ mẫu
1.2.4.2 Thuật toán song song cho bài toán song song MSM
Một thuật toán song song cụ thể cho bài toán MSM bao gồm hai phần chính: chiến lược cân bằng tải động và chiến lược phân bổ dữ liệu Trong chiến lược cân bằng tải động, đoạn text đầu vào được chia thành các subtext và các subtext này được gửi tới những slave mà đang ở chế độ nghỉ, mục đích là để cho tất cả các slave đều xử lý và thời gian tính giữa các slave không quá chênh lệch Vì việc gán subtext cho các slave này không phải là cố định
mà tùy thuộc vào các tình trạng hiện tại của các slave nên được gọi là cân bằng tải động
Kích cỡ của subtext được gửi tới mỗi slave là sb+m-1 trong đó sb là kích thước subtext được chọn trước và m-1 số kí tự gối chồng giữa các subtext Tham số m dùng để chỉ chiều dài lớn nhất của từ mẫu, mục đích để tránh bị mất các từ mẫu mà nằm giữa hai đoạn subtext Kích cỡ sb là một tham số
Trang 28quan trọng ảnh hưởng tới hiệu năng của thuật toán,liên quan nhiều đến I/O và các thành phần truyền dữ liệu Về cơ chế phân bổ dữ liệu giữa master và slave, ta có thể thực hiện theo hai phương pháp : phân bổ theo subtext và phân
bổ theo text pointer
a Phân bổ theo subtext
Giả sử số các slave là p và được xác định bởi chỉ số id từ 1 tới p Bên trong master sẽ chứa tất cả các khối được chia ra từ đoạn text Thuật toán sẽ được chia ra làm hai phần: Thuật toán thực hiện trên master và thuật toán thực hiện trên slave
Phía master sẽ thực hiện việc tính toán để xây dựng các H-DFA và B-NFA hoặc AC-DFA, sau đó nó sẽ broadcast các automat này tới các slave Giai đoạn này trên master sẽ kết thúc khi không còn bất kì một slave nào chưa nhận được automat Tuy nhiên để biết được việc phân bổ đã hoàn thành, số lượng các slave nhận được automat phải đếm được ở master, điều này được thực hiện bằng cách đếm số các kết quả slave đã nhận được trả về Việc thực hiện tính toán automat chỉ trên một máy master mà không thực hiện đồng thời trên tất cả slave vì nhiều lý do:
- Dễ dàng cho việc thay đổi và sửa lỗi, khi chúng ta thêm các từ mẫu vào file pattern thì chúng ta chỉ cần tính toán trên một máy và thông báo cho các máy khác sự thay đổi Ngược lại, chúng ta phải gửi các pattern mới tới các máy và tất cả đều cùng tính toán lại
- Khi các máy cùng thực hiện công việc giống nhau, thời gian tính không được giảm bớt mà gây ra hao phí tài nguyên Do vậy ta chỉ cần một máy để tính toán, các máy còn lại có thể thực hiện các công việc khác (mặc dù phải mất thêm thời gian truyền kết quả)
Master sau đó sẽ thực hiện phân bổ các subtext Các slave sau khi nhận subtext sẽ thực hiện việc so khớp tuần tự bằng thuật toán HB hoặc AC Sau khi quá trình so khớp được thực hiện xong, slave này sẽ gửi thông báo tới master để master gửi tiếp các subtext khác Quá trình này sẽ kết thúc khi tất cả slave gửi thông báo đã thực hiện xong nhưng tất cả các subtext đã được xử lý, lúc này master sẽ gửi thông báo kết thúc tới các slave
Trang 29Các bước thực hiện đều tương tự với subtext, tuy nhiên thay vì master gửi tới slave các subtext, nó sẽ chỉ gửi con trỏ trỏ đến vị trí hiện tại trong đoạn text đang xét Khi nhận được vị trí này, các slave sẽ đến đọc file text của master qua các dịch vụ chia sẻ file trong NFS, sau đó lấy ra subtext bắt đầu từ vị trí mình nhận được
Luận văn sẽ tập trung vào phương pháp phân bổ theo subtext vì trong môi trường bxl đa nhân, việc truyền thông qua cơ chế NFS của master và slave không
có sự khác biệt rõ ràng về tốc độ với truyền thông trong MPI
Ngoài ra, với việc các automat H-DFA và B-NFA có thể thực hiện tìm kiếm cùng lúc, chúng ta sẽ tiến hành xây dựng thử nghiệm thuật toán song song cho Head-Body trên môi trường MPI (Chương 2 tiếp sau đây)
Trang 30Chương 2 - Cài đặt và phân tích các thuật toán cho bài toán so khớp xâu
Ngôn ngữ và môi trường cài đặt
Chương trình được xây dựng trên ngôn ngữ C++ và biên dịch bằng gcc 4.2 trên môi trường Linux Thuật toán song song được thực hiện trên bxl 4 nhân core i3 sử dụng mpich 2.0 Các kết quả tính toán được thực hiện trên tập từ điển tiếng anh với dữ liệu đầu vào là các file text với match ratio khác nhau
2.1 Phân tích, cài đặt và đánh giá thuật toán tuần tự
2.1.1 Phân tích phương pháp Aho-corasick
2.1.1.1 Phân tích thuật toán Aho-corasick
Theo chương 1, chúng ta có 2 phương pháp để xây dựng thuật toán AC là xây dựng từ ba hàm goto, failure và output hoặc xây dựng từ một DFA Ở cả 2 phương pháp, phép toán cơ bản là phép so sánh giữa kí tự đầu vào với nhãn trên cạnh nối giữa hai trạng thái Vì vậy thời gian tính của thuật toán AC phụ thuộc vào số lần dịch chuyển trạng thái
Với thuật toán tạo bởi ba hàm, số trạng thái cần dịch chuyển trong quá trình tìm kiếm là độc lập với số từ mẫu
Định lý 1 Thuật toán AC sử dụng các hàm goto, failure có ít hơn 2n bước dịch
chuyển trạng thái với n là chiều dài xâu đầu vào [2]
Trong mỗi một chu trình của thuật toán tìm kiếm, có thể không có hoặc có nhiều dịch chuyển failure được tạo ra Giả sử trạng thái hiện tại s có chiều sâu d, khi
đó số lần dịch chuyển goto để đến được trạng thái là không nhỏ hơn d (theo định nghĩa chiều sâu) trong khi đó số lần dịch chuyển hàm failure không quá d lần (dịch nhiều nhất là đến độ sâu 0) Chính vì vậy số lần dịch chuyển failure phải không lớn hơn số lần dịch chuyển goto Mà trong việc xử lý một xâu có chiều dài n thì cần n dịch chuyển goto Vì vậy tổng số lần dịch chuyển (bao gồm
cả goto và failure) luôn không lớn hơn 2n