Tiểu luận môn phân tích và đánh giá thuật toán bài toán đối sánh mẫu thuật toán boyer moore

18 338 1
Tiểu luận môn phân tích và đánh giá thuật toán bài toán đối sánh mẫu thuật toán boyer   moore

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

KHOA CÔNG NGHỆ THÔNG TIN ****** ***** BÁO CÁO BÀI TẬP LỚN MÔN HỌC PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN Đề bài: Bài toán đối sánh mẫu Thuật toán Boyer - Moore Giáo viên hướng dẫn : PGS.TS Đào Thanh Tĩnh Học viên thực : Bùi Thị Thao Lớp : HTTT – K25B Hà Nội, tháng 5/2014 MỤC LỤC PHẦN 1: KHÁI NIỆM CƠ BẢN VỀ ĐỐI SÁNH XÂU KÍ TỰ 1.1 Giới thiệu 1.3.Thuật toán đối sánh chuỗi kí tự đơn giản 1.3.1.Thuật toán .4 1.3.2.Mô tả thuật toán 1.3.3.Ví dụ mô thuật toán 1.3.4.Phân tích thuật toán PHẦN 2: CÁC THUẬT TOÁN ĐỐI SÁNH XÂU KÍ TỰ 2.1 Thuật toán Knuth – Morris – Pratt (KMP) 2.1.1 Ý tưởng thuật toán 2.1.2 Phát biểu thuật toán .8 2.1.3 Ví dụ mô thuật toán .9 2.1.4.Đánh giá độ phức tạp thuật toán 12 2.2 Thuật toán Boyer – Moore (BM) .12 2.2.1.Ý tưởng thuật toán 12 2.2.2.Thuật toán BM 14 2.2.3 Ví dụ mô thuật toán 16 2.2.4 Đánh giá độ phức tạp thuật toán 18 PHẦN 1: KHÁI NIỆM CƠ BẢN VỀ ĐỐI SÁNH XÂU KÍ TỰ 1.1 Giới thiệu Ngày nay, với phát triển Công nghệ thông tin, máy tính thâm nhập vào tất lĩnh vực xã hội Việc số hóa liệu, lưu trữ xử lý văn máy tính việc làm quan trọng Trong hệ xử lý văn chuỗi ký tự coi thành phần trung tâm, hệ xử lý văn cung cấp nhiều thuật toán đóng vai trò quan trọng việc thao tác chuỗi ký tự Một phép toán chuỗi ký tự đối sánh chuỗi ký tự (String Matching) Cho trước chuỗi văn T có độ dài n mẫu P có độ dài m, tìm xuất mẫu P văn T Bài toán đối sánh chuỗi ký tự đặc trưng toán tìm kiếm, mẫu P xem khoá, nhiên thuật toán tìm kiếm thông thường không áp dụng cách trực tiếp mẫu P dài trải văn theo cách trước Đây toán thú vị có nhiều thuật toán khác Brute-Force (BF), Knuth-Morris-Pratt (KMP), Boyer-Moore (BM), Karp- Rabin (KR), … 1.2 Bài toán Giả sử có văn T mảng có độ dài n (T[1 n]) chuỗi mẫu P có độ dài m (P[1 m]) (điều kiện mm) i0 := i; else i0 :=0; 1.3.2 Mô tả thuật toán Thuật toán thực sau: Tiến hành so sánh phần tử thứ chuỗi mẫu P với phần tử thứ chuỗi ban đầu T Nếu hai phần tử giống nhau, tiến hành so sánh tiếp phần tử thứ Cứ tìm chuỗi P T phát vị trí mà phần tử T P khác Trong trường hợp phát vị trí mà phần tử T P khác ta tiến hành dịch phải chuỗi P phần tử so với chuỗi T Lặp lại thao tác so sánh đạt kết quả, không tìm thấy duyệt hết chuỗi T 1.3.3 Ví dụ mô thuật toán Giả sử cho chuỗi T = “ABCABCDABABCDA1DA1BDA” Chuỗi P = “ABCDA1” Tiến hành thực thuật toán đối sánh mẫu đơn giản qua bước sau:  Bước 1: i: T: A B C A B C D A B j: A B C D A D A B D A P: A B C D A k:  n = 21  m =6  i=1, j=1, k=1 ta có T[1] = P[j] tăng j = j+1= k = k+1 = để tiếp tục so sánh  Bước 2: i: T: A B C A B C D A B j: A B C D A D A B D A P: A B C D A k:  i =1, j=2, k= ta có T[2] = P[2] tăng j = j+1 =3 k = k+ 1=3 để tiếp tục so sánh  Bước 3: i: T: A B C A B C D A B A j: B C D A D A B D A P: A B C D A k:  i = 1, j= 3, k = ta có T[3] = P[3] tăng j =j+1 =4 k = k+ 1= để tiếp tục so sánh  Bước 4: i: T: A B C A B C D A B A B C D A D A B D A j: P: A B C D A k:  i = 1, j = 4, k = ta có T[4] P[4] tăng i = i+1 =2 (dịch chuỗi P sang phải vị trí so với T để tiếp tục so sánh), gán j = i =2, k=1  Bước 5: i: T: A B C A B C D A B j: P: A B C D A k: A B C D A D A B D A  j=2, k =1 ta có T[2] P[1] tăng i = i+1 =3 ( dịch chuỗi P sang phải vị trí so với T để tiếp tục so sánh), gán j = i = 3, k =1 bắt đầu so sánh Cứ lặp lặp lại bước thuật toán đối sánh chuỗi Sau lần dịch phải chuỗi P so với chuỗi T ta thu kết sau: i: 10 T: A B C A B C D A B A B C D A A B C D A D A B D A j: P: k: Kết tìm vị trí xuất P T 10 1.3.4 Phân tích thuật toán Việc tiến hành theo bước thuật toán đối sánh chuỗi trả cho ta kết xem có tìm thấy chuỗi mẫu P chuỗi T ban đầu hay không Nếu chuỗi mẫu P tìm thấy tìm thấy vị trí phần tử chuỗi T Tuy nhiên thuật toán đối sánh chuỗi gặp nhược điểm lớn thời gian thực thuật toán sau: - Với n độ dài chuỗi T ban đầu, m độ dài chuỗi mẫu P thời gian so khớp hai chuỗi O(mn) Đây thời gian lớn làm cho thuật toán có tốc độ chậm - Nguyên nhân việc chậm việc so sánh phần tử chuỗi T thực lặp lặp lại n lần lần so sánh Và vị trí i T ta so sánh m ký tự P Như trường hợp xấu có mn phép so sánh Như độ phức tạp thuật toán O(mn) Trong ví dụ nêu việc so sánh hai phần tử vị trí tương ứng hai chuỗi T P phát vị trí khác sau lần so sánh, tức T[4] P[4] khác Theo thuật toán chuỗi mẫu P dịch sang phải so với chuỗi T vị trí việc so sánh lại bắt đầu lại từ đầu Mặc dù lần so sánh trước biết giá trị T[1] biết T[1] khác P[1] Đây việc làm lặp lặp lại T[1] lần so sánh tiếp theo, làm tăng thời gian thực thuật toán Như thấy thuật toán đối sánh chuỗi ký tự đơn giản thuật toán tối ưu Vì cần xem xét đến phương án tối ưu hơn, có thời gian thực thuật toán nhỏ PHẦN 2: CÁC THUẬT TOÁN ĐỐI SÁNH XÂU KÍ TỰ 2.1 Thuật toán Knuth – Morris – Pratt (KMP) 2.1.1 Ý tưởng thuật toán Tư tưởng thuật toán Knuth-Morris-Pratt (KMP) thay ta so sánh mẫu với vị trí văn ta dựa vào ký tự biết trước mẫu để giảm số phép so sánh Cụ thể phát có không khớp hai chuỗi, ta không gán i thuật toán đối sánh chuỗi để dịch chuyển mẫu sang phải bước để tiếp tục so sánh với văn T, mà tìm cách để dịch chuyển mẫu với số đơn vị lớn 1, giảm số ký tự phải so sánh lại Ví dụ: Nếu mẫu có dạng xâu nhị phân có dạng đặc biệt BAAAAAAA (ký tự mẫu xuất lần) Khi giả sử có khởi đầu sai dài i ký tự (tức i ký tự mẫu khớp với đoạn văn T ) Như ký tự thứ i+1 không khớp ta biết i ký tự trước mẫu khớp Điều có nghĩa i ký tự có dạng mẫu lẫn văn Một điều hiển nhiên ta so sánh ký tự thứ mẫu P[1] với i-1 ký tự văn bản, hay nói cách khác dịch chuyển mẫu sang i đơn vị gán lại (gán lại j=1 i giữ nguyên) Để so sánh kí tự mẫu với ký tự thứ i văn Tuy nhiên thực tế không xảy trường hợp đặc biệt vậy, thuật toán KMP tổng quát hóa từ tư tưởng 2.1.2 Phát biểu thuật toán Trước hết cần xây dựng mảng tiền tố next[1 m] để xác định xem phải dự phòng khoảng phát không ăn khớp mẫu P với T Chúng ta dịch chuyển j-1 ký tự mẫu từ trái sang phải; ký tự ký tự thứ hai mẫu ngừng lại ký tự khớp nhau, hay ký tự khớp Khoảng cách để dự phòng mẫu next[j] xác định xác cộng với số ký tự gối khớp Đặc biệt số j>1 giá trị next[j] số k lớn mà nhỏ j cho k-1 ký tự khớp với k-1 ký tự cuối j-1 ký tự mẫu Mặt khác định nghĩa next[1] = Ta có thuật toán tính mảng next sau:  Thuật toán: Tính mảng tiền tố next Next [1…m] Next[1] = 0; For k=1 to m t=Next[k]; while (t>0) & (PtPk) t = Next[t]; Next[k+1] = t+1;  Thuật toán: Tìm vị trí mẫu P T với KMP Input: chuỗi mẫu P chuỗi văn gốc T, next mảng tiền tố lưu khoảng dự phòng cho bước nhảy Output: vị trí tìm thấy sâu P chuỗi văn T, vị trí >n không tìm thấy Input: P[1…m], T[1…n]; Output: i0 (if P ≡ T[i0…… i0+m-1] , i0 ≥ 1, ngược lại i0=0) a) k:=1; j:=1; b) while(j 6=m ta có: i0= j-m=14-6=8 Vậy vị trí xuất mẫu P T Tương tự ta xét tiếp xem P có xuất vị trí khác T không T: A B C A B C D A B C D A A B D A B A j 10 11 12 13 14 15 16 k P: A B C D A Output: i0=8 (tức chuỗi P xuất lần T vị trí 8) 2.1.4 Đánh giá độ phức tạp thuật toán Đối với thuật toán tính mảng next, vòng lặp thực m bước lặp, việc gán giá trị trước thực lần Vì thuật toán sinh mảng tiền tố Next[ ] có độ phức tạp O(m) Đối với thuật toán KMP: trường hợp xấu nhất, không tìm thấy mẫu P vòng lặp phải thực n bước lặp Thời gian chạy vòng lặp tìm kiếm là: O(n) ⇒ Độ phức tạp giải thuật KMP O(m+n) tốt so với giải thuật thông thường với độ phức tạp O(m.n) 2.2 Thuật toán Boyer – Moore (BM) 2.2.1 Ý tưởng thuật toán Thuật toán Boyer Moore thuật toán tìm kiếm chuỗi có hiệu thực tiễn, dạng khác thuật toán thường cài đặt chương trình soạn thảo văn Thuật toán Boyer-Moore kiểm tra ký tự mẫu từ phải sang trái phát khác đầu tiên, thuật toán tiến hành bước nhảy Trong thuật toán có hai trường hợp bước nhảy 12 Trường hợp 1: Gần giống cách dịch thuật toán KMP, dịch cho phần so sánh lần trước khớp với phần giống lần sau  Trong lần kiểm tra vị trí j, so sánh đến ký tự i mẫu phát khác nhau, lúc P[i+1…m] = T[i+j j+m-1] = u a = P[i]≠ T[i+j-1] = b thuật toán tiến hành bước nhảy cho đoạn u = T[i+j…j+m-1] giống với đoạn mẫu (trong bước nhảy ta chọn bước nhảy nhỏ nhất) T P b a u c u P u bước nhảy Dịch chuyển cho u xuất lại c ≠ a  Nếu đoạn nguyên vẹn u xuất lại P, ta chọn cho phần đôi dài u xuất trở lại đầu mẫu u b T u a P P bước nhảy u Dịch chuyển để phần đôi u xuất lại x Trường hợp 2: Coi ký tự không khớp văn b=T[i+j-1] ta dịch cho có ký tự giống b xâu mẫu khớp vào vị trí (nếu có nhiều vị trí xuất b xâu mẫu ta chọn vị trí phải nhất) T b a P P b u u bước nhảy không chứa b 13 Dịch chuyển để ký tự b ăn khớp với văn  Nếu ký tự b xuất mẫu ta dịch mẫu cho ký tự trái mẫu vào vị trí sau ký tự T[i+j-1]=b để đảm bảo ăn khớp T P b a P u u dịch chuyển không chứa b Dịch chuyển b không xuất x Trong hai cách dịch thuật toán chọn cách dịch có lợi Trong cài đặt ta dùng mảng bmGs để lưu cách dịch 1, mảng bmBc để lưu phép dịch thứ (ký tự không khớp) Việc tính toán mảng bmBc thực nhiều để bàn Nhưng việc tính trước mảng bmGs phức tạp, ta không tính trực tiếp mảng mà tính gián tiếp thông qua mảng suff Có suff[i]=max{k|x[i-k+1…i]=x[m-k+1…m]} 2.2.2 Thuật toán BM  Khởi tạo mảng bmBc procedure initBmBc (P:String); begin m = length (P); for i := to 255 bmBc[i] := m; for i := to m - bmBc[Ord(P[i])] := P.length - i; end; procedure suffixes (P:String); var right, left, i: integer; begin m = length (P); 14 suff[m] := m; left := m; for i := m - downto if (i > left) and (suff[i + m - right] < i - left) then suff[i] := suff[i +m - right] else a if (i < left) then left := i; b right := i; c while (left >= 1) and (X[left] = X[left + m - right]) left := left-1; d suff[i] := right - left; end;  Khởi tạo mảng bmGs procedure initBmGs(P:String); begin m = length (P); suffixes(P); {Tính mảng suff} for i := to m bmGs[i] :=m; j := 0; for i := m downto if (i = 0) or (suff[i] = i) then while (j < m - i) begin {Nếu bmGs[j] chưa có giá trị điền vào} if bmGs[j] = m then bmGs[j] := m - i; j := j+1 ; end; for i := to m - 15 bmGs[m - suff[i]] := m - i; {đảo lại} end;  Thuật toán BM procedure BM(P,T:String); var i, j: integer; bmBc, bmGs: IndexArray; begin initBmBc(P); initBmGs(P); j := 1; while (j = 1) and (P[i] = T[i + j - 1]) i:=i-1; 2.3 if (i < 1) then a Output(j); b j := j + bmGs[1]; else {chọn cách dịch lợi } j := j + Max(bmGs[i], bmBc[Ord(T[i + j - 1])] - m + i); end; 2.2.3 Ví dụ mô thuật toán Cho chuỗi ký tự T = “HCATCHCAHAHAHTATACAHTACH” P = “HCAHAHAH” Khởi tạo mảng: c A C H T bmBC[c] 16 i P[i] H C A H A H A H suff[i] 0 bmGs[i] 7 7 Mô tả thuật toán Bước T  H CA T CHCAHAHAH T A T ACAHT ACH P HCAHAHAH Bước nhảy = (bmGs[7]=bmBc[A]-8+8) Bước T  H CA T CHCAHAHAH T A T ACAHT ACH P HCAHAHAH Bước nhảy = (bmGs[5]=bmBc[C]-8+6) Bước T H CA T CHCAHAHAHT A T ACAHT ACH P HCAHAHAH Bước nhảy = (bmGs[0]) Bước T  H CA T CHCAHAHAHT A T ACAHT ACH 17 P HCAHAHAH Bước nhảy = (bmGs[5]=bmBc[C]-8+6) Bước T  H CA T CHCAHAHAHT A T ACAHT ACH P HC AHAHAH Bước nhảy = (bmGs[6]) Số phép so sánh ký tự 17 2.2.4 Đánh giá độ phức tạp thuật toán Các mảng bmGs bmBc tính toán trước thời gian tỉ lệ với Θ(m+δ) Thời gian tìm kiếm (độ phức tạp tính toán) thuật toán Boyer-Moore Θ(m*n) Tuy nhiên với bảng chữ lớn thuật toán thực nhanh Trong trường hợp tốt chi phí thuật toán xuống đến Θ(n/m) chi phí thấp thuật toán tìm kiếm đại đạt Thuật toán Boyer-Moore đạt tới chi phí Θ(n/m) nhờ có cách dịch thứ “ký tự không khớp” Cách dịch chuyển gặp “ký tự không khớp” cài đặt vừa đơn giản lại hiệu bảng chữ lớn nên có nhiều thuật toán khác lợi dụng quét mẫu từ phải sang trái để sử dụng cách dịch Tuy nhiên chi phí thuật toán Boyer-Moore Θ(m*n) cách dịch thứ thuật toán không phân tích triệt để thông tin lần thử trước, đoạn so sánh bị so sánh lại Có vài thuật toán cải tiến cách dịch để đưa đến chi phí tính toán thuật toán Boyer-Moore tuyến tính 18 ... 2.2 Thuật toán Boyer – Moore (BM) 2.2.1 Ý tưởng thuật toán Thuật toán Boyer Moore thuật toán tìm kiếm chuỗi có hiệu thực tiễn, dạng khác thuật toán thường cài đặt chương trình soạn thảo văn Thuật. .. 2.1.3 Ví dụ mô thuật toán .9 2.1.4 .Đánh giá độ phức tạp thuật toán 12 2.2 Thuật toán Boyer – Moore (BM) .12 2.2.1.Ý tưởng thuật toán 12 2.2.2 .Thuật toán BM ... 1.3.4 .Phân tích thuật toán PHẦN 2: CÁC THUẬT TOÁN ĐỐI SÁNH XÂU KÍ TỰ 2.1 Thuật toán Knuth – Morris – Pratt (KMP) 2.1.1 Ý tưởng thuật toán 2.1.2 Phát biểu thuật toán

Ngày đăng: 03/10/2017, 00:45

Từ khóa liên quan

Mục lục

  • Khởi tạo mảng bmBc

  • Khởi tạo mảng bmGs

  • Thuật toán BM

Tài liệu cùng người dùng

Tài liệu liên quan