Phân tích khấu hao các thuật toán là gì? [đóng cửa]


85

Nó khác với phân tích tiệm cận như thế nào? Khi nào bạn sử dụng nó, và tại sao?

Tôi đã đọc một số bài báo có vẻ được viết tốt, như sau:

nhưng tôi vẫn chưa hiểu đầy đủ các khái niệm này.

Vì vậy, bất cứ ai có thể xin vui lòng đơn giản hóa nó cho tôi?


5
Có lẽ thuộc về programmers.stackexchange.com
lanzz

2
@lanzz Có thể bây giờ nó sẽ thuộc về cs.stackexchange.com
nbro

Một chủ đề tuyệt vời về ý nghĩa của Thời gian phân bổ không đổi .
RBT

Câu trả lời:


87

Phân tích khấu hao không nhân số lần gọi một cách ngây thơ với trường hợp xấu nhất cho một lần gọi.

Ví dụ: đối với một mảng động tăng gấp đôi kích thước khi cần, phân tích tiệm cận thông thường sẽ chỉ kết luận rằng việc thêm một mục vào nó sẽ tốn O (n), bởi vì nó có thể cần phải phát triển và sao chép tất cả các phần tử sang mảng mới. Phân tích khấu hao có tính đến rằng để phải tăng trưởng, n / 2 mặt hàng phải được thêm vào mà không gây ra sự tăng trưởng so với lần tăng trước đó, vì vậy việc thêm một mặt hàng thực sự chỉ mất O (1) (chi phí của O (n) là khấu hao cho n / 2 hành động).

Phân tích khấu hao không giống như "hiệu suất trung bình" - phân tích khấu hao đưa ra một đảm bảo chắc chắn về kết quả hoạt động sẽ đạt được nếu bạn thực hiện quá nhiều hành động.


1
"Phân tích khấu hao có tính đến rằng để phải tăng trưởng, n / 2 mặt hàng phải được thêm vào mà không gây ra sự tăng trưởng so với lần tăng trước đó, vì vậy việc thêm một mặt hàng thực sự chỉ mất O (1) (chi phí của O (n) được khấu hao cho n / 2 hành động). " Điều này khá khó hiểu và không rõ ràng.
AleksandrH

@AleksandrH bất kỳ phần cụ thể nào của nó?
harold

Yeah, nó chỉ là khó có thể làm theo các toán mà không có một lời giải thích cho nơi những con số đang đến từ
AleksandrH

44

Có rất nhiều câu trả lời cho "cái gì", nhưng không có câu trả lời nào cho "tại sao".

Như mọi người đã nói, phân tích tiệm cận là về cách hiệu suất của một hoạt động nhất định quy mô thành một tập dữ liệu lớn. Phân tích khấu hao là về tỷ lệ trung bình của hiệu suất của tất cả các hoạt động trên một tập dữ liệu lớn. Phân tích khấu hao không bao giờ đưa ra giới hạn xấu hơn tiệm cận, và đôi khi đưa ra những giới hạn tốt hơn nhiều.

Nếu bạn quan tâm đến tổng thời gian thực hiện của một công việc dài hơn, thì giới hạn tốt hơn của phân tích khấu hao có lẽ là điều bạn quan tâm. Đó là lý do tại sao các ngôn ngữ kịch bản (chẳng hạn) thường hài lòng khi phát triển mảng và bảng băm theo một số yếu tố mặc dù đó là một hoạt động tốn kém. (Tăng trưởng có thể là một O(n)hoạt động, nhưng khấu hao làO(1) do bạn hiếm khi thực hiện.)

Nếu bạn đang lập trình thời gian thực (các hoạt động riêng lẻ phải hoàn thành trong thời gian có thể dự đoán được), thì giới hạn tốt hơn từ phân tích khấu hao không quan trọng. Không có vấn đề gì nếu hoạt động trung bình nhanh, nếu bạn không hoàn thành nó kịp thời để quay lại và điều chỉnh máy cưa trước khi nó cắt quá xa ...

