1. Trang chủ
  2. » Luận Văn - Báo Cáo

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 789 3

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 394,11 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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

Trang 2

TPHCM, tháng 10 năm 2014

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

Trang 3

Mục lục

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

Mục lục 2

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

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

2.1 Thuật toán Naive 4

2.2 Thuật toán Rabin-Karp 5

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

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

3 Demo 14

4 Kết luận 16

Tài liệu tham khảo 18

Trang 4

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} 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

Trang 5

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à: Nạve, Rabin-Karp, Finite Automaton và Knutt-Morris-Pratt Ngoại trừ giải thuật Nạ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 tố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 nạ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 ngồ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 Nạve vì tận dụng các thơng tin hữu ích khi tìm kiếm

Trang 6

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à t0 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

Trang 7

Cải tiến Rabin-KarpCải Cải tiến Rabin-Karptiến Cải tiến Rabin-KarpRabin-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.

Cải tiến Rabin-Karp Cải tiến Rabin-KarpTổng Cải tiến Rabin-Karpquát Cải tiến Rabin-Karpcho Cải tiến Rabin-Karphệ Cải tiến Rabin-Karpcơ Cải tiến Rabin-Karpsố Cải tiến Rabin-Karpd

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à t0 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 ]

2 m ← length[P]

Trang 8

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 Cải tiến Rabin-Karptí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)

* Cải tiến Rabin-KarpĐịnh Cải tiến Rabin-Karpnghĩa Cải tiến Rabin-Karp“finite Cải tiến Rabin-Karpautomaton” Cải tiến Rabin-Karp(FA Cải tiến Rabin-Karp- Cải tiến Rabin-Karpmáy Cải tiến Rabin-Karptrạng Cải tiến Rabin-Karpthái Cải tiến Rabin-Karphữu Cải tiến Rabin-Karphạn)

FA là một bộ gồm (Q, q0, A,, δ) , trong đó :

- Q là tập các trạng thái

- q0 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

- δ là một hàm từ Q x  vào Q gọi là hàm chuyển đôi ( transition function) của FA

Trang 9

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 :

- φ(ε) = q0

- φ(wa) = δ(φ(w), a) với w ∈ * a ∈ 

* Cải tiến Rabin-KarpString-matching Cải tiến Rabin-Karpautomata Cải tiến Rabin-Karp(SMA)

Trang 10

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 Cải tiến Rabin-Karp3

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)?

Trang 11

Ta xét hàm hỗ trợ σ là hàm hậu tố tương ứng với P, hàm σ là 1 ánh xạ tư tập * vào tập {0,1,2,…,m} mà ở đó σ(x) là độ dài của tiền tố dài nhất của P mà tiền tố đó cũng

là hậu tố của x

σ(x) = max {k : Pk x} ⋊ là kí hiệu của hậu tố ( Pk ⋊ x nghĩa là Pk là hậu

tố của x)

Ta định nghĩa hàm δ dựa theo hàm σ như sau : δ(q, a) = σ(Pqa)  q  [0,m]

Như vậy dựa vào σ ta sẽ xây dựng được hàm δ – chìa khóa để xây dựng nên bảng

b nói ở trên Ta có được thuật toán tính δ như sau:

COMPUTE-TRANSITION-FUNCTION(P,)

1 m ← length[P]

2 for Cải tiến Rabin-Karpq ← 0 to Cải tiến Rabin-Karpm

3 for Cải tiến Rabin-Karpeach character a ∈

4 k ← min(m + 1, q + 2)

5 repeat Cải tiến Rabin-Karpk ← k − 1

6 until Cải tiến Rabin-KarpPk Pqa

7 δ(q, a) ← k

8 return Cải tiến Rabin-Karpδ

Thuật toán trên làm tiêu tốn của ta ((m+1)) thời gian tính toán do 2 vòng lặp for Nhưng hiệu quả nó đem lại 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 Cải tiến Rabin-Karpi ← 1 to Cải tiến Rabin-Karpn do

4 q ← δ(q, T [i ])

5 if Cải tiến Rabin-Karpq == m then

6 print “Pattern occurs with shift” i – m

Trang 12

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 tố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]

Nếu dùng thuật tốn Nạ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 với hậu tố của T[1 j]) mà khơng cần phải làm lại từ đầu Ta gọi chuỗi vừa là tiền tố, vừa là hậu tố của chuỗi x là biên của x

Nếu gọi [i] là độ dài của biên cĩ độ dài lớn nhất của chuỗi P[1 i] thì khi đĩ tại vị trí P[i] và T[j] khác nhau, ta sẽ dịch P sang phải một đoạn i-[i] Trong trường hợp tốt nhất [i] = 0 thì ta sẽ dịch chuyển P sang phải một đoạn m Giá trị các [i] sẽ được tính tốn trước Hình bên liệt kê tất cả các giá trị [i] trong chuỗi mẫu P=ababababca cho trước

