tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Trang 1Chương 3
Chuỗi
Trang 2Nội dung
Ðịnh nghĩa chuỗi.
Các cách phân chia chuỗi.
Các hàm và thủ tục.
Tìm kiếm chuỗi con.
Trang 3Các định nghĩa
Định nghĩa chuỗi
f Chuỗi (string) là một dãy các ký tự được
chứa trong một vùng liên tục của bộ nhớ Các ký tự này có thể là các ký tự chữ, ký tự
f Chuỗi con (substring) là một thành phần bao
gồm các ký tự liên tiếp nhau của chuỗi.
Trang 4 Sử dụng ký tự đặc biệt
của chuỗi) để phân tách các chuỗi con.
nhau.
một chuỗi con.
Các cách phân chia chuỗi
Trang 5 Sử dụng chiều dài chuỗi con cố định
chỉ để tìm kiếm một chuỗi con.
Các cách phân chia chuỗi
H O A N G A N H P H U O N G L O C
Trang 6Các cách phân chia chuỗi
Sử dụng con trỏ
Trang 10Các hàm và thủ tục
Các thủ tục
f val(s, x, n): biến đổi chuỗi s thành giá trị số
và gán cho x; n được gán số 0 nếu biến đổi
Trang 12Tìm kiếm chuỗi con
Tìm chuỗi p có chiều dài là m trong chuỗi a
có chiều dài là n Có hai trường hợp tìm
kiếm:
f Tìm thấy chuỗi p trong chuỗi a: kết quả trả về
là vị trí của ký tự đầu tiên của lần tìm thấy đầu tiên.
f Không tìm thấy chuỗi p trong chuỗi a: kết quả trả về là 0.
Các giải thuật
Giải thuật Boyer-Moore
Trang 13Giải thuật Brute-Force
Trang 14Giải thuật Brute-Force
function Brute_Force (p, a: string): integer;
i := i - j + 1; j := 1
end until (j > m) or (i > n);
if j > m then Brute_Force := i - m
else Brute_Force := 0
end ;
Trang 15Giải thuật Knuth-Morris-Pratt
Phương pháp
p[j] khác với a[i] thì đã có j-1 ký tự đầu tiên của chuỗi p trùng với các ký tự tương ứng của chuỗi a.
vẫn cho i tăng tiếp tục (thay thế i := i - j + 2 bởi i := i + 1) và gán cho j một giá trị thích
hợp Mảng next[j] xác định các giá trị thích
hợp gán cho j.
Trang 16Giải thuật Knuth-Morris-Pratt
Trang 17Giải thuật Knuth-Morris-Pratt
function KMP (p, a: string): integer;
until i >= m;
end ;
Trang 18Giải thuật Knuth-Morris-Pratt
end until (j > m) or (i > n);
if j > m then KMP := i - m
else KMP := 0
end ;
Trang 19Giải thuật Knuth-Morris-Pratt cải tiến
Trang 20Giải thuật Knuth-Morris-Pratt cải tiến
if p[j] <> p[i] then next[i] := j
end else j := next[j]
until i >= m;
Trang 21Giải thuật Boyer-Moore
Phương pháp
chuỗi p với chuỗi a.
qua phải đối với chuỗi p1 (bản sao của chuỗi
p) để có được vị trí khác nhau ở ký tự thứ j
kể từ phải qua trái của chuỗi p.
sự so sánh khác nhau.
y skip[c] = m nếu c không là ký tự của chuỗi p.
y skip[c] = m-j nếu c là ký tự thứ j của chuỗi p.
Trang 22Giải thuật Boyer-Moore
Trang 23Giải thuật Boyer-Moore
function Boyer_Moore (p, a: string): integer;
Trang 24Giải thuật Boyer-Moore