Câu hỏi về phân tích khấu hao


7

Là một bài kiểm tra về các thuật toán và độ phức tạp, tôi hiện đang giải các bài tập cũ. Một khái niệm tôi đã phải vật lộn khi lần đầu tiên bắt gặp nó là khái niệm phân tích khấu hao. Phân tích khấu hao là gì và làm như thế nào? Trong các ghi chú bài giảng của chúng tôi, có tuyên bố rằng "phân tích khấu hao đưa ra giới hạn cho" thời gian trung bình "cần thiết cho hoạt động nhất định và nó cũng có thể đưa ra một ràng buộc cho trường hợp xấu nhất". Điều đó nghe có vẻ thực sự hữu ích nhưng khi nói đến các ví dụ, tôi không biết mình phải làm gì và thậm chí sau khi đọc giải pháp mẫu, tôi không biết họ đang làm gì.

Chúng ta hãy thêm 1 vào cơ sở 2, tức là 0, 1, 10, 11, 100, 101, 110, 111, 1000, ... Sử dụng phân tích khấu hao, cho thấy rằng trong mỗi bước chỉ cần khấu hao liên tục nhiều bit cần phải thay đổi.

(bài tập ban đầu bằng tiếng Đức, vì vậy tôi xin lỗi vì bản dịch có thể không hoàn toàn chính xác của tôi)

Bây giờ giải pháp tiêu chuẩn đầu tiên xác định ϕ(i):=c#{1-bits in the binary representation} cho một số hằng c>0. Tôi nghĩ rằng đây là cái được gọi là hàm tiềm năng bằng cách nào đó tương ứng với các đơn vị thời gian quá mức (nhưng tôi không biết tại sao tôi lại đưa ra định nghĩa cụ thể này). Giả sử rằng chúng ta phải thay đổim bit trong iBước thứ. Một bước như vậy luôn luôn có hình thức

011m100m.

Tuyên bố này là dễ hiểu đối với tôi, tuy nhiên một lần nữa tôi không thấy động lực đằng sau nó. Sau đó, không biết từ đâu, họ nghĩ ra cái mà họ gọi là "ước tính"

a(i)=m+c(ϕ(i)ϕ(i1))=m+c(m+2)

và họ tuyên bố rằng c=1, chúng tôi nhận được a(i)=2 đó là những gì chúng tôi đã phải thể hiện.

Chuyện gì vừa xảy ra vậy? Những gì làa(i)? Tại sao chúng ta có thể chọnc=1? Nói chung, nếu tôi phải chỉ ra rằng trong mỗi bước chỉ cần khấu hao liên tục thì cần có "đơn vị thời gian", điều đó có nghĩa là tôi phải chứng minh rằnga(i) là hằng số?

Có một vài bài tập khác liên quan đến phân tích khấu hao và tôi cũng không hiểu chúng. Tôi nghĩ nếu ai đó có thể giúp tôi với bài này, tôi có thể thử các bài tập khác và có thể điều đó sẽ giúp tôi thực sự nắm bắt được khái niệm này.

Cảm ơn rất nhiều trước cho bất kỳ sự giúp đỡ.


Bạn đã xem trong một cuốn sách văn bản? Đây là ví dụ tiêu chuẩn và nên được tách ra và giải thích trong bất kỳ cuốn sách hay.
Raphael

@Raphael, IIRC đây là từ chương 17 của CLRS.
Kaveh

Câu trả lời:


5

Để cho ai được khấu hao chi phí hoạt động i, ci là chi phí hoạt động thực tế iDi cấu trúc dữ liệu sau khi hoạt động i. Chi phí khấu hao của một hoạt động được xác định

ai:=ci+Φ(Di)Φ(Di1).
Bạn thường giả định như sau
  1. Tiềm năng luôn luôn tích cực, đó là :iΦ(Di)0,
  2. Ban đầu tiềm năng là 0, nghĩa là Φ(D0)=0.

Hai giả định này không phải lúc nào cũng cần thiết nhưng chúng thường được sử dụng và làm cho cuộc sống dễ dàng hơn. Bây giờ bạn có thể xem xét tiềm năng với chi phí đã được thanh toán bởi các hoạt động trước đó.

