-Trong phương pháp kết tập của phép phân tích khấu trừ ta tính thời gian tổng cộng của dãy n phép toán trong trường hợp xấu nhất là Tn.. -Vậy trong trường hợp xấu nhất, mức hao phí trung
Trang 1PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN
PHÂN TÍCH KHẤU TRỪ
(Amortized Analysis)
Giảng viên hướng dẫn: TS Hồng Quang
Học viên thực hiện: Võ Thanh Minh
Nguyễn Quang
Hồ Văn Lâm Phạm Vinh Trần Thị Quế Vy
Trang 2-Trong phương pháp kết tập của phép phân tích khấu
trừ ta tính thời gian tổng cộng của dãy n phép toán trong trường hợp xấu nhất là T(n)
-Vậy trong trường hợp xấu nhất, mức hao phí trung
bình hay mức hao phí khấu trừ của mỗi phép toán là
T(n)/n
-Mức hao phí khấu trừ này áp dụng cho mỗi phép toán, thậm chí khi có vài kiểu phép toán trong dãy
Trang 3Ta xét dãy n phép toán trên Stack bao gồm:
- PUSH(S,x) bỏ đối tượng x vào stack S
- POP(S) lấy một đối tượng ra từ đầu stack S và trả về đối tượng được kéo ra
- MULTIPOP(S,k) để lấy k đối tượng trên cùng ra khỏi stack S hoặc kéo nguyên tất cả các đối tượng trong Stack nếu nó chứa ít hơn k đối tượng
MULTIPOP(S, k)
1 while not STACK-EMPTY(S) and k ≠ 0
2 do POP(S)
3 k → k - 1
Trang 4M ULTIPOP(S, 4)
top 23
33 4 45 4 78
Stack S
Trang 5Như vậy chi phí để thực hiện một trong ba phép toán trên (trong trường hợp xấu nhất) là O(n).
Do đó tổng chi phí T(n) để thực hiện một dãy n phép toán trên
Nhưng nếu sử dụng phương pháp Phân tích khấu trừ để đánh giá thì ta có tổng chi phí T(n) để thực hiện n phép toán đó chỉ là O(n)
Trang 6Nếu ta xét chi tiết:
-Mỗi đối tượng trong Stack có thể được lấy ra (POP) tối
đa là một lần sau khi nó được bỏ vào (PUSH) Số lần
PUSH tối đa là n, vậy số lần gọi POP kể cả từ MULTIPOP cũng chỉ là n.
-Vậy với bất kì giá trị nào của n, một dãy n phép toán PUSH, POP và MULTIPOP bất kì đều chiếm một tổng O(n) thời gian
Do đó hao phí khấu trừ của mỗi thao tác là O(n)/n = O(1).
Trang 7Để thực thi một bộ đếm nhị phân k bít, đếm lên từ 0, ta dùng
một mảng A[0 k-1] làm bộ đếm Một số nhị phân của x
được lưu trữ trong bộ đếm có bit thấp nhất của nó lưu trong
A[0] và bit cao nhất trong A[k-1], sao cho
Ban đầu gi trị bộ đếm bằng 0 nên A[i]=0 với
i=0,1,…k-1 Để cộng thêm 1(theo hệ nhị phân) vào giá trị trong bộ
2]
Trang 9lần, do đó tổng chi phí thời gian
trong trường hợp xấu nhất sẽ là
O(nk).
-Nhưng nếu dùng phương pháp
phân tích khấu trừ để đánh giá
chặt chẽ hơn thì tổng chi phí cho
bài toán trên chỉ là O(n).
I NCREMENT (A) L1
I NCREMENT (A) L2
I NCREMENT (A)
L16
Trang 10Thuật toán INCREMENT
Trang 11bit A[0] lật n lần bit A[1] lật n/2
bit A[2] lật n/4
Tổng quát:
-bit A[i] lật n/2i lần, i = 0,…, lg n -bit A[i] không lật nếu i > lg n
Trang 12-Tổng của các lần lật trong dãy là:
n n
1
lg 0
Trang 13Vậy thời gian trường hợp xấu nhất cho một dãy n phép toán INCREMENT trên một bộ đếm mà giá trị ban đầu là 0 là O(n).
Như vậy mức hao phí khấu trừ của mỗi phép toán là O(n)/n=O(1)
Trang 15Để minh họa phương pháp kế toán của phân tích khấu trừ, chúng ta hãy trở lại ví dụ ngăn xếp, chi phí thực tế của các phép toán là
Trang 16Như vậy, với bất kỳ dãy n phép toán PUSH, POP và MULTIPOP, tổng mức hao phí khấu trừ vẫn là một cận trên của tổng chi phí thực tế
Do tổng mức hao phí khấu trừ là O(n), nên nó là tổng chi phí thực tế
Trang 17Chi phí thực tế
Kho n tín ản tín
d ng ụng
Ký gửi
Dùng hết
Trang 18Nếu muốn phân tích bằng mức hao phí khấu trừ để chứng
tỏ chi phí trung bình trong trường hợp xấu nhất của mỗi phép toán là nhỏ
Ta biểu diễn ci là chi phí thực tế của phép toán thứ i
là mức hao phí khấu trừ của phép toán thứ i
i
n i
c
1 1
ˆ cho tất cả dãy n phép toán
Tổng tín dụng được lưu trữ trong cấu trúc dữ liệu là sự khác nhau giữa tổng mức hao phí khấu trừ và tổng chi phí thực tế, hay
ˆ
Trang 19Tổng khoản tín dụng kết hợp với cấu trúc dữ liệu phải luôn là không âm, bởi nó biểu thị cho khoản mà tổng các mức hao phí khấu trừ gánh chịu vượt quá tổng các chi phí thực tế gánh chịu
Trang 20Phân tích phép toán INCREMENT trên một bộ đếm nhị phân bắt đầu tại 0
Dùng phương pháp kế toán để xác định mức hao phí khấu trừ của phép toán INCREMENT
Trang 21Chi phí bằng 0 Chi phí bằng 2
Số lượng 1 trong bộ đếm không bao giờ âm và như vậy khoản tín dụng luôn không âm
Do đó, với n phép toán INCREMENT, tổng mức hao phí khấu trừ là O(n), định cận tổng chi phí thực tế
Trang 24Độ lệch thế
Tổng chi phí khấu trừ là:
) (
) (
ˆi ci Di Di1
c
Lúc này, chi phí khấu trừ của phép toán
thứ i, kí hiệu là ĉ i và được tính như sau:
n i
n i
i i
i
n i
i
D D
c
D D
c c
1
0
1
1 1
) (
) (
)) (
) (
( ˆ
Trang 25Nếu chọn hàm thế sao cho: (D n ) ≥ (D 0 )
n i
i i
D D
c
1
0
1 1
) (
) (
Trang 26Thực tế không phải khi nào ta cũng biết có bao nhiêu phép toán được thực hiện
Cần ràng buộc (DD i ) ≥ (DD 0 ), với mọi i
Thường chọn hàm sao cho:
(DD 0 ) = 0 Rồi chỉ ra (DD i ) ≥ 0, với mọi ivới với mọi imọi với mọi ii
Trang 27Xét các phép toán PUSH, POP, MULTIPOP
Chọn hàm chính bằng số lượng các đối tượng trong Stack
- Xuất phát với ngăn xếp rỗng nên (D 0 ) = 0
- Rõ ràng (D i ) ≥ 0 = (D 0 ), với mọi i ≠ 0
Do đó, tổng chi phí khấu trừ của n phép toán đối với hàm là một cận trên của tổng chi phí thực tế.
Trang 28Tính chi phí khấu trừ của các phép toán: Giả sử ngăn xếp đang chứa s đối tượng Xét phép toán PUSH:
Hiệu thế:
(D i ) - (D i-1 ) = (s + 1) – s = 1
Chi phí khấu trừ:
ĉ i = c i + (D i ) - (D i-1 ) = 1 + 1 = 2
Trang 31là O(1).
Vậy, tổng chi phí khấu trừ của một dãy gồm
n phép toán là O(n)
Vì ta đã chứng tỏ rằng (D i ) ≥ (D 0 ) nên tổng chi phí khấu trừ của một dãy gồm n phép toán là một cận trên của tổng chi phí thực tế.
Do đó chi phí xấu nhất của n phép toán là O(n)
Trang 33Giả sử phép toán INCREMENT thứ i chỉnh lại t i bit từ 1 thành 0 Chi phí thực tế của phép toán tối đa là t i + 1 Do đó, số lượng bit 1 trong
bộ đếm sau khi thực hiện phép toán thứ i là b i :
Trang 34Chi phí khấu trừ của phép toán INCREMENT là O(1).
Vậy, tổng chi phí khấu trừ của dãy n phép toán INCREMENT là O(n)
Vì ta đã chỉ ra rằng: tổng chi phí khấu trừ của dãy n phép toán INCREMENT là cận trên của tổng chi phí thực tế Vậy mức chi phí xấu nhất của n phép toán INCREMENT
là O(n)
Trang 35tượng mà không biết trước bao nhiêu đối tượng sẽ được lưu trữ
Do đó
- Khi bảng hiện thời không có đủ chỗ cho các đối tượng mới, cần một bảng mới với kích thước lớn hơn.
- Khi bảng hiện thời dư nhiều chỗ trống do xoá nhiều đối
tượng, để tiết kiệm, dùng một bảng mới với kích thước nhỏ hơn
° Các phép toán lên một bảng
- TABLE-INSERT: Chèn một item vào bảng
- TABLE-DELETE: Xóa một item khỏi bảng.
Trang 36một bảng T (không trống) là (T):
số lượng các mục lưu trữ trong bảng chia cho kích cỡ (số lượng các khe) của bảng
(T): với mọi i= num[T] / size[T]
• Bài toán: Xác định chiến lược nới rộng (expansion)
và thu nhỏ (contraction) bảng sao cho
- Hệ số sử dụng của bảng cao
Được chặn dưới bởi một hằng số
- Chi phí bảo trì bảng thấp: chi phí khấu trừ của TABLE-INSERT và TABLE-DELETE là O(1)
Trang 371 if size[T ] = 0
2 then allocate table[T] with 1 slot
3 size[T] ← 1
4 if num[T] = size[T]
5 then allocate new-table with 2 size[T] slots
6 insert all items in table[T] into new-table
Trang 39- Thời gian thực thi của TABLE-INSERT tỉ lệ với thời gian chèn từng item (“chèn sơ đẳng”) vào bảng ở dòng 6 và 10.
- Chi phí của một chèn sơ đẳng là 1
Ta sẽ phân tích chi phí của một chuỗi gồm n phép toán INSERT lên một bảng động dùng lần lượt các
phương pháp
°Kết tập
°Kế toán
°Thế năng
Trang 40- Mức hao phí của phép toán thứ i là
- Tổng mức hao phí của n phép toán TABLE-INSERT là
n
n c
n j
j n
i
i
3 2
2
) 1 lg(
0 1
Trang 41Với mỗi thao tác ta trả như sau:
- 1 đồng để trả cho chi phí thực sự cho riêng nó
- 2 đồng để dành khi nới rộng bảng:
+1 đồng để trả trước cho chính nó một khi nó được
di chuyển lúc bảng nới rộng
+1 đồng để trả trước cho một item khác trong bảng
mà không còn tiền trả trước (vì đã di chuyển)
Do đó Chi phí khấu hao của TABLE-INSERT là 3đồng
Trang 42+ Định nghĩa thế năng là:
(T) = 2num[T] - size[T] (17.5)+ Nhận xét
- Ngay sau khi nới rộng bảng
Trang 43Xác định chi phí khấu trừ của mỗi phép toán
° Giả sử phép toán thứ i không gây nới rộng Ta có:
sizei = sizei-1
° Chi phí khấu trừ của phép toán là
Trang 44
° Xác định chi phí khấu trừ của mỗi phép toán(tiếp)+ Giả sử phép toán thứ i gây nới rộng Ta có:
sizei / 2 = sizei-1 = numi -1
+ Chi phí khấu trừ của phép toán là
Trang 46TABLE-° Một chiến lược tự nhiên cho nới rộng và thu nhỏ bảng là:
+ Gấp đôi bảng khi chèn một item vào một bảng
Trang 47° Lấy n cĩ dạng 2 m
° Xét một chuỗi n phép tốn, I là một insert và D là một delete
bảng đầy gây gấp đôi bảng
gây giảm nửa bảng
… n/2 lần
Chuỗi n phép tốn này cĩ phí tổn là (n2), do đĩ phí tổn khấu hao của mỗi phép tốn là (n)
Trang 48Cải tiến chiến lược trên bằng cách cho phép hệ số
Trang 49bảng mới = 1/2 bảng cũ
(T) = 1/4
thực thi T ABLE -D ELETE
Trang 50Định nghĩa thế năng trên một bảng là
Hiệu ứng của một dãy n phép toán
TABLE-INSERT và TABLE-DELETE trên số numi của các mục trong bảng, số sizei của các khe trong bảng và thế:
(T) = 2 num[T] - size[T] nếu (T)
1/2
(T) = size[T] / 2 - num[T] nếu (T) 1/2
Trang 52Xác định chi phí khấu trừ của mỗi phép toán
+ Nếu phép toán thứ i là TABLE-INSERT, ta phân biệt các trường hợp:
i1 ½
° Tương tự đoạn (17.4), nhiều lắm là 3
n n
n
n c
n
j
j n
i
i
32
2
) 1 lg(
0 1
Trang 53+Trường hợp i ½ mức hao phí khấu trừ
Trang 54Vậy chi phí khấu trừ của phép toán TABLE-INSERT nhiều lắm là 3.
Trang 55 i1 1/2 Có hai trường hợp con:
- Không gây thu nhỏ: sizei = sizei-1 và mức hao phí khấu trừ là:
Trang 56°Vậy chi phí khấu trừ của TABLE-DELETE được chặn trên bởi một hằng số.
size i / 2 = size i-1 / 4 = num i + 1
và mức hao phí khấu trừ
Trang 57Vì chi phí khấu trừ của mỗi phép toán TABLE-INSERT và TABLE-DELETE được chặn trên bởi một hằng số, nên thời gian chạy cho một chuỗi bất kỳ gồm n phép toán lên một bảng động
là O(n)