1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng cấu trúc dữ liệu giải thuật đối sách chuỗi

26 8 0

Đ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 26
Dung lượng 724,65 KB

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

Nội dung

Giảng viên: Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến Cải tiến với Knuth-Morris-Pratt Thuật toán Morris-Pratt Thuật toán Brute-Force Giới thiệu... Cấu trúc dữ liệu và gi

Trang 1

Giảng viên:

Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến

Cải tiến với Knuth-Morris-Pratt Thuật toán Morris-Pratt Thuật toán Brute-Force Giới thiệu

Trang 2

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Ứng dụng của đối sánh chuỗi:

Trang 3

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Mục tiêu:

 Kiểm tra sự tồn tại của một chuỗi ký tự (mẫu, pattern) trong một chuỗi ký tự có kích thước lớn hơn nhiều (văn bản, text).

 Nếu tồn tại, trả về một (hoặc nhiều) vị trí xuất hiện.

 Quy ước:

Mẫu cần tìm: P (chiều dài m).

Văn bản: T (chiều dài n).

 P và T có cùng tập hữu hạn ký tự ∑ (∑ = {0, 1};

∑={A, ,Z},…)

 m ≤ n

 Đối sánh chuỗi:

 Bằng cách lần lượt dịch chuyển (cửa sổ) P trên T.

P tồn tại trên T tại vị trí bắt đầu là i (0 ≤ i ≤ n – m) nếu

T[i + j] = P[j ] với mọi 0 ≤ j ≤ m - 1

 Ví dụ:

P = abbaba

Trang 4

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Các thuật toán tiêu biểu:

Trang 5

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Lần lượt kiểm tra điều kiện P[0…m-1] = T[i …i+m-1] tại mọi vị trí có thể của i.

Trang 6

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Trường hợp tốt nhất – không tìm thấy: O(n).

 Trường hợp xấu nhất – không tìm thấy: O(n*m).

 Trường hợp trung bình: O(n+m).

 Không cần thao tác tiền xử lý trên P.

 Luôn luôn dịch chuyển mẫu (cửa sổ) sang phải một vị trí.

 Thao tác so sánh có thể thực hiện theo bất kỳ chiều nào.

 Trường hợp xấu nhất: O((n-m+1)*m).

Trang 7

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Điểm hạn chế của thuật toán Brute-Force:

 Không ghi nhớ được thông tin đã trùng khớp (trước) khi xảy ra tình trạng không so khớp

 Phải so sánh lại từ đầu (trên P) trong tất cả trường hợp

Trang 8

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Cố gắng bỏ qua một số bước so sánh giữa P

và T tại vị trí mới (thay vì j=0, gán j bằng một số

thích hợp).

Trang 9

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Giả sử:

i là vị trí bắt đầu sự đối sánh (trên T).

j là vị trí đang so sánh (trên P) (Ký tự tương ứng trên

T tại vị trí i+j).

 T[i+j] != P[j] => không so khớp

 Tìm:

Vị trí mới i 1 (trên T) và j 1 (trên P) sao cho

i+j = i1+j1(ngay tại vị trí đang xem xét)

v =T[i1… i1+j1–1] là đoạn so khớp mới giữa P và T.

 Khi đó:

Đoạn dịch chuyển cửa sổ: j – j 1 (do j 1 < j)

 Có thể tìm i 1 dựa trên j 1

Trang 10

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 11

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Hoàn toàn dựa trên P.

Trang 12

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 13

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 14

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Xây dựng bảng NEXT cho P = 10100

 Xây dựng bảng NEXT cho P = ABACAB

 Xây dựng bảng NEXT cho P = GCAGAGAG

 Xây dựng bảng NEXT cho P = AABAABA

Trang 15

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Xác định vị trí mới i 1 (trên T) và j 1 (trên P) sao cho

i+j = i1+j1(vị trí đang xem xét)

v =T[i1… i1+j1–1] là đoạn so khớp mới giữa P và T.

Đã có j 1 = NEXT[j]

Vậy, i1 = i + j – NEXT[j]

Trang 16

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 17

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 18

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 19

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Thuật toán Knuth-Pratt cải tiến Pratt bằng cách

Morris- bổ sung thêm điều kiện a ≠ c (vì nếu a và c như nhau

thì sẽ không khớp ngay sau khi dịch chuyển).

Trang 20

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Thay đổi cách tính bảng NEXT:

 Ngược lại NEXT[i] = NEXT[j]

 Thao tác tìm kiếm vẫn không thay đổi

Trang 21

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Là thuật toán tìm kiếm chuỗi được đề xuất bởi Michael O Rabin và Richard M Karp vào 1987.

 Sử dụng phép băm(hashing).

Trang 22

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 T = “AADCABADCA”

 P = “BACD”

 Giải pháp: Rolling Hash

 Tận dụng được mã hash của lần tính trước.

 Lần tính kế tiếp không phụ thuộc vào độ dài chuỗi con.

66 + 65 + 68 + 67 = 266 h_P = 266

=>i = 5

Trang 23

 Hàm băm của Rabin–Karp

Trang 24

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

 Rolling Hash

 x i = a[i]d m−1 + a[i + 1]d m−2 + + a[i +m − 1]

 x i+1 = (x i − a[i]d m−1 )d + a[i +m]

hs := hash(s[1 m]) for i from 1 to n-m+1

if hs = hsub

if s[i i+m-1] = sub return i

hs := hash(s[i+1 i+m]) return not found

Trang 25

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Trang 26

Cấu trúc dữ liệu và giải thuật - HCMUS 2015

Ngày đăng: 26/12/2021, 17:19

TỪ KHÓA LIÊN QUAN

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

w