CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Phạm Quang Dũng Bộ môn KHMT dungpq@soict hust edu vn THUẬT TOÁN ỨNG DỤNG 1 QUY HOẠCH ĐỘNG NộI dung Tổng quan chia để trị Dãy con cực đại Dãy con tăng dần dài nhất[.]
THUẬT TOÁN ỨNG DỤNG QUY HOẠCH ĐỘNG Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn NộI dung Tổng quan chia để trị Dãy cực đại Dãy tăng dần dài Quy hoạch động Sơ đồ chung Chia toán xuất phát thành tốn khơng thiết độc lập với Giải toán từ nhỏ đến lớn, lời giải lưu trữ lại vào bảng Bài toán nhỏ phải giải cách trực tiếp Xây dựng lời giải tốn lớn từ lời giải có toán nhỏ (truy hồi) Số lượng toán cần bị chặn đa thức kích thước liệu đầu vào Phù hợp để giải hiệu số toán tối ưu tổ hợp Bài toán dãy cực đại Cho dãy số nguyên a = a1, a2,…, aN Hãy tìm dãy bao gồm phần tử liên tiếp dãy a có tổng lớn Bài tốn dãy cực đại Phân chia Ký hiệu Pi tốn tìm dãy bao gồm phần tử liên tiếp có tổng cực đại mà phần tử cuối ai, với i = 1,…, n Ký hiệu Si tổng phần tử lời giải Pi, i = 1,…, n S1 = a1 Si = Si -1 + ai, Si-1 > ai, Si-1 Tổng phần tử dãy cực đại toán xuất phát max{S1, S2, …, Sn} Bài toán dãy cực đại maxsubseq(a1,a2, ., aN){ s[1] = a[1]; res = s[1]; for i = → N do{ if s[i-1] > then { s[i] = s[i-1] + a[i]; }else{ s[i] = a[i]; } if s[i] > res then res = s[i]; } return res; } Bài toán dãy tăng dần dài Cho dãy số nguyên a = a1, a2,…, aN Hãy tìm dãy tăng dần bao gồm phần tử không thiết liên tiếp dãy a có số phần tử lớn Bài tốn dãy tăng dần dài Ký hiệu Pi tốn tìm dãy cực đại mà phần tử cuối ai, với i = 1,…, n Ký hiệu Si số phần tử lời giải Pi, i = 1,…, n S1 = Si = max{1, max{Sj +1| j < i aj < }} Số phần tử dãy cực đại toán xuất phát max{S1, S2, …, Sn} Bài toán dãy tăng dần dài incsubseq(a1,a2, ., aN){ s[1] = 1; res = s[1]; for i = → N do{ s[i] = 1; for j = → i-1 do{ if a[j] < a[i] then{ if s[i] < s[j] + then{ s[i] = s[j] + 1; } } } if s[i] > res then res = s[i]; } return res; } Dãy chung dài Ký hiệu X = X1, X2, …, Xn, dãy X dãy tạo việc loại bỏ số phần tử X Đầu vào Cho dãy X = X1, X2, …, Xn Y = Y1, Y2, …, Ym Đầu Tìm dãy chung X Y có độ dài lớn 10 Truy vết Bài toán dãy chung dài S[i][j] = S[i-1][j-1] + a[i][j] = ‘c’ (đi chéo) Ngược lại Nếu S[i-1][j] > S[i][j-1] a[i][j] = ‘u’; (đi lên) Ngược lại a[i][j] = ‘l’ (đi sang trái) 18 Truy vết lcs([X1,…,Xn], [Y1,…,Ym]){ for i = → n S[i][0] = 0; for j = → m S[0][j] = 0; for i = → n do{ for j = → m do{ if Xi = Yj then{ S[i][j] = S[i-1][j-1] + 1; end_i = i; end_j = j; a[i][j] = ‘c’; }else{ if S[i-1][j] > S[i][j-1] then{ S[i][j] = S[i-1][j]; a[i][j] = ‘u’; }else{ S[i][j] = S[i][j-1]; a[i][j] = ‘l’; } } } } return S[n][m]; 19 } Truy vết trace(end_i, end_j, a){ i = end_i; j = end_j; while(true){ if(a[i][j] == 'c’){ output(i,j); i = i-1; j = j-1; }else if(a[i][j] == 'u'){ i = i-1; }else{ j = j-1; } if(i == || j == 0) break; } } 20 ... Truy vết Mỗi bước xây dựng lời giải toán từ lời giải toán nhỏ ta thường định lựa chọn phương án → ghi nhớ định lựa chọn vào cấu trúc liệu để truy vết dẫn lời giải đầy đủ cho toán ban đầu 13... tốn khơng thiết độc lập với Giải toán từ nhỏ đến lớn, lời giải lưu trữ lại vào bảng Bài toán nhỏ phải giải cách trực tiếp Xây dựng lời giải toán lớn từ lời giải có tốn nhỏ (truy hồi) Số... lớn từ lời giải có tốn nhỏ (truy hồi) Số lượng toán cần bị chặn đa thức kích thước liệu đầu vào Phù hợp để giải hiệu số toán tối ưu tổ hợp Bài toán dãy cực đại Cho dãy số nguyên a = a1, a2,…,