Cái nào quan trọng trong trường hợp của bạn phụ thuộc vào chính xác vấn đề lập trình của bạn là gì.


1
"Việc tăng trưởng có thể là một phép toán O (n), nhưng khấu hao là O (1) vì bạn hiếm khi làm việc đó" Tôi nghĩ câu nói này thực sự cần một bằng chứng toán học chặt chẽ.
nbro

"Nếu bạn đang lập trình thời gian thực ..." bạn nên nói chính xác hơn và giải thích chính xác lý do tại sao đoạn văn đó nên được coi là "đúng".
nbro

1
@nbro Tại sao bạn nghĩ "nên"? Câu hỏi đặt ra rằng phân tích khấu hao khác với phân tích tiệm cận như thế nào và khi nào bạn muốn sử dụng từng phân tích. Nó liên kết đến các bài báo giải thích cách thực hiện chúng. Vì vậy, phân tích toán học có vẻ thừa. Đối với lập trình thời gian thực, tôi đã giải thích nó. Lập trình thời gian thực là lập trình trong đó các hoạt động riêng lẻ phải hoàn thành trong một thời gian có thể dự đoán được. Một ví dụ điển hình là trong lập trình nhúng, nơi bạn cần theo dõi một thứ gì đó theo định kỳ. Chẳng hạn như điều khiển máy móc. Đối với trường hợp này, hoạt động chậm đôi khi không được chấp nhận.
btilly

26

Phân tích tiệm cận

Thuật ngữ này đề cập đến việc phân tích hiệu suất thuật toán với giả định rằng dữ liệu mà thuật toán vận hành ( đầu vào ), theo thuật ngữ của giáo dân, "đủ lớn để làm cho nó lớn hơn sẽ không thay đổi kết luận". Mặc dù kích thước chính xác của các đầu vào không cần phải được chỉ định (chúng ta chỉ cần một trên ràng buộc), dữ liệu thiết lập riêng của mình đến được xác định.

Lưu ý rằng cho đến nay chúng ta mới chỉ nói về phương pháp phân tích; chúng tôi đã không chỉ định chính xác đại lượng mà chúng tôi đang phân tích (độ phức tạp về thời gian? độ phức tạp về không gian?) và chúng tôi cũng không chỉ định số liệu nào mà chúng tôi quan tâm (trường hợp xấu nhất? trường hợp tốt nhất? trung bình?).

Trong thực tế, thuật ngữ phân tích tiệm cận thường đề cập đến độ phức tạp thời gian giới hạn trên của một thuật toán, tức là hiệu suất trong trường hợp xấu nhất được đo bằng tổng thời gian chạy, được biểu thị bằng ký hiệu big-Oh (ví dụ: thuật toán sắp xếp có thể là O(nlogn)).

Phân tích khấu hao

Thuật ngữ này đề cập đến việc phân tích hiệu suất thuật toán dựa trên một chuỗi hoạt động cụ thể nhằm vào trường hợp xấu nhất - nghĩa là, phân tích khấu hao ngụ ý rằng chỉ số là hiệu suất trong trường hợp xấu nhất (mặc dù nó vẫn không cho biết đại lượng nào đang được đo lường ). Để thực hiện phân tích này, chúng ta cần xác định kích thước của đầu vào, nhưng chúng ta không cần đưa ra bất kỳ giả định nào về hình thức của nó.

Theo thuật ngữ của giáo dân, phân tích khấu hao là chọn một kích thước tùy ý cho đầu vào và sau đó "chơi qua" thuật toán. Bất cứ khi nào bạn phải đưa ra quyết định phụ thuộc vào đầu vào, thì con đường xấu nhất sẽ được thực hiện¹. Sau khi thuật toán hoàn thành, chúng tôi chia độ phức tạp đã tính toán cho kích thước của đầu vào để tạo ra kết quả cuối cùng.