Để biện minh cho định nghĩa này, hãy xem xét chi phí tích lũy của tất cả các hoạt động. Chúng tôi nhận được tổng số kính thiên văn sau đây

i=1nai=i=1n(ci+Φ(Di)Φ(Di1))=Φ(Dn)Φ(D0)+i=1ncii=1nci.
Vì vậy, bạn thấy rằng tổng chi phí khấu hao vượt quá tổng chi phí thực tế. Do đó, chi phí khấu hao đưa ra một giới hạn trên.

Tôi chưa thấy việc sử dụng ctrong công thức của bạn. Nhưngc có thể được thêm vào hàm tiềm năng Φ. Hãy nghĩ vềc như một yếu tố làm tăng tiềm năng và được xác định lại chức năng Φ bạn có thể thoát khỏi nó

Vì vậy, để trả lời câu hỏi cụ thể của bạn. a(i) biểu thị chi phí khấu hao cho iHoạt động thứ, đó là chi phí thực tế trong chuỗi hoạt động được tính cho hoạt động i. Cácclà một số yếu tố tích cực bạn có thể chọn. Vàa(i)Nói chung không phải là hằng số (chúng nằm trong ví dụ của bạn) - bạn không phải hiển thị bất cứ điều gì cho a(i) chi phí, giá trị a(i) là kết quả phân tích của bạn.

Vì bạn dường như nói tiếng Đức, bạn cũng có thể xem các ghi chú lớp tiếng Đức của tôi về chức năng tiềm năng.


4

Phương pháp hàm tiềm năng rất phức tạp, ví dụ của bạn rất đơn giản. Số lượng bit thay đổi là 1 khoảng một nửa thời gian, 2 khoảng một phần tư thời gian, 3 khoảng một phần tám thời gian, v.v. Điều này là do số bit thay đổi, bắt đầu từ 0, là 1,2,1,3,1,2,1,4 và cứ thế (bạn có được mẫu). Vì vậy, số bit trung bình thay đổi là

k=1k2k=k=1l=k12l=k=112k1=2.

1
Tôi không đồng ý rằng phương pháp hàm tiềm năng là phức tạp. Về mặt khái niệm nó rất đơn giản. Tuy nhiên, việc tìm đúng chức năng tiềm năng cho một vấn đề nhất định có thể khó khăn.
A.Schulz

1
Tôi đồng ý đây là cách tốt nhất để xem nó, nhưng sẽ tốt hơn nếu bạn lấy một số mẫu 2nvà thấy rằng bit đầu tiên thay đổi mỗi lần, bit thứ hai thay đổi, bit thứ ba thay đổi sau mỗi thứ tư, v.v.
Pål GD

3

Phân tích khấu hao liên quan đến chi phí thời gian chạy của một hoạt động ở mức trung bình trên một chuỗi các hoạt động. Điều này tương tự như khái niệm tài chính về khấu hao - một khoản tiền gộp, chẳng hạn như khoản vay, được khấu hao trong một khoảng thời gian. Điều này sửa một khoản thanh toán hàng tháng chẳng hạn, mặc dù số dư gốc đang tăng nhỏ hơn.

Theo cách này, thời gian chạy được khấu hao là một loại trung bình, mặc dù không giống như thời gian chạy trường hợp trung bình liên quan đến phân tích xác suất trên phân phối đầu vào.

Có ba kỹ thuật tiêu chuẩn để thực hiện phân tích khấu hao: (1) phương pháp tổng hợp, (2) phương pháp kế toán và (3) phương pháp tiềm năng. Điều cuối cùng này là những gì bạn đang thấy trong các bài giảng của mình, và bài A. Schulz đang sử dụng trong câu trả lời của mình. Nó cũng phức tạp hơn một chút.

