Tiểu luận môn Thuật Toán và Phương Pháp Giải Quyết Vấn Đề TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT

18 787 3
Tiểu luận môn Thuật Toán và Phương Pháp Giải Quyết Vấn Đề TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT

Đ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

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN PHÒNG ĐÀO TẠO SĐH – KHCN & QHĐN BÀI TIỂU LUẬN MÔN THUẬT TOÁN VÀ PHƯƠNG PHÁP GIẢI QUYẾT VẤN ĐỀ TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT GVHD: PGS.TS ĐỖ VĂN NHƠN HVTH: NGUYỄN HẢI TOÀN MSHV: CH1301110 TPHCM, tháng 10 năm 2014 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề NHẬN XÉT CỦA GIẢNG VIÊN Nguyễn Hải Toàn – CH1301110 Trang 2 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Mục lục Nguyễn Hải Toàn – CH1301110 Trang 3 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 1. Phát biểu vấn đề So sánh chuỗi là quá trình tìm kiếm tất cả các lần xuất hiện của một chuỗi mẫu (pattern) trong một chuỗi khác. Quá trình so sánh chuỗi như thế này là hoạt động diễn ra rất thường xuyên trong các chương trình chỉnh sửa văn bản, các trình duyệt web, các máy tìm kiếm… Các giải thuật này còn được sử dụng trong việc tìm các mẫu trong chuỗi ADN. Cho T[1 n] là một chuỗi bao gồm n ký tự, trong đó các T[i], 1<=i<=n là từng ký tự ở trong chuỗi. Cho P[1 m] là chuỗi mẫu bao gồm m ký tự, m<=n. Ta giả sử rằng P và T chỉ chứa các ký tự có trong tập hữu hạn Σ. Ví dụ Σ={0, 1} hoặc Σ={a, b, c…, z}. Vấn đề đặt ra là tìm xem P có xuất hiện trong T hay không. Hay nói cách khác là tìm số nguyên s (0<s<n) sao cho T[s+1 s+m] = P[1 m]. Khi đó, ta nói P xuất hiện trong T với độ dịch chuyển s. Nếu P thực sự xuất hiện trong T với độ dịch chuyển s, ta gọi s là độ dịch chuyển hợp lệ, ngược lại ta gọi s là độ dịch chuyển không hợp lệ. Cho chuỗi T[1 n], một chuỗi con của T được định nghĩa là T[i j] với 1<=i, j<=n. Chuỗi con này chứa các ký tự từ chỉ số i đến chỉ số j của mảng các ký tự trong T. Lưu ý rằng T cũng chính là một chuỗi con của T với i=1, j=n. Một chuỗi con thực sự của chuỗi T[1 n] là chuỗi T[i j] với i<j và (i>0 hoặc j<n). Trong trường hợp i > j thì T[i j] là một chuỗi rỗng. Tiền tố của một chuỗi T[1 n] là chuỗi T[1 i] với 1<=i<=n. Hậu tố của một chuỗi T[1 n] là chuỗi T[j n] với 1<=j<=n. Nguyễn Hải Toàn – CH1301110 Trang 4 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 2. Phương pháp giải quyết vấn đề so sánh chuỗi Có rất nhiều giải thuật để thực hiện việc so sánh chuỗi. Trong bài tiểu luận này, Chúng ta sẽ tìm hiểu về bốn giải thuật cơ bản nhất trong so sánh chuỗi đó là: Naïve, Rabin-Karp, Finite Automaton và Knutt-Morris-Pratt. Ngoại trừ giải thuật Naïve, các giải thuật còn lại đều thực hiện các bước tiền xử lý nhằm giảm thời gian cho việc tìm kiếm. 2.1 Thuật toán Naive Đây là giải thuật cơ bản và đơn giản nhất, sử dụng nguyên lý vét cạn. Giải thuật này kiểm tra tất cả các khả năng của chuỗi mẫu P[1 m] nằm trong chuỗi T[1 n] bằng cách duyệt từ đầu tới cuối chuỗi T. NAIVE-STRING-MATCHER(T, P) 1 n = T.length 2 m = P.length 3 for s = 0 to n-m do 4 j = 1 5 while (j <= m AND T[s+j] == P[j]) do 6 j = j+1 7 if (j > m) 8 “Tìm thấy mẫu với độ dịch chuyển s” Minh họa giải thuật naïve-String-Matcher Phân tích: Vòng lặp while bên trong chạy tối đa m lần, vòng lặp for bên ngoài chạy tối đa n-m+1 lần. Do vậy, thời gian chạy của giải thuật này là T(n) = O((n-m+1)*m) = O(n*m). Rõ ràng, giải thuật này không hiệu quả vì nó bỏ qua mọi thông tin hữu ích có được trong quá trình so sánh chuỗi tại từng giá trị của s. Giải thuật Knutt-Morris-Pratt được trình bày trong các phần sau tỏ ra tốt hơn nhiều so với Naïve vì tận dụng các thông tin hữu ích khi tìm kiếm. Nguyễn Hải Toàn – CH1301110 Trang 5 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 2.2 Thuật toán Rabin-Karp Thuật toán này do Rabin và Karp đề xuất. Thuật toán tiêu tốn O(m) để tiền xử lý lí các dữ liệu nhập, và thời gian chạy tệ nhất của nó là O((n-m+1)m). Mặc dù vậy trung bình các trường hợp điều tiêu tốn thời gian ít hơn. Ta nhận thấy rằng mỗi chuỗi S cấu tạo từ Σ điều có thể số hóa thành 1 số được . Ví dụ Σ = {0,1,2 ,9} , S = “1234” thì ta sẽ có digit(S)=1,234. Gọi p là giá trị số hóa của P, hay nói cách khác p là giá trị thập phân tương ứng của P. Gọi ts là giá trị thập phân tương ứng của T[s+1,…,s+m] , s<n-m+1. Ta nhận thấy rằng tS =p khi và chỉ khi P = T[s+1, …,s+m]. Mặt khác, ta có thể tính p và t 0 theo 2 công thức : p = P[m] * 10 0 + P[m-1]*10 1 + ….+ P[1]*10 m-1 . t 0 = T[1]*10 m-1 +T[2]*10 m-2 +….+T[m]*10 0 . Ta nhận thấy rằng qua hai công thức trên ta sẽ phải tiêu tốn O(m) cho mỗi công thức. Sau khi tính t0 , việc tính các t1,t2,….tn-m-1 trở nên đơn giản hơn với và chỉ tiêu tốn O(1) cho mỗi ti mà thôi. Ta tính các t1,t2,….tn-m-1 lần lượt theo công thức sau: t i = 10*(t i-1 – 10 m-1 *T[i]) + T[i+m]. Sau khi tính được tính được các giá trị của p và ti, bài toán so sánh chuỗi trở nên đơn giản vô cùng khi được qui về bài toán “ tìm một số trong một mảng số các số nguyên” – nghĩa là tìm sự xuất hiện của p trong ti .Hay nói cách khác, bài toán tìm chuỗi qui về bài toán tim i với i ∈ [0,n-m-1] sao cho p=ti. Vì vậy để tính được tất cả các giá trị p và ti , hay nói cách khác là tìm được chuỗi P trong T, ta chỉ cần tiêu tốn thời gian O(m) + O(n-m-1) mà thôi. Và điều này cũng cho ta 1 kết quả khá đẹp với thuật toán Rabin-Karp với độ phức tạp là O(m) cho tiền xử lí và O(n-m-1) để so sánh chuỗi. Thế nhưng vấn đề sẽ phát sinh khi ta cài đặt nó lên bộ nhớ máy tính nơi mà p và ti bị giới hạn trong kiểu (long) chỉ có 16 chữ số ↔ Max(m) = 16. Nguyễn Hải Toàn – CH1301110 Trang 6 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề ∗ Cải tiến Rabin-Karp Để giải quyết trường hợp m>16 , p và ti vượt quá các kiểu dữ liệu của máy tính ta sử dụng mảng băm (hash). Điều này có nghĩa là thay vì tính p và ti ta sẽ tính p’ và ti’ mà ở đó p’ = p mod q, ti’ = ti mod q, với q là một số nguyên tố lớn nằm trong khoảng mà máy tính có thể biểu diễn được như là long, integer,… Lúc này, Việc so sánh chuỗi sẽ qui về việc so sánh các số t’i và p’. nếu như t’i ≠ p’ thì điều này đồng nghĩa với việc P ≠ T[i+1,i+m]. Chú ý rằng: - p’ = t’ i không đồng nghĩa với việc P <>T[i+1,i+m] (hình vẽ) - Số q càng lớn thì xác xuất trường hợp p’ = t’ i và P <>T[i+1,i+m] càng thấp. - Khi p’ =t i ’ để kết luận ta cần phải kiểm tra lại việc P và T[i+1,i+m] có bằng nhau hay không. ∗ Tổng quát cho hệ cơ số d Cũng phải chú ý 1 điều khác là không phải lúc nào Σ cũng là tập hợp các chữ số trong cơ số 10. Xét trường hợp Σ là tập hợp cac chữ số của hệ cơ số d. Lúc này t’i cần được tính lại như sau : t’ i = (d(t’ i-1 – T[i]h) + T[i+m]) mod q. Với h=d m-1 mod q Trong hệ cơ số d , p và t 0 cũng được tính lại : p = P[m] * d 0 + P[m-1]*d 1 + ….+ P[1]*d m-1 t 0 = T[1]*d m-1 +T[2]*d m-2 +….+T[m]*d 0 Sau khi tổng quát hóa ta viết lại thuật toán Rabin-Karp như sau : RABIN-KARP-MATCHER(T, P, d, q) 1 n ← length[T ] Nguyễn Hải Toàn – CH1301110 Trang 7 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 2 m ← length[P] 3 h ← d m-1 mod q 4 p’ ← 0 5 t’ 0 ← 0 6 for i ← 1 to m // Tiền xử lý 7 p’ ← (dp’ + P[i ]) mod q 8 t’ 0 ← (dt’ 0 + T [i ]) mod q 9 for s ← 0 to n − m // so sánh 10 if p’ == t’ s 11 if P[1 . .m] == T [s + 1 . . s + m] 12 print “Mẫu xuất hiện với độ dịch chuyển” s 13 if (s < n – m) 14 t’s+1 ← (d(t’s − T [s + 1]h) + T [s + m + 1]) mod q Phân tích: - Quá trình tiền xử lý tiêu tốn Θ(m) thời gian với 1 vòng lặp for i =1 to n - Quá trình so sánh trong trường hợp tốt nhất là p’!=t’ i với mọi i thì việc so sánh tiêu tốn O(n-m). Nhưng bù lại trong trường hợp xấu nhất khi p’==t’ I thì việc so sánh phải thực hiện thêm lệnh kiểm tra P[1 m] và T[i+1,i+m], điều này chỉ tiêu tốn O(m) thời gian chạy. Tóm lại: độ phức tạp của Rabin-Karp là O((n-m+1)m). 2.3 Thuật toán tìm kiếm chuỗi dùng finite automaton Thuật toán tìm kiếm chuỗi finite automata xây dựng một finite automaton (máy trạng thái hữu hạn) giúp tìm kiếm chuỗi P[1 m] trên chuỗi T[1 n] một cách nhanh chóng chỉ với độ phức tạp O(n). * Định nghĩa “finite automaton” (FA - máy trạng thái hữu hạn) FA là một bộ gồm (Q, q 0 , A,Σ, δ) , trong đó : - Q là tập các trạng thái. - q 0 là trạng thái ban đầu. - A là tập các trạng thái mà ở đó chuỗi được chấp nhận (accepting state) - Σ tập hợp nguồn các kí tự trong T và P. Nguyễn Hải Toàn – CH1301110 Trang 8 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề - δ là một hàm từ Q x Σ vào Q gọi là hàm chuyển đôi ( transition function) của FA. FA bắt đầu từ trạng thái q0, từ đó FA lần lượt đọc các kí tự của chuỗi input (ở đây là chuỗi T), tại mỗi kí tự a của chuỗi input FA sẽ đổi trạng thái q của FA thành trạng thái δ(q,a). Cho đến khi q ∈ A thì lúc này FA sẽ chấp nhận chuỗi input ( tìm thấy chuỗi P trong T). Hình trên biểu diễn các trạng thái biến đổi trạng thái của FA. Hình (a) là bảng mà ở đó mỗi ô biểu diễn giá trị của δ(Cột,Dòng). (b) là sơ đồ biến đổi của FA. Trọng số cạnh là các kí tự a mà FA lần lượt đọc được ở T chiều mũi tên là chiều thể hiện sự biến đổi trạng thái của FA trước và sau khi đọc thấy giá trị của kí tự a. Một chuỗi T được gọi là “accept” thì đồng nghĩa với việc tìm thấy chuỗi P trong nó. Điều này có nghĩa là trong quá trình thay đổi trạng thái của FA trong khi đọc lần lượt các kí tự a thuộc T có một điểm mà ở đó FA được chuyển trạng thái q ∈ A. Ngược lại, nếu không tìm được điểm như vậy đồng nghĩa với việc chuỗi P không xuất hiện trong T, lúc này ta gọi T “rejected”. Một FA đòi hỏi 1 hàm φ gọi là hàm “trạng thái cuối cùng” ( final-state function) là 1 hàm từ tập Σ* vào Q . Ở đó φ(w) là trạng thái cuối cùng của FA sau khi FA duyệt qua chuỗi w. Hàm φ được định nghĩa như sau : - φ(ε) = q 0 . - φ(wa) = δ(φ(w), a) với w ∈ Σ* a ∈ Σ . Nguyễn Hải Toàn – CH1301110 Trang 9 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề * String-matching automata (SMA) Với mỗi chuỗi P ta có một SMA riêng. Trước khi bước vào tìm chuỗi P trong chuỗi T, ta cần phải xây dựng SMA cho P trước sau đó bạn mới có thể dùng nó để tìm chuỗi P trong T được. Ta xem Hình 3, ở đó chuỗi P = ababaca là chuỗi cần tìm kiếm trong chuỗi T=abababacaba. Ta thấy rằng A={7}, q0 = 0. Ta đọc lần lượt các kí tự của T nếu thấy xuất hiện kí tự a (kí tự đầu tiên của P) thì chuyển trạng thái từ 0  1 (chuỗi P trong T bắt đầu có dấu hiệu xuất hiện). Sau đó lại xuất hiện kí T[2] = b =P[2], điều này cho thấy P đã từ từ xuất hiện rõ hơn trong T, cứ như vậy ta đọc lần lượt và tra theo bảng (b) để có được các trạng thái của FA. Cho đến khi trạng thái bằng 7 thì có nghĩa là ta đã tìm được chuỗi P trong T. Hình 3 Vậy là bảng (b) đã giải quyết toàn bộ vấn đề của bài toán, vấn đề đặt ra là làm sao để ta xây dựng bảng (b)? Nguyễn Hải Toàn – CH1301110 Trang 10 [...]... Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Hình 3.3 Kết quả chạy các thuật toán khi so sánh các chuỗi có kích thước lớn Đối với các chuỗi có kích thước lớn, thuật giải Rabin-Carp có thời gian chạy nhanh nhất Sau đó là thuật giải Finite Automaton 4 Kết luận - - Qua những gì đã trình bày ở trên, chúng ta đã thấy được những ưu và nhược điểm của một thuật giải so sánh chuỗi Mỗi thuật giải có thời... kiếm mẫu “cntt” trong chuỗi “vietnamcntthethongthongtin” Nguyễn Hải Toàn – CH1301110 Trang 15 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Hình 3.2 Kết quả thực hiện được Trong hình vẽ trên ta thấy, thuật toán Naïve chạy nhanh nhất và tìm được chuỗi cần tìm ở vị trí số 7 Một số trường hợp khác: Chương trình có tạo ra một số trường hợp để test Chúng ta một mục trong cột Test... CH1301110 Trang 12 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Nếu dùng thuật toán Naïve thì ta dịch P sang phải một vị trí Nhưng vì ta đã so sánh đến T[j] nên ta tìm cách dịch P đi càng xa càng tốt Các tốt nhất là dịch P sang phải một đoạn sao cho tiền tố của P[1…i] xếp trùng với một đoạn hậu tố của T[1 j] Khi đó, chỉ cần so sánh T[j] và P[k] (với P[1 k] là tiền tố của P trùng... của giải thuật Knutt-Morris-Pratt là O(n) Nguyễn Hải Toàn – CH1301110 Trang 14 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 3 Demo Demo cho chúng ta kiểm nghiệm, so sánh về thời gian chạy của 4 thuật toán trên trên cùng 1 số test để từ đó có thể chọn thuật toán String Matching phù hợp trong 1 số trường hợp cụ thể để sử dụng: Hình 3.1 Giao diện của chương trình Thử nghiệm-1 : Tìm. .. điểm của một thuật giải so sánh chuỗi Mỗi thuật giải có thời gian chạy khác nhau,tùy thuộc vào kích thước của chuỗi và mẫu (pattern) của chuỗi Mỗi thuật giải phù hợp với những ứng dụng khác nhau Vì lý do hạn chế, nên trong bài tiểu luận này chỉ trình bày một số thuật toán so sánh chuỗi thông dụng, còn một số thuật toán cũng được sử dụng rất nhiều như: Brute-Force, Boyer – Morre Nếu cơ hội em xin được... cho cả bài toán thật sự rất lớn Vì chỉ sau khi có được bảng δ ta sẽ thực hiện việc tìm kiếm trên chuỗi rất đơn giản theo thuật toán sau FINITE-AUTOMATON-MATCHER(T, δ,m) 1 n ← length[T ] 2 q←0 3 for i ← 1 to n do 4 5 6 q ← δ(q, T [i ]) if q == m then print “Pattern occurs with shift” i – m Nguyễn Hải Toàn – CH1301110 Trang 11 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Rõ ràng,... được tính bằng cách kiểm tra xem biên của chuỗi P[1 i] có thể được mở rộng bằng ký tự P[i+1] hay không Ta sử dụng biến k lưu trữ các π[i] Nếu P[i+1] = P[k] thì ta gán π[i+1] = k+1, ngược lại ta xét k = π[k] và quay lại các bước so sánh P[i+1] với P[k] ở trên Giải thuật so khớp chuỗi KMP-Matcher được trình bày trong đoạn mã giả sau đây Giải thuật này gọi tới giải thuật tiền xử lý Compute-Prefix-Function... 1 2 3 4 5 6 7 8 9 10 11 12 Thuật toán và phương pháp giải quyết vấn đề n ← length[T ] m ← length[P] π ← COMPUTE-PREFIX-FUNCTION(P) q←0 / /Số lượng ký tự trùng nhau for i ← 1 to n //Duyệt chuỗi T từ trái qua phải do while q > 0 and P[q + 1] ≠ T [i ] do q ← π[q] //Ký tự không trùng nhau if P[q + 1] = T [i ] then q ← q + 1 //Ký tự trùng nhau if q = m //Nếu đã kiểm tra toàn bộ chuỗi P then print “Mẫu xuất... vấn đề Rõ ràng, chỉ với tốn O(n) cho việc tìm kiếm khi có δ trong tay.Vậy tổng cộng ta đã tiêu tốn hết O((m+1)|Σ|) +O(n) cho tất cả việc tìm kiếm 2.4 Thuật toán Knuth-Morris-Pratt Giải thuật độ phức tạp tuyến tính này được Knuth, Morris và Pratt phát hiện ra nhờ việc phân tích chặt chẽ giải thuật Naive Giả sử ta muốn tìm chuỗi mẫu P[1 m] trong T[1 n], đến một lúc nào đó thì ta sẽ có P[i] != T[j] Nguyễn... cáo lần sau Tài liệu tham khảo Nguyễn Hải Toàn – CH1301110 Trang 17 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề Ellard, Daniel J String Searching S-Q Course Book [Online] [Cited: 06 10, 2011.] http://www.eecs.harvard.edu/~ellard/Q-97/HTML/root/root.html Hưng, Ngô Quang 2011 PM1: Thuật toán Knutt-Morris-Pratt Blog Khoa học máy tính [Online] 4 2, 2011 [Cited: 06 10, 2011.] http://www.procul.org . TIN PHÒNG ĐÀO TẠO SĐH – KHCN & QHĐN BÀI TIỂU LUẬN MÔN THUẬT TOÁN VÀ PHƯƠNG PHÁP GIẢI QUYẾT VẤN ĐỀ TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT GVHD: PGS.TS ĐỖ VĂN NHƠN HVTH: NGUYỄN. và phương pháp giải quyết vấn đề 2. Phương pháp giải quyết vấn đề so sánh chuỗi Có rất nhiều giải thuật để thực hiện việc so sánh chuỗi. Trong bài tiểu luận này, Chúng ta sẽ tìm hiểu về bốn giải. Thuật toán và phương pháp giải quyết vấn đề Mục lục Nguyễn Hải Toàn – CH1301110 Trang 3 GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề 1. Phát biểu vấn đề So sánh chuỗi

Ngày đăng: 24/05/2015, 09:21

Từ khóa liên quan

Mục lục

  • NHẬN XÉT CỦA GIẢNG VIÊN

  • Mục lục

  • 1. Phát biểu vấn đề

  • 2. Phương pháp giải quyết vấn đề so sánh chuỗi

    • 2.1 Thuật toán Naive

    • 2.2 Thuật toán Rabin-Karp

    • 2.3 Thuật toán tìm kiếm chuỗi dùng finite automaton

    • 2.4 Thuật toán Knuth-Morris-Pratt

    • 3. Demo

    • 4. Kết luận

    • Tài liệu tham khảo

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

Tài liệu liên quan