Phức tạp của thuật toán KMP

Một phần của tài liệu nghiên cứu thuật toán knuth-morris-pratt và ứng dụng (Trang 47 - 48)

Do độ phức tạp của hai phần trong thuật toán lần lƣợt là O(k) và O(n), nên độ phức tạp của cả thuật toán là O(n + k).

Nhƣ đã thấy trong ví dụ ở trên, thuật toán mạnh hơn các thuật toán so khớp chuỗi kém hơn vì nó có thể bỏ qua các kí tự đã duyệt. Ít ô phải quay trở lại hơn, thuật toán sẽ nhanh hơn, và đƣợc thể hiện trong bảng T bởi sự hiện diện của các số không. Một từ nhƣ "ABCDEFG" sẽ làm tốt với thuật toán này vì nó không có sự lặp lại của những chữ bắt đầu, vì vậy mảng đơn giản chỉ toàn số không với -1 ở đầu. Ngƣợc lại, với từ W = "AAAAAAA" nó hoạt động tồi tệ, bởi vì bảng sẽ là:

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

i 0 1 2 3 4 5 6

W[i] A A A A A A A

T[i] -1 0 1 2 3 4 5

Đây là mẫu xấu nhất cho mảng T, và nó có thể dùng để so sánh với đoạn nhƣ S = "AAAAAABAAAAAABAAAAAAA", trong trƣờng hợp này thuật toán sẽ cố gắng ghép tất cả các chữ 'A' với 'B' trƣớc khi dừng lại; kết quả là số lƣợng tối đa câu lệnh đƣợc sử dụng, tiến tới trên hai lần số kí tự của xâu S khi số lần lặp của "AAAAAAB" tăng. Mặc dù quá trình xây dựng bảng rất nhanh so với chữ này (nhƣng vô tác dụng), quá trình này chạy có một lần với chữ W, trong khi quá trình tìm kiếm chạy rất nhiều lần. Nếu với mỗi lần, từ W đƣợc dùng để tìm trên xâu nhƣ xâu S, độ phức tạp tổng thể sẽ rất lớn. Bằng cách so sách, sự kết hợp này là trƣờng hợp tốt nhất với thuật toán so khớp chuỗi Boyer- Moore.

Một phần của tài liệu nghiên cứu thuật toán knuth-morris-pratt và ứng dụng (Trang 47 - 48)