Tôi sẽ chỉ cho bạn các ghi chú bài giảng tuyệt vời của JeffE, trong đó có phần giải thích về cả ba kỹ thuật, bắt đầu bằng ví dụ được trích dẫn (và một trong những bạn gặp phải) về việc tăng bộ đếm nhị phân. Nó cho thấy rằng chi phí khấu hao của một hoạt động gia tăng làO(1) khi tính trung bình trên một chuỗi các hoạt động như vậy mặc dù thời gian chạy trong trường hợp xấu nhất là O(logn).

Một tài nguyên khác sẽ là Chương 17 của [CLRS01] , bắt đầu bằng một ví dụ phổ biến khác, một ngăn xếp có hoạt động "đa pop".


2

Tôi nghĩ rằng báo cáo vấn đề rõ ràng hơn khi bạn nghĩ về nó như một bộ đếm bắt đầu từ 0 và có một hoạt động làm tăng giá trị lên một. Mỗi khi bộ đếm từ vấn đề của bạn tăng lên, chính xác một bit được bật lên và 0 hoặc nhiều bit được tắt. Hàm tiềm năng từ bài toán ví dụ không có màu xanh như bạn nghĩ. Chìa khóa của vấn đề là chỉ một chút đã được bật trước đó có thể được tắt. Vì vậy, mỗi khi chúng tôi thực hiện thao tác tăng và bật một chút, chúng tôi sẽ lưu trữ một đơn vị thời gian vào "tài khoản tiết kiệm" (chức năng tiềm năng) mà chúng tôi có thể sử dụng để tắt bit đó sau này.

Điều này là do khi tăng bộ đếm, trước tiên bạn nhìn vào bit ngoài cùng bên phải. Nếu nó tắt, bạn bật nó lên. Nếu nó bật, bạn xoay nó và nhìn vào vị trí bit một bên trái. Nếu nó tắt, bật nó lên và dừng lại. Nếu nó bật, tắt nó đi và nhìn vào bit bên trái của bit đó. Vì vậy, số bit bạn lật trong một thao tác bằng với vị trí của 0 bit đầu tiên từ bên phải.

Ban đầu, cả bộ đếm và hàm tiềm năng đều bằng 0. Sau khi thực hiện một thao tác tăng, bộ đếm là 1 và hàm tiềm năng cũng là 1. Nếu chúng ta tăng lại, bộ đếm trở thành 10. Hàm tiềm năng vẫn là 1. Sau một bước khác, bộ đếm là 11 và hàm tiềm năng 2. Nếu chúng ta tăng bộ đếm một lần nữa, chúng ta sẽ cần lật 3 bit để đi từ 011 đến 100. Để làm điều này, chúng ta phải sử dụng một số tiềm năng và chúng ta kết thúc với tiềm năng mới là 1. Bí quyết là tổng số bit thực sự bị lật cho đến nay cộng với hàm tiềm năng luôn bằng hai lần số hoạt động gia tăng. Bởi vì hàm tiềm năng không bao giờ âm, nên tổng số bitflips saun hoạt động gia tăng nhiều nhất 2n, do đó, mỗi hoạt động được khấu hao 2bitflips.

Một ví dụ rất tốt là danh sách mảng. Ở đây chúng tôi có một danh sách (hỗ trợ lặp lại tất cả các phần tử và thêm một phần tử mới) được thực hiện bằng cách lưu trữ các phần tử trong một mảng. Các mảng ban đầu bắt đầu khá nhỏ (nói 2 nơi). Khi chúng ta thêm một phần tử, nó được lưu trữ trong mảng. Khi chúng ta sắp thêm phần tử thứ 3, không còn khoảng trống nào trong mảng. Để chống lại điều này, chúng tôi tạo ra một mảng mới có kích thước gấp đôi và sao chép tất cả các thành phần từ mảng ban đầu. Điều này có thể mất một thời gian rất dài (tuyến tính về số lượng phần tử) nhưng phân tích khấu hao cho thấy mỗi hoạt động thêm chỉ mất thời gian không đổi. Danh sách mảng hoạt động thực sự tốt trong thế giới thực (tốt hơn nhiều so với danh sách được liên kết). Mỗi thao tác có thể được thực hiện trong thời gian không đổi, với cảnh báo rằng đôi khi một thao tác sẽ mất nhiều thời gian hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.