Chiến lược biến đổi để trị | Học viện Báo chí và Tuyên truyền

Biến đổi về thể hiện đơn giản hoặc thuận tiện hơn của cùng bài toán, gọi là (instance simplification). Biến đổi về một dạng biểu diễn khác của cùng thể hiện bài toán, gọi là (representation change). Tài liệu giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời đọc đón xem!

lOMoARcPSD| 46560390
1
CHIẾN LƯỢC BIẾN ĐỔI ĐỂ TR
Các ặc trưng cơ bản
Các ví dụ minh họa
lOMoARcPSD| 46560390
2
CÁC ĐẶC TRƯNG CƠ BẢN
• Chiến lược biến i trị (transform-and-conquer) gồm hai
tầng (giai oạn):
Biến ổi thể hin (instance-input) của bài toán thể dễ gii
(hoặc giải hiệu quả) hơn
Giải bài toán trên thể hiện (input) ã ược biến ổi
CÁC ĐẶC TRƯNG CƠ BẢN
Có ba kiểu biến ổi
lOMoARcPSD| 46560390
3
Biến ổi về thhin ơn giản hoặc thuận tiện hơn của cùng bài
toán, gọi là (instance simplification)
Biến ổi về một dạng biểu diễn khác của cùng thhiện bài
toán, gọi là (representation change)
Biến ổi về một thể hiện của một bài toán khác ã giải thuật,
gọi là (problem reduction)
CÁC VÍ DỤ MINH HỌA
Bài toán kiểm tra tính duy nhất của một phần t
Giải thuật HeapSort
Qui tắc Horner
lOMoARcPSD| 46560390
4
Tính tổng S=1
3
+2
3
+…+n
3
Tính bội số chung nhnhất
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CA MỘT PHẦN TỬ
• Cho một danh sách các phần tử, kiểm tra các phn t
trong danh sách có duy nhất hay không (có phần tử nào
xuất hiện ít nhất là hai lần hay không)
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CA MỘT PHẦN TỬ
Nếu dùng chiến lược trực tiếp sẽ có giải thuật O(n
2
)
lOMoARcPSD| 46560390
5
Biến i trị bằng cách sp xếp (presorting) danh sách
tăng dần (biến i ầu vào của bài toán) sau ó thực hiện
việc kiểm tra tính duy nhất trên danh sách ược sắp
Giải thuật thực hiện chmột vòng lặp
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CA MỘT PHẦN TỬ
ALGORITHM PresortElementUniqueness(A[0..n − 1])
1 Sort the array A
2 for i 0 to n − 2 do
3 if A[i]= A[i + 1] return false
lOMoARcPSD| 46560390
6
4 return true
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CA MỘT PHẦN TỬ
Kích thước ầu vào là n
Thời gian sắp xếp là (nlog
2
n) khi dùng giải thuật tốt
(QuickSort)
Thời gian kiểm tra dòng 2-3 không quá (n)
T(n)= (nlog
2
n)+ (n)= (nlog
2
n)
Lưu ý: Có nhiều bài toán áp dụng “tiền sp xếp”
(presorting) như một kỹ thuật biến i tr
lOMoARcPSD| 46560390
7
GIẢI THUẬT HEAPSORT
Giải thuật HeapSort sp xếp một mảng số tăng dần dùng
chiến lược biến i trị bằng cách biu diễn lại các phần
tử của mảng (biến ổi biểu din ầu vào) trong quá trình
sắp
Việc biển ổi ược thực hiện nhcấu trúc dữ liệu HEAP
GIẢI THUẬT HEAPSORT
• Cho một mảng A, một Heap biu diễn A là một cây nhị
phân có các tính chất sau:
lOMoARcPSD| 46560390
8
Cây thứ tự, mỗi nút tương ứng với một phần tử của
mảng, gốc ứng với phần tử ầu tiên của mảng
Cây cân bằng và ược lấp ầy trên tất cả các mức, ngoại trừ
mức thấp nhất ược lấp ầy từ bên trái sang (có thể chưa lấp
y)
GIẢI THUẬT HEAPSORT
Một MaxHeap là một Heap mà giá trị của mỗi nút lớn hơn
(hoặc bằng) giá trị các nút con
lOMoARcPSD| 46560390
9
GIẢI THUẬT HEAPSORT
lOMoARcPSD| 46560390
10
GIẢI THUẬT HEAPSORT
Gọi i là chỉ số th tự của một nút (của mảng), thì chỉ số
các nút cha, con trái và con phải là:
PARENT(i) = i/2
LEFT_CHILD(i) = 2i
RIGHT_CHILD(i)= 2i+ 1
lOMoARcPSD| 46560390
11
GIẢI THUẬT HEAPSORT
• Giải thuật HeapSort biến ổi mảng về MaxHeap ể sắp xếp
như sau:
Biến ổi Heap (mảng) về một MaxHeap
Hoán ổi giá trị A[1] với A[n]
Loại nút n ra khỏi Heap chuyển Heap A[1..(n-1)] thành
một MaxHeap (ít hơn một phần tử)
Lặp lại các bước trên cho ến khi Heap chỉ còn một phần tử
lOMoARcPSD| 46560390
12
GIẢI THUẬT HEAPSORT
• Cần hai thủ tục (giải thuật) hỗ trcho HeapSort:
MaxHeappify(A[1..n], i), biến ổi cây con có gốc tại i thành
một MaxHeap (gốc tại i)
BuildMaxHeap(A[1..n]), biến ổi mảng (Heap) thành
MaxHeap
MaxHeapify
Đầu vào là một mảng (heap) A và chỉ số i trong mảng
lOMoARcPSD| 46560390
13
Các cây nhị phân ược nh gốc tại LEFT_CHILD(i) và
RIGHT_CHILD(i) là các MaxHeap nhưng A[i] có thể nh
hơn các con của nó
MaxHeapify ẩy giá trị A[i] xuống sao cho cây con ịnh gốc
tại A[i] là một MaxHeap
MaxHeapify
MaxHeapify(A[1..n], i)
1 l 2*i; r 2*i+1
2 if l<=n and A[l]>A[i] largest l
3 else largest i
lOMoARcPSD| 46560390
14
4 if r<=n and A[r]>A[largest] largest r
5 if largest i
6 Exchange(A[i], A[largest])
7 MaxHeapify(A, largest)
BuildMaxHeap
Các nút có chỉ số n/2 +1, n/2 +2, ..., n trong
A[1..n] là các lá của cây, mỗi nút như vậy là một
MaxHeap
BuildMaxHeap áp dụng MaxHeapify cho các nút con khác
lá của cây từ ới lên gốc bắt u từ nút n/2
lOMoARcPSD| 46560390
15
Kết quả là một MaxHeap tương ng với A[1..n]
BuildMaxHeap
BuildMaxHeap(A[1..n])
1 for i n/2 downto 1
2 do MaxHeapify(A, i)
lOMoARcPSD| 46560390
16
BuildMaxHeap
lOMoARcPSD| 46560390
17
HeapSort
HeapSort(A[1..n])
1 BuildMaxHeap(A)
2 for i n downto 2
3 do Exchange(A[1], A[i])
4 MaxHeapify(A, i-1, 1) // MaxHeapify(A[1..i-1], 1)
HeapSort
Kích thước ầu vào là n (số phn tử của mảng)
Gọi chiều cao của cây là h, do cây cân bằng nên h =
lOMoARcPSD| 46560390
18
log
2
n
Thời gian chạy của MaxHeapify là O(h)=O(log
2
n)
Thời gian chạy của BuilMaxHeap tối a là O(nlog
2
n)
Thời gian chạy của vòng lặp 2-4 là O(nlog
2
n) • Vậy
thời chạy của HeapSort là
T(n)= O(nlog
2
n)+O(n log
2
n)=O(nlog
2
n)
QUI TẮC HORNER
• Cho a thức p(x) = a
n
x
n
+ a
n−1
x
n−1
+ . . . + a
1
x + a
0
, tính
giá trị của a thức tại x cho trước
lOMoARcPSD| 46560390
19
QUI TẮC HORNER
• Biến ổi a thức p(x) = a
n
x
n
+ a
n−1
x
n−1
+ . . . + a
1
x + a
0
về
một dạng (biểu diễn) mới
p(x) = x(x. . . x(x(a
n
x + a
n−1
) + a
n-2
)+. . .+ a
1
) + a
0
n-
1 thừa số
Chuyển bài toán về tính tích các nhthức
QUI TẮC HORNER
p(x) = 2x
4
− x
3
+ 3x
2
+ x − 5
lOMoARcPSD| 46560390
20
= x(2x
3
− x
2
+ 3x + 1) − 5
= x(x(2x
2
− x + 3) + 1) − 5
= x(x(x(2x − 1) + 3) + 1) − 5
QUI TẮC HORNER
ALGORITHM Horner(a[0..n], x)
//a[0], a[1], .., a[n] là các hệ số tương ứng với x
0
, x
1
, …, x
n
1 p a[n]
2 for i n − 1 downto 0
3 do px p + a[i]
4 return p
| 1/26

