1. Trang chủ
  2. » Luận Văn - Báo Cáo

PHÂN TÍCH KHẤU TRỪ (AMORTIZED ANALYSIS)

30 879 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 358 KB

Nội dung

ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC TIỂU LUẬN MÔN HỌC THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN Đề tài: PHÂN TÍCH KHẤU TRỪ (AMORTIZED ANALYSIS) Giáo viên hướng dẫn: Học viên thực hiện: TS. Hoàng Quang Võ Thanh Minh Nguyễn Quang Hồ Văn Lâm Phạm Vinh Trần Thị Quế Vy Nhóm 2-CHKHMT - Khóa 09-14 Huế, tháng 11/2014 2 MỤC LỤC A. LỜI NÓI ĐẦU 4 B. NỘI DUNG 5 1.Giới thiệu một số bài toán 5 1.1 Bài toán 1: Các phép toán trên Stack 5 1.2 Bài toán 2: Tăng bộ đếm nhị phân 6 2.Các phương pháp của phân tích khấu trừ 7 2.1 Phương pháp kết tập: The Aggregate Method 8 2.2. Phương pháp kế toán: The accounting method 13 2.3 Phương pháp thế: The potential method 16 3.Bảng động (Dynamic tables) 20 3.1 Mở rộng bảng (Table expansion) 21 3.2 Thu gọn và mở rộng bảng 25 C. KẾT LUẬN 29 D. TÀI LIỆU THAM KHẢO 30 3 A. LỜI NÓI ĐẦU Có nhiều phương pháp để đánh giá chi phí của một thuật toán, trong giới hạn của tiểu luận môn học chúng tôi xin giới thiệu một phương pháp đó là phương pháp phân tích khấu trừ để đánh giá chi phí của thuật toán. Nội dung tiểu luận gồm có: 1. Giới thiệu một số bài toán 2. Các phương pháp của phân tích khấu trừ: trong phần này sẽ giới thiệu 3 phương pháp: phương pháp kết tập, phương pháp kế toán và phương pháp tiềm năng. Với mỗi phương pháp sẽ chỉ ra đặc điểm và ứng dụng phương pháp vào để xác định độ phức tạp của các bài toán được giới thiệu ở phần 1. 3. Bảng động: Giới thiệu một cách lưu trữ mới dựa vào bảng động, ở đó ta có thê tùy ý thay đổi kích thước của bảng sao cho thích hợp với các mục dữ liệu lưu trữ. 4 B. NỘI DUNG 1. Giới thiệu một số bài toán 1.1 Bài toán 1: Các phép toán trên Stack Chúng ta đã biết hai phép toán cơ bản stack đó là PUSH và POP, mỗi phép kéo theo dài O(1) thời gian, trong đó: 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 Bởi từng phép toán này trong O(1) thời gian, ta hãy xem mức hao phí của mỗi phép toán là 1. Do đó, tổng mức hao phí của một day n phép toán PUSH và POP là n, và như vậy thời gian thực hiện thực tế cho n phép toán là Θ(n). Có một tình huống xảy ra nếu ta bổ sung phép toán stack MULTIPOP(S,k) để lấy k đối tượng ra khỏi stack S với k có thể lớn hơn số đối tượng trong stack S Trong thuật toán MULTIPOP dưới đây, hàm STACK-EMPTY trả về TRUE nếu không có đối tượng nào thực hiện nằm trên stack và bằng không là FALSE. MULTIPOP(S, k) 1 while not STACK-EMPTY(S) and k ≠ 0 2 do POP(S) 3 k → k - 1 Đâu là thời gian thực hiện của MULTIPOP(S,k) trên một stack gồm s đối tượng? Thời gian thực hiện thực tế là tuyến tính trong số lượng phép toán POP thực tế được thi hành, và như vậy nó đủ để phân tích MULTIPOP theo dạng các mức hao phí trừu tượng là 1 cho PUSP và POP. Số lượng lần lặp lại của vòng lặp While là số min(s,k) các đối tượng được kéo ra khỏi stack. Với mỗi lần lặp lại vòng lặp, một lệnh gọi được thực hiện cho POP trong dòng 2. Như vậy, tổng mức hao phí của MULTIPOP là min(s,k), và thời gian thực hiện thực tế là một hàm tuyến tính của mức hao phí này. Ví dụ: Thực hiện MULTIPOP trên một stack S, thọat đầu nêu trong (a). 4 đối tượng đầu được kéo ra bởi MULTIPOP(S,4) mà kết quả của nó được nêu 5 trong (b). Phép toán kế tiếp là MULTIPOP(S,6) sẽ xả trống stack-được nêu trong (c)-bởi chỉ còn lại ít hơn 6 đối tượng. Ta hãy phân tích một dãy n phép toán PUSH, POP và MULTIPOP trên một stack trống từ đầu. Mức hao phí trường hợp xấu nhất của một phép toán MULTIPOP trong dãy là O(n), bởi kích cỡ stack tối đa là n. Do đó, thời gian trường hợp xấu nhất của bất kì phép toán stack nào là O(n) và như vậy một dãy n phép toán sẽ có mức hao phí là O(n 2 ), bởi ta có thể có O(n) phép toán MULTIPOP, mỗi phép có mức hao phí là O(n). Mặc dù kiểu phân tích này là đúng đắn, kết quả O(n 2 ) có được nhờ xét mức hao phí trường hợp xấu nhất của mỗi phép toán riêng lẻ, là không chặt. 1.2 Bài toán 2: Tăng bộ đếm nhị phân Ta hãy xét bài toán 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] bit, ở đó length[A] = k, là bộ đếm. Một số nhị phân x được lưu trữ trong bộ đếm có k bit cấp thấp nhất của nó trong A[0] và bit cao nhất trong A[k-1], sao cho . Thoạt đầu, x=0, như vậy A[i]=0 với i=0,1,…k-1. Để cộng 1 (modulo 2 k ) vào giá trị trong bộ đếm ta dùng thủ tục dưới đây: 6 Giá trị bộ đếm Tổng mức hao phí Hình 1.1(ở trang liền trước) Một đếm nhị phân 8-bit khi giá trị của nó đi từ 0 đến 16 theo một dãy 16 phép toán INCREMENT. Các bít lật để đựơc giá trị kế tiếp được tô bóng. Mức hao phí thực hiện để lật các bít được nêu ở bên phải. Lưu ý, tổng mức hao phí không bao giờ lớn hơn hai lần tổng phép toán INCREMENT. Thuật toán INCREMENT INCREMENT(A) 1 i ← 0 2 while i < length[A] and A[i] = 1 3 do A[i] ← 0 4 i ← i + 1 5 if i < length[A] 6 then A[i] ← 1 Về cơ bản, thuật toán này giống như thuật toán đã được thực thị trong phần cứng bằng một bộ đếm mang sang lược [ripple carry counter]. Hinh 1.1 cho biết quá trình xảy ra với bộ đếm nhị phân khi nó được gia tăng 16 lần bắt đầu từ giá trị ban đầu là 0 và kết thúc là giá trị 16. Bắt đầu mỗi lần lặp của vòng lặp While ở dòng 2->4, ta hi vọng cộng thêm 1 vào vị trí i. Nếu A[i]=1 thì lật bit thành 0 ở vị trí i và i =i+1 ở lần lặp tiếp theo của vòng lặp. Mặc khác, sau đó vòng lặp kết thúc, nếu i<k, chúng ta biết rằng khi A[i]=0 thì lật 0 thành 1, được chỉ ra ở dòng 6. Chi phí cho mỗi phép toán INCREMENT là tuyến tính với số bit được lật. Giống như trong ví dụ stack, một sự phân tích nhanh cho ra một cận tuy là đúng nhưng không chặt. Một đợt thi hành INCREMENT sẽ mất một thời gian Θ(k) trong trường hợp xấu nhất, ở đó mảng A chứa tất cả 1. Như vậy, một dãy n phép toán INCREMETN trên một bộ đếm zero từ đầu sẽ mất một thời gian O(nk) trong trường hợp xấu nhất. 2. Các phương pháp của phân tích khấu trừ Trong phép phân tích khấu trừ, thời gian yêu cầu để thực hiện một dãy các phép toán cấu trúc dữ liệu được tính bình quân trên tất cả các phép toán 7 thực hiện. Có thể dùng phép phân tích khấu trừ để chứng tỏ mức hao phí trung bình của một phép toán là nhỏ, nếu như ta lấy bình quân trên một dãy các phép toán, cho dù một phép toán đơn lẻ có thể là tốn kém. Phân tích khấu trừ khác với phân tích trường hợp trung bình ở chỗ không có liên quan đến xác suất; phân tích khấu trừ bảo đảm khả năng thực hiện trung bình của mỗi phép toán trong trường hợp xấu nhất. Trong phép phân tích khấu trừ có 3 phương pháp: phương pháp kết tập, phương pháp kế toán và phương pháp tiềm năng 2.1 Phương pháp kết tập: The Aggregate Method Trong phương pháp kết tập của phép phân tích khấu trừ, ta chứng tỏ với tất cả n, một dãy n phép toán chiếm tổng cộng T(n) thời gian trường hợp xấu nhất. Như vậy, trong trường hợp xấu nhất, chi phí trung bình hoặc chi phí khấu trừ của mỗi phép toán là T(n)/n. Lưu ý, chi 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. Phương pháp kế toán và phương pháp thế, sẽ được giải thích sau trong chương này, có thể gán các chi phí khấu trừ khác nhau cho các kiểu phép toán khác nhau. a. Ý tưởng của phương pháp: Tính thời gian tổng cộng của tất cả các phép toán trong một dãy n phép toán đó là T(n). Từ đó chi phí khấu trừ của mỗi phép toán trong trường hợp xấu nhất là T(n)/ n. b. Các ví dụ: Để thể hiện ý tưởng của phương pháp vào các bài toán cụ thể ta xét 2 ví dụ sau: * Các phép toán trong ngăn xếp (Stack): 8 Trong ví dụ đầu tiên của chúng ta về phương pháp kết tập, ta phân tích ngăn xếp đã được tăng cường một phép toán mới. Chúng ta đã biết hai phép toán cơ bản stack đó là PUSH và POP, mỗi phép kéo dài O(1) thời gian, trong đó: 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. Bởi từng phép toán này trong O(1) thời gian, ta hãy xem chi phí của mỗi phép toán là 1. Do đó, tổng chi phí của một dãy n phép toán PUSH và POP là n, và như vậy thời gian thực hiện thực tế cho n phép toán là Θ(n). Tình huống trở thành thú vị hơn nếu ta bổ sung phép toán stack MULTIPOP(S,k) để lấy k đối tượng trên cùng ra khỏi stack S hoặc kéo ra tất cả các đối tượng trong Stack nếu nó chứa ít hơn k đối tượng. Trong mã giả MULTIPOP dưới đây, hàm STACK-EMPTY trả về TRUE nếu không có đối tượng nào hiện nằm trên stack và ngược lại là FALSE. MULTIPOP(S, k) 1 while not STACK-EMPTY(S) and k ≠ 0 2 do POP(S) 3 k → k - 1 Đâu là thời gian thực hiện của MULTIPOP(S,k) trên một stack gồm s đối tượng? Thời gian thực hiện thực tế là tuyến tính với số lượng phép toán POP thực tế được thi hành, và như vậy nó đủ để phân tích MULTIPOP theo dạng các chi phí trừu tượng là 1 cho PUSP và POP. Số lượng lần lặp lại của vòng lặp While là số min(s,k) các đối tượng được kéo ra khỏi stack. Với mỗi lần lặp lại vòng lặp, một lệnh gọi được thực hiện cho POP trong dòng 2. Như vậy, tổng chi phí của MULTIPOP là min(s,k), và thời gian thực hiện thực tế là một hàm tuyến tính của chi phí này. Ví dụ: Thực hiện MULTIPOP trên một stack S, thọat đầu nêu trong (a). 4 đối tượng đầu được kéo ra bởi MULTIPOP(S,4) mà kết quả của nó được nêu trong (b). Phép toán kế tiếp là MULTIPOP(S,7) sẽ xả trống stack-được nêu trong (c)-bởi chỉ còn lại ít hơn 7 đối tượng. 9 Ta hãy phân tích một dãy n phép toán PUSH, POP và MULTIPOP trên một stack trống từ đầu. Chi phí trường hợp xấu nhất của một phép toán MULTIPOP trong dãy là O(n), bởi kích cỡ stack tối đa là n. Do đó, thời gian trường hợp xấu nhất của bất kì phép toán stack nào là O(n) và như vậy một dãy n phép toán sẽ có chi phí là O(n 2 ), bởi ta có thể có n phép toán MULTIPOP, mỗi phép có chi phí là O(n). Mặc dù kiểu phân tích này là đúng đắn, kết quả O(n 2 ) có được nhờ xét chi phí trường hợp xấu nhất của mỗi phép toán riêng lẻ, là không chặt. Bây giờ ta dùng phương pháp của phân tích khấu trừ là phương pháp kết tập với ý tưởng đã trình bày ở trên vào bài toán này ta sẽ thấy kết quả thú vị hơn. Dùng phương pháp kết lập của phép phân tích khấu trừ, ta có thể được một cận trên tốt hơn xem xét nguyên cả dãy n phép toán. Thực vậy mặc dù một phép toán MULTIPOP đơn lẻ có thể tốn kém, bất kì dãy n phép toán PUSH, POP và MULTIPOP nào trên một stack trống từ đầu có thể có chi phí tối đa O(n). Tại sao? Mỗi đối tượng có thể được kéo ra tối đa một lần cho mỗi lần nó được bỏ vào. Do đó, số lần mà POP có thể được gọi trên một stack không trống, kể cả các lần gọi trong MULTIPOP, tối đa là số lượng các phép toán PUSH, mà các phép toán này tối đa là n. 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. Chi phí khấu trừ của một phép toán là số trung bình: O(n)/n=O(1). Mặc dù ta vừa chứng minh chi phí trung bình và do đó thời gian thực hiện của một phép toán stack là O(1), nhưng nó không liên quan đến biện luận xác suất. Thực tế ta đã nêu một cận trong trường hợp xấu nhất của O(n) trên một dãy 10 [...]... của phân tích để xác định chi phí khấu trừ của mỗi phép toán 2.2 Phương pháp kế toán: The accounting method Trong phương pháp kế toán của phân tích khấu trừ, ta gán các khoản tính công khác biệt cho các phép toán khác nhau, với vài phép toán được tính công nhiều hoặc ít hơn chi phí thực tế của chúng Khoản mà ta tính công cho một phép toán được gọi là mức hao phí khấu trừ của nó Khi mức hao phí khấu trừ. .. phí khấu trừ nhỏ hơn chi phí thực tế của chúng Như vậy, 13 ta có thể xem mức hao phí khấu trừ của một phép toán dưới dạng đang được tách giữa chi phí thực tế của nó với khoản tín dụng hoặc được ký gửi hoặc được dùng hết Điều này rất khác với phương pháp kết tập, ở đó tất cả các phép toán có cùng mức hao phí khấu trừ Ta phải chọn mức hao phí khấu trừ của các phép toán thật cẩn thận Nếu muốn phân tích. .. Φ(Di) - Φ(Di-1) = k′ Như vậy, chi phí khấu trừ của phép toán MULTIPOP là: ˆ ci = ci + Φ(Di) - Φ(Di-1) = k’ – k’ =0 Tương tự, chi phí khấu trừ của một phép toán POP cũng là 0 18 Chi phí khấu trừ của mỗi trong số ba phép toán là O(1), như vậy tổng chi phí khấu trừ của một dãy n phép toán là O(n) Bởi ta đã chứng tỏ rằng Φ(D i) ≥ Φ(D0) với mọi i, nên tổng chi phí khấu trừ của n phép toán là một cận trên... vậy, với bất kỳ dãy nào n phép toán PUSH, POP và 15 MULTIPOP nào, tổng mức hao phí khấu trừ vẫn là một cận trên trên tổng chi phí thực tế Do tổng mức hao phí khấu trừ O(n), nên nó là tổng chi phí thực tế Bộ đếm tăng nhị phân Để lấy một ví dụ khác về phương pháp kế toán, ta phân tích phép toán INCREMENT trên một bộ đếm nhị phân bắt đầu tại zero Như đã nhận xét ở trên, thời gian thực hiện của phép toán... xếp Để minh họa phương pháp kế toán của phân tích khấu trừ, ta hãy trở lại ví dụ ngăn xếp Chắc bạn còn nhớ các chi phí thực tế của các phép toán là PUSH 1, POP 1, MULTIPOP min(k, s), Trong đó k là đối số cung cấp cho MULTIPOP và s là kích cỡ ngăn xếp khi nó được gọi Hãy gán các mức hao phí khấu trừ sau đây: PUSH 2, 14 POP 0, MULTIPOP 0, Lưu ý, mức hao phí khấu trừ của MULTIPOP là hằng (0), trong khi... tổng chi phí này cho n đã cho ra chi phí trung bình của mỗi phép toán hoặc chi phí khấu trừ * Phân tích bài toán 2: Gia số bộ đếm nhị phân Để lấy một ví dụ khác về phương pháp kết tập, ta hãy xét bài toán 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] bit, ở đó length[A] = k, làm bộ đếm Một số nhị phân x được lưu trữ trong bộ đếm có bit cấp thấp nhất của nó trong A[0] và bit... như vậy Φ(T) = num[T] , như mong muốn Giá trị bảng đầu của thế là 0, do đó bảng luôn ít nhất đầy phân nửa, nên num[T] ≥ size[T]/2 , hàm ý Φ(T) luôn không âm Như vậy, tổng các mức hao phí khấu trừ của n phép toán TABLEINSERT là một cận trên trên tổng các mức hao phí thực tế 23 Để phân tích mức hao phí khấu trừ của phép toán TABLE-INSERT thứ i, ta có numi thể hiện số lượng các mục được lưu trữ trong bảng... 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ế 2.3 Phương pháp thế: The potential method Thay vì biểu thị công được trả trước dưới dạng khoản tín dụng lưu trữ với các đối tượng cụ thể trong cấu trúc dữ liệu, phương pháp thế của phân tích khấu trừ biểu thị công được trả trước dưới dạng “năng lượng thế” hay đơn giản là “thế”,... theo một số thực Φ(Di), là thế kết hợp với cấu trúc dữ liệu Di Chi  phí khấu trừ ci của phép toán thứ i đối với hàm thế Φ được định nghĩa:  ci = ci + Φ(Di) - Φ(Di-1) (2.3.1) Do đó, chi phí khấu trừ của mỗi phép toán là chi phí thực tế của nó cộng với mức gia tăng trong thế do phép toán Theo phương trình (2.3.1), tổng chi phí khấu trừ của n phép toán là: n n n i =1 i =1 i =1 ˆ ∑ ci = ∑ (ci + Φ( Di )... Φ(Di)-Φ(Di-1) của phép toán thứ i là dương, thì chi phí khấu trừ biểu thị cho một khoản tính công dư đối với phép toán thứ i, và thế của cấu trúc dữ liệu sẽ gia tăng Nếu hiệu thế là âm, thì chi phí khấu trừ biểu thị cho một khoản tính công thiếu đối với phép toán thứ i, và chi phí thực tế của phép toán được thanh toán bởi sự giảm trong thế Chi phí khấu trừ được định nghĩa bởi các phương trình (2.3.1 và . ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC TIỂU LUẬN MÔN HỌC THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN Đề tài: PHÂN TÍCH KHẤU TRỪ (AMORTIZED ANALYSIS) Giáo viên hướng dẫn: Học viên thực hiện: TS. Hoàng Quang. pháp đó là phương pháp phân tích khấu trừ để đánh giá chi phí của thuật toán. Nội dung tiểu luận gồm có: 1. Giới thiệu một số bài toán 2. Các phương pháp của phân tích khấu trừ: trong phần này sẽ. mất một thời gian O(nk) trong trường hợp xấu nhất. 2. Các phương pháp của phân tích khấu trừ Trong phép phân tích khấu trừ, thời gian yêu cầu để thực hiện một dãy các phép toán cấu trúc dữ liệu

Ngày đăng: 11/04/2015, 22:08

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w