¹ lưu ý: Nói chính xác, con đường xấu nhất có thể về mặt lý thuyết . Nếu bạn có một vectơ tự động tăng gấp đôi kích thước mỗi khi dung lượng của nó cạn kiệt, thì "trường hợp xấu nhất" không có nghĩa là giả định rằng nó sẽ cần tăng gấp đôi sau mỗi lần chèn vì các lần chèn được xử lý dưới dạng một chuỗi. Chúng tôi được phép (và thực sự phải) sử dụng trạng thái đã biết để loại bỏ một cách toán học nhiều trường hợp "thậm chí tệ hơn" có thể, ngay cả khi đầu vào vẫn chưa biết.

Sự khác biệt quan trọng nhất

Sự khác biệt quan trọng giữa phân tích tiệm cận và phân tích khấu hao là phân tích trước phụ thuộc vào chính đầu vào, trong khi phân tích thứ hai phụ thuộc vào trình tự hoạt động mà thuật toán sẽ thực hiện.

Vì thế:

  • phân tích tiệm cận cho phép chúng ta khẳng định rằng độ phức tạp của thuật toán khi nó được đưa ra đầu vào trường hợp tốt nhất / xấu nhất / trung bình có kích thước tiếp cận N bị giới hạn bởi một số hàm F (N) - trong đó N là một biến
  • Phân tích khấu hao cho phép chúng ta khẳng định rằng độ phức tạp của thuật toán khi nó được đưa ra một đầu vào là các đặc tính chưa biết nhưng kích thước đã biết N không tệ hơn giá trị của hàm F (N) - trong đó N là giá trị đã biết

7
Câu trả lời trên cho thấy lý do tại sao mọi người không nên mù quáng ủng hộ những câu trả lời dài từ những người được xếp hạng cao.
btilly

2
@btilly: Phản hồi của bạn sẽ hữu ích hơn nhiều nếu nó có thể hành động - nghĩa là, bạn có thể cho tôi biết chính xác điều gì sai trong câu trả lời này và cách cải thiện nó không?
Jon

7
nơi để bắt đầu? Bạn đã định nghĩa sai cả hai thuật ngữ và đưa ra rất nhiều chi tiết làm rõ cũng sai. Đối với một ví dụ ngẫu nhiên, phân tích khấu hao không phải lúc nào cũng là trường hợp xấu nhất. Nếu không, chúng tôi không thể nói rằng hiệu suất khấu hao của việc chèn vào hàm băm thay đổi kích thước động là bao nhiêu O(1).
btilly

@btilly CLRS trang 451 cho biết "... phân tích khấu hao đảm bảo hiệu suất trung bình của mỗi hoạt động trong trường hợp xấu nhất."
Glen Selle

1
@GlenSelle Phân tích khấu hao là một kỹ thuật toán học. Nó có thể được sử dụng cho nhiều mục đích khác nhau, bao gồm cả hiệu suất trong trường hợp xấu nhất. Tuy nhiên nó không phải là trường hợp xấu nhất. Trong trường hợp của bạn, nó rõ ràng đã được sử dụng cho trường hợp xấu nhất. Trong trường hợp băm, thì không.
hàng

14

Câu trả lời cho điều này được xác định ngắn gọn trong câu đầu tiên của chương Phân tích khấu hao trong cuốn sách - Giới thiệu về các thuật toán:

Trong phân tích khấu hao , thời gian cần thiết để thực hiện một chuỗi các hoạt động cấu trúc dữ liệu được tính trung bình cho tất cả các hoạt động được thực hiện.

Chúng tôi thể hiện mức độ phức tạp của sự phát triển của một chương trình bằng phân tích tiệm cận - phân tích này ràng buộc sự phát triển của chương trình bằng một hàm và xác định trường hợp xấu nhất, tốt nhất hoặc trung bình của điều đó.

Nhưng điều này có thể gây hiểu lầm trong những trường hợp chỉ có một trường hợp mà độ phức tạp của chương trình đạt đến đỉnh điểm, nhưng nhìn chung, chương trình không cần tính toán nhiều.

