Data Structure and Algorithm 1Qui hoạch động Dr.. Data Structure and Algorithm 2• Robert Sedgewick, and Kevin Wayne, “Algorithms” Princeton University, 2011, Addison Wesley • Algorithm
Trang 1Data Structure and Algorithm 1
Qui hoạch động
Dr Dao Nam Anh
Trang 2Data Structure and Algorithm 2
• Robert Sedgewick, and Kevin Wayne,
“Algorithms” Princeton University, 2011, Addison
Wesley
• Algorithm in C (Parts 1-5 Bundle)- Third Edition
by Robert Sedgewick, Addison-Wesley
• Cấu trúc dữ liệu và giải thuật, Đinh Mạnh Tường.
• Giải thuật và lập trình, Lê Minh Hoàng, Đại Học
Sư Phạm, 2002
Trang 3Data Structure and Algorithm 3
tập dữ liệu có kích thước ½
Chia vấn đề này thành 2 phần và thực hiện từng
phần
• Chi phí thời gian: T N = T k + T N-k + 1
• Many recursive programs use recursive calls on two subsets of inputs
(two halves usually)
Divide the problem and solve them – divide and conquer paradigm
Complexity: T N = T k + T N-k + 1
Trang 4Data Structure and Algorithm 4
Trang 5Data Structure and Algorithm 5
Trang 6Data Structure and Algorithm 6
2
3
Trang 7Data Structure and Algorithm 7
Trang 8Data Structure and Algorithm 8
Trang 9Data Structure and Algorithm 9
Trang 10Data Structure and Algorithm 10
7 3
Trang 11Data Structure and Algorithm 11
7 3
8
Trang 12Data Structure and Algorithm 12
71
2
3
Trang 13Data Structure and Algorithm 13
71
2
3
10 1
Trang 14Data Structure and Algorithm 14
71
Trang 15Data Structure and Algorithm 15
71
12
7 1
3 2
7 3
Trang 16Data Structure and Algorithm 16
71
12
7 1
3 2
7 3
Trang 17Data Structure and Algorithm 17
các chương trình này thường kéo theo những
đòi hỏi lớn về không gian bộ nhớ và một khối
lượng tính toán khổng lồ.
một kỹ thuật nhằm đơn giản hóa việc tính toán
các công thức truy hồi bằng cách lưu trữ toàn
bộ hay một phần kết quả tính toán tại mỗi
bước với mục đích sử dụng lại
Trang 18Data Structure and Algorithm 18
toán “từ dưới lên” (Bottom-up).
• Từ “programming” ở đây không liên quan gì tới việc
lập trình cho máy tính, đó là một thuật ngữ mà các
nhà toán học hay dùng để chỉ ra các bước chung
trong việc giải quyết một dạng bài toán hay một lớp
các vấn đề
• Không có một thuật toán tổng quát để giải tất cả các
bài toán quy hoạch động.
Trang 19Data Structure and Algorithm 19
con đó Việc giải từng bài toán con lại đưa về phép
phân rã tiếp thành nhiều bài toán nhỏ hơn và lại đi giải
tiếp bài toán nhỏ hơn đó bất kể nó đã được giải hay
chưa.
• Quy hoạch động bắt đầu từ việc giải tất cả các bài
toán nhỏ nhất ( bài toán cơ sở) để từ đó từng bước
giải quyết những bài toán lớn hơn, cho tới khi giải
được bài toán lớn nhất (bài toán ban đầu).
Trang 20Data Structure and Algorithm 20
trọng lượng khác nhau W[i], có giá trị khác nhau
V[i] Một tên trộm đột nhập vào siêu thị, tên trộm
mang theo một cái túi có thể mang được tối đa
» N types of items of varying size and value
» One knapsack (belongs to a thief!)
Find: the combination of items that maximize the total value
Trang 21Data Structure and Algorithm 21
bằng cách chọn trong các gói {1, 2, …,
i} với giới hạn trọng lượng j
Thì giá trị lớn nhất khi được chọn trong số
n gói với giới hạn trọng lượng M chính
là F[n, M].
Trang 22Data Structure and Algorithm 22
trong số các gói {1, 2, …, i - 1, i} để có giá trị
Trang 23Data Structure and Algorithm 23
mà W[i] ≤ j) thì F[i, j] bằng giá trị gói thứ i là V[i]
cộng với giá trị lớn nhất có thể có được bằng cách
chọn trong số các gói {1, 2, …, i - 1} với giới hạn
trọng lượng j - W[i] Tức là về mặt giá trị thu được:
F[i, j] = V[i] + F[i - 1, j - W[i]]
Vì theo cách xây dựng F[i, j] là giá trị lớn nhất có thể,
nên F[i, j] sẽ là max trong 2 giá trị thu được ở trên.
Trang 24Data Structure and Algorithm 24
{ int i, space, max, maxi, t;
if (maxKnown[M] != unknown) return maxKnown[M];
for (i = 0, max = 0; i < N; i++)
if ((space = M-items[i].size) >= 0)
if ((t = knap(space) + items[i].val) > max) { max = t; maxi = i; }
maxKnown[M] = max; itemKnown[M] = items[maxi];
return max; }
Trang 25Data Structure and Algorithm 25