cấu trúc dữ liệu chương 3

24 128 0
cấu trúc dữ liệu chương 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

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ộ

Chương Chuỗi Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT Nội dung Ðịnh nghĩa chuỗi ™ Các cách phân chia chuỗi ™ Các hàm thủ tục ™ Tìm kiếm chuỗi ™ f Giải thuật Brute-Force f Giải thuật Knuth-Morris-Pratt f Giải thuật Boyer-Moore Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT Các định nghĩa ™ Định nghĩa chuỗi f Chuỗi (string) dãy ký tự chứa vùng liên tục nhớ Các ký tự ký tự chữ, ký tự số ký tự đặc biệt ™ Các khái niệm f Chiều dài (length) chuỗi số ký tự chuỗi f Chuỗi rỗng (null string) chuỗi có chiều dài 0, ký hiệu ‘’ f Chuỗi (substring) thành phần bao gồm ký tự liên tiếp chuỗi Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT Các cách phân chia chuỗi ™ Sử dụng ký tự đặc biệt f Sử dụng ký tự đặc biệt (không ký tự chuỗi) để phân tách chuỗi f Chiều dài chuỗi khác f Truy xuất từ đầu chuỗi để tìm kiếm chuỗi f Thời gian truy xuất chuỗi chậm 800 H O A N G Chương Chuỗi 806 A N H 810 817 P H U O N G 2006 L O C Nguyễn Trung Trực - Khoa CNTT Các cách phân chia chuỗi ™ Sử dụng chiều dài chuỗi cố định f Sử dụng ký đệm vào chuỗi f Chiều dài chuỗi f Truy xuất trực cơng thức tính địa để tìm kiếm chuỗi f Thời gian truy xuất chuỗi nhanh 800 H 807 O A N Chương Chuỗi G A 814 N H P 821 H U 2006 O N G L O C Nguyễn Trung Trực - Khoa CNTT Các cách phân chia chuỗi ™ Sử dụng trỏ f Sử dụng trỏ vào chuỗi f Chiều dài chuỗi khác f Truy xuất trực trỏ để tìm kiếm chuỗi f Thời gian truy xuất chuỗi nhanh Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT Các cách phân chia chuỗi ™ Sử dụng trỏ đầu last H O A N G A N H P H U O N G L O C pointer 800 805 808 814 = pointer[i] bi = pointer[i+1] - với i < n = last Chương Chuỗi với i = n 2006 Nguyễn Trung Trực - Khoa CNTT Các cách phân chia chuỗi ™ Sử dụng trỏ cuối first H O A N G A N H P H U O N G L O C pointer 804 807 813 816 = first = pointer[i-1] +1 với i = bi = pointer[i] Chương Chuỗi với i > 2006 Nguyễn Trung Trực - Khoa CNTT Các hàm thủ tục ™ Các hàm f length(s): y Ví dụ: length(‘abc’) → f concat(s1, …, sn y trả số ký tự chuỗi s s2, …, sn): kết nối chuỗi s1, s2, Ví dụ: concat(‘abc’,’12’) → ‘abc12’ f copy(s, m, n): lấy chuỗi chuỗi s gồm n ký tự kể từ ký tự thứ m y Ví dụ: copy(‘abcde’,3,2) → ‘cd’ f pos(s1, s2): trả vị trí tìm thấy chuỗi s1 chuỗi s2 y Ví dụ: pos(‘bc’,’abcd’) → Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT Các hàm thủ tục ™ Các thủ tục f val(s, x, n): biến đổi chuỗi s thành giá trị số gán cho x; n gán số biến đổi y y Ví dụ: val(‘123.45’, x, n) gán số 123.45 cho x Ví dụ: val(’12a’, x, n) → x không xác định n f str(x, s): biến đổi giá trị số x thành giá trị chuỗi gán cho s y Ví dụ: str(123.45, s) gán chuỗi ‘123.45’ cho s Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 10 Các hàm thủ tục ™ Các thủ tục f delete(s, m, n): xóa n ký tự chuỗi s vị trí m y Ví dụ: chuỗi s ‘abcde’ delete(s,2,3) gán chuỗi ‘ae’ cho s f insert(s1, s2, m): xen chuỗi s1 vào chuỗi s2 vị trí m y Ví dụ: chuỗi s ‘abc’ insert(‘12’,s,2) gán chuỗi ‘a12bc’ cho s Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 11 Tìm kiếm chuỗi ™ Tìm chuỗi p có chiều dài m chuỗi a có chiều dài n Có hai trường hợp tìm kiếm: f Tìm thấy chuỗi p chuỗi a: kết trả vị trí ký tự lần tìm thấy f Khơng tìm thấy chuỗi p chuỗi a: kết trả ™ Các giải thuật f Giải thuật Brute-Force f Giải thuật Knuth-Morris-Pratt f Giải thuật Boyer-Moore Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 12 Giải thuật Brute-Force ™ Phương pháp fỞ vị trí ký tự a[i], so sánh ký tự tương ứng từ trái qua phải: p[1] với a[i], p[2] với a[i+1], …, p[m] với a[i+m-1] a x x x x x x x x x x i p x x x x x x Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 13 Giải thuật Brute-Force function Brute_Force (p, a: string): integer; var i, j, m, n: integer; begin m := length(p); n := length(a); i := 1; j := 1; repeat if a[i] = p[j] then begin i := i + 1; j := j + end else begin i := i - j + 1; j := end until (j > m) or (i > n); if j > m then Brute_Force := i - m else Brute_Force := end; Lệnh gọi: position := Brute_Force (p, a); Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 14 Giải thuật Knuth-Morris-Pratt ™ Phương pháp f Trong giải thuật Brute-Force, so sánh để p[j] khác với a[i] có j-1 ký tự chuỗi p trùng với ký tự tương ứng chuỗi a f Do đó, khơng cần phải cho i quay trở mà cho i tăng tiếp tục (thay i := i - j + i := i + 1) gán cho j giá trị thích hợp Mảng next[j] xác định giá trị thích hợp gán cho j Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 15 Giải thuật Knuth-Morris-Pratt Xét chuỗi p = ‘10100111’ j next[j] 1 1 1 1 1 1 1 2 Chương Chuỗi 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 2006 Nguyễn Trung Trực - Khoa CNTT 16 Giải thuật Knuth-Morris-Pratt function KMP (p, a: string): integer; var i, j, m, n: integer; next: array [1 255] of integer; procedure Init_Next; begin i := 1; j := 0; next[1] := 0; repeat if (j = 0) and (p[i] = p[j]) then begin i := i + 1; j := j + 1; next[i] := j end else j := next[j] until i >= m; end; Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 17 Giải thuật Knuth-Morris-Pratt begin {KMP} m := length(p); n := length(a); Init_Next; i := 1; j := 1; repeat if (j = 0) or (a[i] = p[j]) then begin i := i + 1; j := j + end else j := next[j] end until (j > m) or (i > n); if j > m then KMP := i - m else KMP := end; Lệnh gọi: position := KMP (p, a); Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 18 Giải thuật Knuth-Morris-Pratt cải tiến Chương Chuỗi 1 0 1 1 0 1 2006 Nguyễn Trung Trực - Khoa CNTT 19 Giải thuật Knuth-Morris-Pratt cải tiến procedure Init_Next; begin i := 1; j := 0; next[1] := 0; repeat if (j = 0) and (p[i] = p[j]) then begin i := i + 1; j := j + 1; if p[j] p[i] then next[i] := j else next[i] := next[j] end else j := next[j] until i >= m; end; Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 20 Giải thuật Boyer-Moore ™ Phương pháp f Xét chuỗi p từ phải qua trái so sánh chuỗi p với chuỗi a f Next[j] số vị trí ký tự mà chuỗi p di chuyển qua phải chuỗi p1 (bản chuỗi p) để có vị trí khác ký tự thứ j kể từ phải qua trái chuỗi p f Mảng skip[c] xác định vị trí i có so sánh khác y y skip[c] = m c không ký tự chuỗi p skip[c] = m-j c ký tự thứ j chuỗi p Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 21 Giải thuật Boyer-Moore Xét chuỗi p = ‘10110101’ j next[j] 1 1 1 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 Chương Chuỗi 1 1 1 1 1 1 1 1 1 2006 Nguyễn Trung Trực - Khoa CNTT 22 Giải thuật Boyer-Moore function Boyer_Moore (p, a: string): integer; var i, j, m, n: integer; skip: array [1 255] of integer; procedure Init_Skip; var i: 255; j: integer; begin for i := to 255 skip[i] := m; if skip[ord(p[j])] = m then skip[ord(p[j])] := m-j; end; begin m := length(p); n := length(a); Init_Skip; i := m; j := m; Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 23 Giải thuật Boyer-Moore repeat if a[i] = p[j] then begin i := i - 1; j := j - end else begin if m - j + > skip[ord(a[i])] then i := i+m-j+1 else i := i + skip[(ord(a[i])]; j := m end until (j < 1) or (i > n); if j < then Boyer_Moore := i + else Boyer_Moore := end; Chương Chuỗi 2006 Nguyễn Trung Trực - Khoa CNTT 24

Ngày đăng: 03/02/2018, 08:23

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

Tài liệu liên quan