Biến đổi xâu
Số trang: 15
Loại file: pdf
Dung lượng: 245.76 KB
Lượt xem: 19
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Cho xâu ký tự X, xét 3 phép biến đổi: a) Insert(i, C): i là số, C là ký tự: Phép Insert chèn ký tự C vào sau vị trí i của xâu X. b) Replace(i, C): i là số, C là ký tự: Phép Replace thay ký tự tại vị trí i của xâu X bởi ký tự C. c) Delete(i): i là số, Phép Delete xoá ký tự tại vị trí i của xâu X. Yêu cầu: Cho trước xâu Y, hãy tìm một số ít nhất các phép biến đổi trên để biến xâu X thành xâu...
Nội dung trích xuất từ tài liệu:
Biến đổi xâu Biến đổi xâu Cho xâu ký tự X, xét 3 phép biến đổi: a) Insert(i, C): i là số, C là ký tự: Phép Insert chèn ký tự C vào sau vị trí i của xâu X. b) Replace(i, C): i là số, C là ký tự: Phép Replace thay ký tự tại vị trí i của xâu X bởi ký tự C. c) Delete(i): i là số, Phép Delete xoá ký tự tại vị trí i của xâu X. Yêu cầu: Cho trước xâu Y, hãy tìm một số ít nhất các phép biến đổi trên để biến xâu X thành xâu Y. Input: file văn bản STR.INP • Dòng 1: Chứa xâu X (độ dài ≤ 100) • Dòng 2: Chứa xâu Y (độ dài ≤ 100) Output: file văn bản STR.OUT ghi các phép biến đổi cần thực hiện và xâu X tại mỗi phép biến đổi. STR.INP STR.OUT 7 PBBCEFATZ -> Delete(9) -> PBBCEFAT PBBCEFAT -> Delete(8) -> PBBCEFA PBBCEFATZ PBBCEFA -> Insert(4, B) -> PBBCBEFA QABCDABEFA PBBCBEFA -> Insert(4, A) -> PBBCABEFA PBBCABEFA -> Insert(4, D) -> PBBCDABEFA PBBCDABEFA -> Replace(2, A) -> PABCDABEFA PABCDABEFA -> Replace(1, Q) -> QABCDABEFA Cách giải: Đối với xâu ký tự thì việc xoá, chèn sẽ làm cho các phần tử phía sau vị trí biến đổi bị đánh chỉ số lại, gây khó khăn cho việc quản lý vị trí. Để khắc phục điều này, ta sẽ tìm một thứ tự biến đổi thoả mãn: Phép biến đổi tại vị trí i bắt buộc phải thực hiện sau các phép biến đổi tại vị trí i + 1, i + 2, … Ví dụ: X = ‘ABCD’; Insert(0, E) sau đó Delete(4) cho ra X = ‘EABD’. Cách này không tuân thủ nguyên tắc Delete(3) sau đó Insert(0, E) cho ra X = ‘EABD’. Cách này tuân thủ nguyên tắc đề ra. Nói tóm lại ta sẽ tìm một dãy biến đổi có vị trí thực hiện giảm dần. 1. Công thức truy hồi Giả sử m là độ dài xâu X và n là độ dài xâu Y. Gọi F[i, j] là số phép biến đổi tối thiểu để biến xâu gồm i ký tự đầu của xâu X: X1X2 … Xi thành xâu gồm j ký tự đầu của xâu Y: Y1Y2…Yj. Ta nhận thấy rằng X = X1X2…Xm và Y = Y1Y2…Yn nên: • Nếu Xm = Yn thì ta chỉ cần biến đoạn X1X2…Xm-1 thành Y1Y2…Yn-1 tức là trong trường hợp này F[m, n] = F[m - 1, n - 1]. • Nếu Xm ≠ Yn thì tại vị trí Xm ta có thể sử dụng một trong 3 phép biến đổi: a) Hoặc chèn vào sau vị trí m của X, một ký tự đúng bằng Yn: Thì khi đó F[m, n] sẽ bằng 1 phép chèn vừa rồi cộng với số phép biến đổi biến dãy X1…Xm thành dãy Y1…Yn-1: F[m, n] = 1 + F[m, n - 1] b) Hoặc thay vị trí m của X bằng một ký tự đúng bằng Yn Thì khi đó F[ m, n] sẽ bằng 1 phép thay vừa rồi cộng với số phép biến đổi biến dãy X1…Xm-1 thành dãy Y1…Yn-1: F[m, n] = 1 + F[m-1, n - 1] c) Hoặc xoá vị trí thứ m của X Thì khi đó F[m, n] sẽ bằng 1 phép xoá vừa rồi cộng với số phép biến đổi biến dãy X1…Xm-1 thành dãy Y1…Yn: F[m, n] = 1 + F[m-1, n] Vì F[m, n] phải là nhỏ nhất có thể, nên trong trường hợp Xm ≠ Yn thì F[m, n] = min(F[m, n - 1], F[m - 1, n - 1], F[m - 1, n]) + 1. Ta xây dựng xong công thức truy hồi. 2. Cơ sở quy hoạch động • F[0, j] là số phép biến đổi biến xâu rỗng thành xâu gồm j ký tự đầu của F. Nó cần tối thiểu j phép chèn: F[0, j] = j • F[i, 0] là số phép biến đổi biến xâu gồm i ký tự đầu của S thành xâu rỗng, nó cần tối thiểu i phép xoá: F[i, 0] = i Vậy đầu tiên bảng phương án F (cỡ[0..m, 0..n]) được khởi tạo hàng 0 và cột 0 là cơ sở quy hoạch động. Từ đó dùng công thức truy hồi tính ra tất cả các phần tử bảng B. Sau khi tính xong thì F[m, n] cho ta biết số phép biến đổi tối thiểu. Truy vết: • Nếu Xm = Yn thì chỉ việc xét tiếp F[m - 1, n - 1]. • Nếu không, xét 3 trường hợp: ♦ Nếu F[m, n] = F[m, n - 1] + 1 thì phép biến đổi đầu tiên được sử dụng là: Insert(m, Yn) ♦ Nếu F[m, n] = F[m - 1, n - 1] + 1 thì phép biến đổi đầu tiên được sử dụng là: Replace(m, Yn) ♦ Nếu F[m, n] = F[m - 1, n] + 1 thì phép biến đổi đầu tiên được sử dụng là: Delete(m) Đưa về bài toán với m, n nhỏ hơn truy vết tiếp cho tới khi về F[0, 0] Ví dụ: X =’ ABCD’; Y = ‘EABD’ bảng phương án là: Lưu ý: khi truy vết, để tránh truy nhập ra ngoài bảng, nên tạo viền cho bảng. PROG03_3.PAS * Biến đổi xâu program StrOpt; const max = 100; var X, Y: String[2 * max]; F: array[-1..max, -1..max] of Integer; m, n: Integer; procedure Enter; {Nhập dữ liệu từ thiết bị nhập chuẩn} begin ReadLn(X); ReadLn(Y); m := Length(X); n := Length(Y); end; function Min3(x, y, z: Integer): Integer; {Cho giá trị nhỏ nhất trong 3 giá trị x, y, z} var t: Integer; begin if x < y then t := x else t := y; if z < t then t := z; Min3 := t; end; procedure Optimize; var i, j: Integer; begin {Khởi tạo viền cho bảng phương án} for i := 0 to m do F[i, -1] := max + 1; for j := 0 to n do F[-1, j] := max + 1; {Lưu cơ sở quy hoạch động} for j := 0 to n do F[0, j] := j; for i := 1 to m do F[i, 0] := i; {Dùng công thức truy hồi tính toàn bảng phương án} for i := 1 to m do for j := 1 to n do if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1] else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1; end; procedure Trace; {Truy vết} begin WriteLn(F[m, n]); {F[m, n] chính là số ít nhất các phép biến đổi cần thực hiện} while (m 0) or (n 0) do {Vòng lặp kết thúc khi m = n = 0} if X[m] = Y[n] then {Hai ký tự cuối của 2 xâu giống nhau} begin Dec(m); Dec(n); {Chỉ việc truy chéo lên trên bảng phương án} end else {Tại đây cần một phép biến đổi} begin Write(X, ' -> '); {In ra xâu X trước khi biến đổi} if F[m, n] = F[m, n - 1] + 1 then {Nếu đây là phép chèn} begin Write('Insert(', m, ', ', Y[n], ')'); Insert(Y[n], X, m + 1); Dec(n); {Truy sang phải} end else if F[m, n] = F[m - 1, n - 1] + 1 then {Nếu đây là phép thay} begin Write('Replace(', m, ', ', Y[n], ')'); X[m] := Y[n]; Dec(m); Dec(n); {Truy chéo lên trên} end ...
Nội dung trích xuất từ tài liệu:
Biến đổi xâu Biến đổi xâu Cho xâu ký tự X, xét 3 phép biến đổi: a) Insert(i, C): i là số, C là ký tự: Phép Insert chèn ký tự C vào sau vị trí i của xâu X. b) Replace(i, C): i là số, C là ký tự: Phép Replace thay ký tự tại vị trí i của xâu X bởi ký tự C. c) Delete(i): i là số, Phép Delete xoá ký tự tại vị trí i của xâu X. Yêu cầu: Cho trước xâu Y, hãy tìm một số ít nhất các phép biến đổi trên để biến xâu X thành xâu Y. Input: file văn bản STR.INP • Dòng 1: Chứa xâu X (độ dài ≤ 100) • Dòng 2: Chứa xâu Y (độ dài ≤ 100) Output: file văn bản STR.OUT ghi các phép biến đổi cần thực hiện và xâu X tại mỗi phép biến đổi. STR.INP STR.OUT 7 PBBCEFATZ -> Delete(9) -> PBBCEFAT PBBCEFAT -> Delete(8) -> PBBCEFA PBBCEFATZ PBBCEFA -> Insert(4, B) -> PBBCBEFA QABCDABEFA PBBCBEFA -> Insert(4, A) -> PBBCABEFA PBBCABEFA -> Insert(4, D) -> PBBCDABEFA PBBCDABEFA -> Replace(2, A) -> PABCDABEFA PABCDABEFA -> Replace(1, Q) -> QABCDABEFA Cách giải: Đối với xâu ký tự thì việc xoá, chèn sẽ làm cho các phần tử phía sau vị trí biến đổi bị đánh chỉ số lại, gây khó khăn cho việc quản lý vị trí. Để khắc phục điều này, ta sẽ tìm một thứ tự biến đổi thoả mãn: Phép biến đổi tại vị trí i bắt buộc phải thực hiện sau các phép biến đổi tại vị trí i + 1, i + 2, … Ví dụ: X = ‘ABCD’; Insert(0, E) sau đó Delete(4) cho ra X = ‘EABD’. Cách này không tuân thủ nguyên tắc Delete(3) sau đó Insert(0, E) cho ra X = ‘EABD’. Cách này tuân thủ nguyên tắc đề ra. Nói tóm lại ta sẽ tìm một dãy biến đổi có vị trí thực hiện giảm dần. 1. Công thức truy hồi Giả sử m là độ dài xâu X và n là độ dài xâu Y. Gọi F[i, j] là số phép biến đổi tối thiểu để biến xâu gồm i ký tự đầu của xâu X: X1X2 … Xi thành xâu gồm j ký tự đầu của xâu Y: Y1Y2…Yj. Ta nhận thấy rằng X = X1X2…Xm và Y = Y1Y2…Yn nên: • Nếu Xm = Yn thì ta chỉ cần biến đoạn X1X2…Xm-1 thành Y1Y2…Yn-1 tức là trong trường hợp này F[m, n] = F[m - 1, n - 1]. • Nếu Xm ≠ Yn thì tại vị trí Xm ta có thể sử dụng một trong 3 phép biến đổi: a) Hoặc chèn vào sau vị trí m của X, một ký tự đúng bằng Yn: Thì khi đó F[m, n] sẽ bằng 1 phép chèn vừa rồi cộng với số phép biến đổi biến dãy X1…Xm thành dãy Y1…Yn-1: F[m, n] = 1 + F[m, n - 1] b) Hoặc thay vị trí m của X bằng một ký tự đúng bằng Yn Thì khi đó F[ m, n] sẽ bằng 1 phép thay vừa rồi cộng với số phép biến đổi biến dãy X1…Xm-1 thành dãy Y1…Yn-1: F[m, n] = 1 + F[m-1, n - 1] c) Hoặc xoá vị trí thứ m của X Thì khi đó F[m, n] sẽ bằng 1 phép xoá vừa rồi cộng với số phép biến đổi biến dãy X1…Xm-1 thành dãy Y1…Yn: F[m, n] = 1 + F[m-1, n] Vì F[m, n] phải là nhỏ nhất có thể, nên trong trường hợp Xm ≠ Yn thì F[m, n] = min(F[m, n - 1], F[m - 1, n - 1], F[m - 1, n]) + 1. Ta xây dựng xong công thức truy hồi. 2. Cơ sở quy hoạch động • F[0, j] là số phép biến đổi biến xâu rỗng thành xâu gồm j ký tự đầu của F. Nó cần tối thiểu j phép chèn: F[0, j] = j • F[i, 0] là số phép biến đổi biến xâu gồm i ký tự đầu của S thành xâu rỗng, nó cần tối thiểu i phép xoá: F[i, 0] = i Vậy đầu tiên bảng phương án F (cỡ[0..m, 0..n]) được khởi tạo hàng 0 và cột 0 là cơ sở quy hoạch động. Từ đó dùng công thức truy hồi tính ra tất cả các phần tử bảng B. Sau khi tính xong thì F[m, n] cho ta biết số phép biến đổi tối thiểu. Truy vết: • Nếu Xm = Yn thì chỉ việc xét tiếp F[m - 1, n - 1]. • Nếu không, xét 3 trường hợp: ♦ Nếu F[m, n] = F[m, n - 1] + 1 thì phép biến đổi đầu tiên được sử dụng là: Insert(m, Yn) ♦ Nếu F[m, n] = F[m - 1, n - 1] + 1 thì phép biến đổi đầu tiên được sử dụng là: Replace(m, Yn) ♦ Nếu F[m, n] = F[m - 1, n] + 1 thì phép biến đổi đầu tiên được sử dụng là: Delete(m) Đưa về bài toán với m, n nhỏ hơn truy vết tiếp cho tới khi về F[0, 0] Ví dụ: X =’ ABCD’; Y = ‘EABD’ bảng phương án là: Lưu ý: khi truy vết, để tránh truy nhập ra ngoài bảng, nên tạo viền cho bảng. PROG03_3.PAS * Biến đổi xâu program StrOpt; const max = 100; var X, Y: String[2 * max]; F: array[-1..max, -1..max] of Integer; m, n: Integer; procedure Enter; {Nhập dữ liệu từ thiết bị nhập chuẩn} begin ReadLn(X); ReadLn(Y); m := Length(X); n := Length(Y); end; function Min3(x, y, z: Integer): Integer; {Cho giá trị nhỏ nhất trong 3 giá trị x, y, z} var t: Integer; begin if x < y then t := x else t := y; if z < t then t := z; Min3 := t; end; procedure Optimize; var i, j: Integer; begin {Khởi tạo viền cho bảng phương án} for i := 0 to m do F[i, -1] := max + 1; for j := 0 to n do F[-1, j] := max + 1; {Lưu cơ sở quy hoạch động} for j := 0 to n do F[0, j] := j; for i := 1 to m do F[i, 0] := i; {Dùng công thức truy hồi tính toàn bảng phương án} for i := 1 to m do for j := 1 to n do if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1] else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1; end; procedure Trace; {Truy vết} begin WriteLn(F[m, n]); {F[m, n] chính là số ít nhất các phép biến đổi cần thực hiện} while (m 0) or (n 0) do {Vòng lặp kết thúc khi m = n = 0} if X[m] = Y[n] then {Hai ký tự cuối của 2 xâu giống nhau} begin Dec(m); Dec(n); {Chỉ việc truy chéo lên trên bảng phương án} end else {Tại đây cần một phép biến đổi} begin Write(X, ' -> '); {In ra xâu X trước khi biến đổi} if F[m, n] = F[m, n - 1] + 1 then {Nếu đây là phép chèn} begin Write('Insert(', m, ', ', Y[n], ')'); Insert(Y[n], X, m + 1); Dec(n); {Truy sang phải} end else if F[m, n] = F[m - 1, n - 1] + 1 then {Nếu đây là phép thay} begin Write('Replace(', m, ', ', Y[n], ')'); X[m] := Y[n]; Dec(m); Dec(n); {Truy chéo lên trên} end ...
Tìm kiếm theo từ khóa liên quan:
Công nghệ thông tin cấu trúc dữ liệu lý thuyết đồ thị Javascript ASP.NET Tin học đại cương giáo trình Tin học đại cương bài giảng Tin học đại cương tài liệu Tin học đại cương lý thuyết Tin học đại cươngGợi ý tài liệu liên quan:
-
52 trang 428 1 0
-
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 315 0 0 -
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 310 0 0 -
Ứng dụng công cụ Quizizz thiết kế trò chơi học tập trong giảng dạy học phần tin học đại cương
12 trang 297 0 0 -
74 trang 294 0 0
-
96 trang 289 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 288 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 277 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 271 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0