Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Thuật Toán Z

Nhấn vào đây để đọc bằng ngôn ngữ khác: English

Thuật toán Z tìm các xuất hiện của một "từ" W trong một "chuỗi văn bản" T với thời gian tuyến tính O(|W| + |T|).

Cho một chuỗi S có độ dài n, thuật toán tạo ra một mảng, Z trong đó Z[i] biểu thị chuỗi con dài nhất bắt đầu từ S[i] mà cũng là một tiền tố của S. Tìm Z cho chuỗi thu được bằng cách nối từ W với một ký tự nonce, ví dụ $ sau đó là văn bản, T, giúp cho việc so khớp mẫu, vì nếu có một chỉ số i nào đó sao cho Z[i] bằng độ dài mẫu, thì mẫu phải có mặt tại điểm đó.

Mặc dù mảng Z có thể được tính toán với hai vòng lặp lồng nhau trong thời gian O(|W| * |T|), chiến lược sau đây cho thấy cách thu được nó trong thời gian tuyến tính, dựa trên ý tưởng rằng khi chúng ta lặp qua các ký tự trong chuỗi (chỉ số i từ 1 đến n - 1), chúng ta duy trì một khoảng [L, R] là khoảng với R tối đa sao cho 1 ≤ L ≤ i ≤ RS[L...R] là một tiền tố cũng là một chuỗi con (nếu không có khoảng nào tồn tại, chỉ cần đặt L = R =  - 1). Đối với i = 1, chúng ta có thể dễ dàng tính toán LR bằng cách so sánh S[0...] với S[1...].

Ví dụ về mảng Z

Chỉ số           0   1   2   3   4   5   6   7   8   9  10  11
Văn bản           a   a   b   c   a   a   b   x   a   a   a   z
Giá trị Z        X   1   0   0   3   1   0   0   2   2   1   0

Các ví dụ khác

chuỗi =  a a a a a a
Z[] =  x 5 4 3 2 1
chuỗi =  a a b a a c d
Z[] =  x 1 0 2 1 0 0
chuỗi =  a b a b a b a b
Z[] =  x 0 6 0 4 0 2 0

Ví dụ về hộp Z

z-box

Phức Tạp

  • Thời gian: O(|W| + |T|)
  • Không gian: O(|W|)

Tham Khảo