Preview text:

lOMoAR cPSD| 46560390
CHIẾN LƯỢC BIẾN ĐỔI ĐỂ TRỊ
• Các ặc trưng cơ bản • Các ví dụ minh họa 1 lOMoAR cPSD| 46560390 CÁC ĐẶC TRƯNG CƠ BẢN
• Chiến lược biến ổi ể trị (transform-and-conquer) gồm hai tầng (giai oạn):
▪ Biến ổi thể hiện (instance-input) của bài toán ể có thể dễ giải
(hoặc giải hiệu quả) hơn
▪ Giải bài toán trên thể hiện (input) ã ược biến ổi CÁC ĐẶC TRƯNG CƠ BẢN • Có ba kiểu biến ổi 2 lOMoAR cPSD| 46560390
▪ Biến ổi về thể hiện ơn giản hoặc thuận tiện hơn của cùng bài
toán, gọi là (instance simplification)
▪ Biến ổi về một dạng biểu diễn khác của cùng thể hiện bài
toán, gọi là (representation change)
▪ Biến ổi về một thể hiện của một bài toán khác ã có giải thuật, gọi là (problem reduction) CÁC VÍ DỤ MINH HỌA
• Bài toán kiểm tra tính duy nhất của một phần tử • Giải thuật HeapSort • Qui tắc Horner 3 lOMoAR cPSD| 46560390
• Tính tổng S=13+23+…+n3
• Tính bội số chung nhỏ nhất
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CỦA MỘT PHẦN TỬ
• Cho một danh sách các phần tử, kiểm tra các phần tử
trong danh sách có duy nhất hay không (có phần tử nào
xuất hiện ít nhất là hai lần hay không)
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CỦA MỘT PHẦN TỬ
• Nếu dùng chiến lược trực tiếp sẽ có giải thuật O(n2) 4 lOMoAR cPSD| 46560390
• Biến ổi ể trị bằng cách sắp xếp (presorting) danh sách
tăng dần (biến ổi ầu vào của bài toán) sau ó thực hiện
việc kiểm tra tính duy nhất trên danh sách ược sắp
• Giải thuật thực hiện chỉ một vòng lặp
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CỦA MỘT PHẦN TỬ
ALGORITHM PresortElementUniqueness(A[0..n − 1]) 1 Sort the array A 2
for i ←0 to n − 2 do 3
if A[i]= A[i + 1] return false 5 lOMoAR cPSD| 46560390 4 return true
BÀI TOÁN KIỂM TRA TÍNH DUY
NHẤT CỦA MỘT PHẦN TỬ
• Kích thước ầu vào là n
• Thời gian sắp xếp là (nlog2n) khi dùng giải thuật tốt (QuickSort)
• Thời gian kiểm tra dòng 2-3 không quá (n)
T(n)= (nlog2n)+ (n)= (nlog2n)
• Lưu ý: Có nhiều bài toán áp dụng “tiền sắp xếp”
(presorting) như một kỹ thuật biến ổi ể trị 6 lOMoAR cPSD| 46560390 GIẢI THUẬT HEAPSORT
• Giải thuật HeapSort sắp xếp một mảng số tăng dần dùng
chiến lược biến ổi ể trị bằng cách biểu diễn lại các phần
tử của mảng (biến ổi biểu diễn ầu vào) trong quá trình sắp
• Việc biển ổi ược thực hiện nhờ cấu trúc dữ liệu HEAP GIẢI THUẬT HEAPSORT
• Cho một mảng A, một Heap biểu diễn A là một cây nhị
phân có các tính chất sau: 7 lOMoAR cPSD| 46560390
▪ Cây có thứ tự, mỗi nút tương ứng với một phần tử của
mảng, gốc ứng với phần tử ầu tiên của mảng
▪ Cây cân bằng và ược lấp ầy trên tất cả các mức, ngoại trừ
mức thấp nhất ược lấp ầy từ bên trái sang (có thể chưa lấp ầy) GIẢI THUẬT HEAPSORT
• Một MaxHeap là một Heap mà giá trị của mỗi nút lớn hơn
(hoặc bằng) giá trị các nút con 8 lOMoAR cPSD| 46560390 GIẢI THUẬT HEAPSORT 9 lOMoAR cPSD| 46560390 GIẢI THUẬT HEAPSORT
• Gọi i là chỉ số thứ tự của một nút (của mảng), thì chỉ số
các nút cha, con trái và con phải là: ▪ PARENT(i) = i/2 ▪ LEFT_CHILD(i) = 2i ▪ RIGHT_CHILD(i)= 2i+ 1 10 lOMoAR cPSD| 46560390 GIẢI THUẬT HEAPSORT
• Giải thuật HeapSort biến ổi mảng về MaxHeap ể sắp xếp như sau:
▪ Biến ổi Heap (mảng) về một MaxHeap
▪ Hoán ổi giá trị A[1] với A[n]
▪ Loại nút n ra khỏi Heap và chuyển Heap A[1..(n-1)] thành
một MaxHeap (ít hơn một phần tử)
▪ Lặp lại các bước trên cho ến khi Heap chỉ còn một phần tử 11 lOMoAR cPSD| 46560390 GIẢI THUẬT HEAPSORT
• Cần hai thủ tục (giải thuật) hỗ trợ cho HeapSort:
▪ MaxHeappify(A[1..n], i), biến ổi cây con có gốc tại i thành một MaxHeap (gốc tại i)
▪ BuildMaxHeap(A[1..n]), biến ổi mảng (Heap) thành MaxHeap MaxHeapify
• Đầu vào là một mảng (heap) A và chỉ số i trong mảng 12 lOMoAR cPSD| 46560390
• Các cây nhị phân ược ịnh gốc tại LEFT_CHILD(i) và
RIGHT_CHILD(i) là các MaxHeap nhưng A[i] có thể nhỏ hơn các con của nó
• MaxHeapify ẩy giá trị A[i] xuống sao cho cây con ịnh gốc tại A[i] là một MaxHeap MaxHeapify MaxHeapify(A[1..n], i) 1 l ← 2*i; r ← 2*i+1 2
if l<=n and A[l]>A[i] largest ← l 3 else largest ← i 13 lOMoAR cPSD| 46560390 4
if r<=n and A[r]>A[largest] largest ← r 5 if largest i 6 Exchange(A[i], A[largest]) 7 MaxHeapify(A, largest) BuildMaxHeap
• Các nút có chỉ số n/2 +1, n/2 +2, ..., n trong
A[1..n] là các lá của cây, mỗi nút như vậy là một MaxHeap
• BuildMaxHeap áp dụng MaxHeapify cho các nút con khác
lá của cây từ dưới lên gốc bắt ầu từ nút n/2 14 lOMoAR cPSD| 46560390
• Kết quả là một MaxHeap tương ứng với A[1..n] BuildMaxHeap BuildMaxHeap(A[1..n]) 1
for i ← n/2 downto 1 2 do MaxHeapify(A, i) 15 lOMoAR cPSD| 46560390 BuildMaxHeap 16 lOMoAR cPSD| 46560390 HeapSort HeapSort(A[1..n]) 1 BuildMaxHeap(A) 2
for i ← n downto 2 3
do Exchange(A[1], A[i]) 4
MaxHeapify(A, i-1, 1) // MaxHeapify(A[1..i-1], 1) HeapSort
• Kích thước ầu vào là n (số phần tử của mảng)
• Gọi chiều cao của cây là h, do cây cân bằng nên h = 17 lOMoAR cPSD| 46560390 log2n
▪ Thời gian chạy của MaxHeapify là O(h)=O(log2n)
▪ Thời gian chạy của BuilMaxHeap tối a là O(nlog2n)
▪ Thời gian chạy của vòng lặp 2-4 là O(nlog2 n) • Vậy
thời chạy của HeapSort là
T(n)= O(nlog2n)+O(n log2n)=O(nlog2n) QUI TẮC HORNER
• Cho a thức p(x) = anxn + an−1xn−1 + . . . + a1x + a0, tính
giá trị của a thức tại x cho trước 18 lOMoAR cPSD| 46560390 QUI TẮC HORNER
• Biến ổi a thức p(x) = anxn + an−1xn−1 + . . . + a1x + a0 về
một dạng (biểu diễn) mới
p(x) = x(x. . . x(x(anx + an−1) + an-2)+. . .+ a1) + a0 n- 1 thừa số
➢ Chuyển bài toán về tính tích các nhị thức QUI TẮC HORNER
p(x) = 2x4 − x3 + 3x2 + x − 5 19 lOMoAR cPSD| 46560390
= x(2x3 − x2 + 3x + 1) − 5
= x(x(2x2 − x + 3) + 1) − 5
= x(x(x(2x − 1) + 3) + 1) − 5 QUI TẮC HORNER
ALGORITHM Horner(a[0..n], x)
//a[0], a[1], .., a[n] là các hệ số tương ứng với x0, x1, …, xn 1 p ← a[n] 2
for i ←n − 1 downto 0 3 do p←x p + a[i] 4 return p 20