Trang 13

* Cải tiến Rabin-KarpCách Cải tiến Rabin-Karpxây Cải tiến Rabin-Karpdựng Cải tiến Rabin-Karpmảng Cải tiến Rabin-Karp: Cải tiến Rabin-Karp

Định lý: Nếu r, s là biên của chuỗi x mà |r| < |s| thì r là biên của s

Định nghĩa: Cho x là một chuỗi và c là một ký tự Biên

r của x có thể được mở rộng thành rc nếu như rc là biên

của xc

Trong quá trình tiền xử lý chuỗi P, mỗi [i], 1 

i  m, lưu lại độ dài của biên rộng nhất của P[1 i] Vì chuỗi rỗng không có biên nên ta gán: [0] = -1 Giả sử các giá trị [0], …, [i] đã biết, giá trị [i+1] sẽ đượ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 để tính .

KMP-MATCHER(T, Cải tiến Rabin-KarpP)

1 n ← length[T ]

2 m ← length[P]

3 π ← COMPUTE-PREFIX-FUNCTION(P)

4 q ← 0 //Số lượng ký tự trùng nhau

5 for i ← 1 to n //Duyệt chuỗi T từ trái qua phải

6 do while q > 0 and P[q + 1] ≠ T [i ]

7 do q ← π[q] //Ký tự không trùng nhau

8 if P[q + 1] = T [i ]

10 if q = m //Nếu đã kiểm tra toàn bộ chuỗi P

11 then print “Mẫu xuất hiện với độ dịch chuyển” i − m

12 q ← π[q] //Tìm ký tự trùng nhau tiếp theo

COMPUTE-PREFIX-FUNCTION(P)

1 m ← length[P]

2 π[1] ← 0

3 k ← 0

4 for q ← 2 to m do

5 while k > 0 and P[k + 1] ≠ P[q]

Trang 14

6 do k ← π[k]

7 if P[k + 1] = P[q]

9 π[q] ← k

10 return π

Đánh Cải tiến Rabin-Karpgiá: Cải tiến Rabin-KarpĐộ phức tạp của giải thuật tiền xử lý Compute-Prefix-Function là

O(m) bởi vì vòng lặp while bên trong sẽ không bao giờ thực hiện quá m lần Tương tự,

giải thuật tìm kiếm KMP-Matcher cũng chỉ có độ phức tạp là O(n).

Bởi vì m  n nên độ phức tạp cuối cùng của giải thuật Knutt-Morris-Pratt là O(n)

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

HÌNH ẢNH LIÊN QUAN

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à - 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
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à (Trang 9)
Hình Cải tiến Rabin-Karp3 - 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
nh Cải tiến Rabin-Karp3 (Trang 10)
Hình Cải tiến Rabin-Karp3.1 Cải tiến Rabin-KarpGiao Cải tiến Rabin-Karpdiện Cải tiến Rabin-Karpcủa Cải tiến Rabin-Karpchương Cải tiến Rabin-Karptrình - 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
nh Cải tiến Rabin-Karp3.1 Cải tiến Rabin-KarpGiao Cải tiến Rabin-Karpdiện Cải tiến Rabin-Karpcủa Cải tiến Rabin-Karpchương Cải tiến Rabin-Karptrình (Trang 15)
Hình Cải tiến Rabin-Karp3.2 Cải tiến Rabin-KarpKết Cải tiến Rabin-Karpquả Cải tiến Rabin-Karpthực Cải tiến Rabin-Karphiện Cải tiến Rabin-Karpđược - 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
nh Cải tiến Rabin-Karp3.2 Cải tiến Rabin-KarpKết Cải tiến Rabin-Karpquả Cải tiến Rabin-Karpthực Cải tiến Rabin-Karphiện Cải tiến Rabin-Karpđược (Trang 16)
Hình Cải tiến Rabin-Karp3.3 Cải tiến Rabin-KarpKết Cải tiến Rabin-Karpquả Cải tiến Rabin-Karpchạy Cải tiến Rabin-Karpcác Cải tiến Rabin-Karpthuật Cải tiến Rabin-Karptoán Cải tiến Rabin-Karpkhi Cải tiến Rabin-Karpso Cải tiến Rabin-Karpsánh Cải tiến Rabin-K - 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
nh Cải tiến Rabin-Karp3.3 Cải tiến Rabin-KarpKết Cải tiến Rabin-Karpquả Cải tiến Rabin-Karpchạy Cải tiến Rabin-Karpcác Cải tiến Rabin-Karpthuật Cải tiến Rabin-Karptoán Cải tiến Rabin-Karpkhi Cải tiến Rabin-Karpso Cải tiến Rabin-Karpsánh Cải tiến Rabin-K (Trang 17)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w