Do đó, sẽ hợp lý hơn nếu tính trung bình chi phí qua một chuỗi hoạt động, mặc dù một hoạt động đơn lẻ có thể đắt. Đây là Phân tích khấu hao!

Phân tích khấu hao là một phương pháp thay thế cho kỹ thuật tiệm cận được sử dụng để tính toán độ phức tạp. Nó giúp chúng tôi tính toán độ phức tạp đúng hơn về mặt thực tế, để so sánh và quyết định giữa hai hoặc nhiều thuật toán.


5

Tài liệu tham khảo tốt nhất mà tôi tìm thấy cho đến nay để hiểu phân tích khấu hao của các thuật toán, là trong cuốn sách Giới thiệu về Thuật toán , ấn bản thứ ba, chương 17: "Phân tích khấu hao ". Tất cả đều ở đó, được giải thích tốt hơn nhiều so với những gì có thể tìm thấy trong bài đăng Stack Overflow. Bạn sẽ tìm thấy cuốn sách trong thư viện của bất kỳ trường Đại học tử tế nào.


Đúng. Đọc về thuật toán Phân bổ từ cuốn sách được đề cập là tốt hơn và cuối cùng đã cung cấp rõ ràng.
Rajesh Mappu

2

Phân tích tiệm cận thông thường xem xét hiệu suất của một hoạt động riêng lẻ một cách tiệm cận, như một hàm của quy mô của vấn đề. Kí hiệu O () là những gì chỉ ra một phân tích tiệm cận.

Phân tích khấu hao (cũng là phân tích tiệm cận) xem xét tổng hiệu suất của nhiều hoạt động trên một cơ cấu dữ liệu dùng chung .

Sự khác biệt là, phân tích khấu hao thường chứng minh rằng tổng số phép tính cần thiết cho M hoạt động có đảm bảo hiệu suất tốt hơn M lần trong trường hợp xấu nhất đối với hoạt động riêng lẻ.

Ví dụ: một phép toán riêng lẻ trên cây splay có kích thước N có thể mất đến O (N) thời gian. Tuy nhiên, một chuỗi M các phép toán trên cây có kích thước N bị giới hạn bởi thời gian O (M (1 + log N) + N log N), gần bằng O (log N) cho mỗi phép toán. Tuy nhiên, lưu ý rằng phân tích khấu hao nghiêm ngặt hơn nhiều so với phân tích "trường hợp trung bình": nó chứng minh rằng bất kỳ chuỗi hoạt động nào có thể xảy ra sẽ thỏa mãn trường hợp xấu nhất về tiệm cận của nó.


1

Phân tích khấu hao đề cập đến tổng chi phí qua một số lần chạy của quy trình và những lợi ích có thể thu được từ đó. Ví dụ: tìm kiếm một mảng không được sắp xếp gồm n mục cho một kết quả phù hợp có thể cần đến n phép so sánh và do đó có độ phức tạp o (n). Tuy nhiên, nếu chúng ta biết cùng một mảng sẽ được tìm kiếm m mục, thì việc lặp lại nhiệm vụ tổng khi đó sẽ có độ phức tạp O (m * n). Tuy nhiên, nếu chúng ta sắp xếp mảng trước, chi phí là O (n log (n)) và các tìm kiếm liên tiếp chỉ lấy O (log (n)) cho một mảng đã sắp xếp. Do đó, tổng chi phí phân bổ cho m phần tử áp dụng phương pháp này là O (n * log (n) + m * log (n)). Nếu m> = n, điều này tương đương với O (n log (n)) bằng cách sắp xếp trước so với O (n ^ 2) vì không sắp xếp. Do đó chi phí phân bổ rẻ hơn.

Nói một cách đơn giản, bằng cách chi tiêu sớm hơn một chút, chúng ta có thể tiết kiệm rất nhiều sau này.

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.