Điều đó có nghĩa gì bởi thời gian chạy dự kiến ​​và thời gian chạy trung bình của một thuật toán?


17

Giả sử chúng ta muốn phân tích thời gian chạy của các thuật toán. Đôi khi chúng tôi nói rằng chúng tôi muốn tìm thời gian chạy của thuật toán khi kích thước đầu vào là n và trong trường hợp xấu nhất có thể, nó được biểu thị bằng O (n). Đôi khi mặc dù tôi thấy sách / giấy nói rằng chúng ta cần tìm thời gian dự kiến của một thuật toán. Ngoài ra đôi khi thời gian chạy trung bình được sử dụng.

"Thời gian dự kiến" là gì? Trong trường hợp nào là hữu ích để tìm thời gian dự kiến thay vì thời gian trường hợp xấu nhất?

Chỉnh sửa : Tôi nghĩ rằng có một sự khác biệt tinh tế giữa thời gian chạy dự kiếnthời gian chạy trung bình nhưng tôi không chắc chắn. Thông qua bài viết này tôi muốn biết sự khác biệt chính xác nếu có.


1
Có lẽ họ có nghĩa là trường hợp trung bình ..
Martijn Pieters

4
Các giá trị kỳ vọng của một hàm phân bố xác suất được mô tả như là không thể thiếu của x * f (x) từ âm sang dương vô cực. Thời gian dự kiến ​​sẽ được tính bằng cách xác định phân phối xác suất của tất cả các lần có thể và sau đó lấy giá trị dự kiến. Thao tác này thường được gọi là tính trung bình hoặc tính trung bình .
Joel Cornett

1
@JoelCornett: Điều đó sẽ tạo ra một câu trả lời tốt nếu bạn đăng nó ..
Martijn Pieters

@MartijnPieters: Không, trường hợp trung bình đưa ra giả định về phân phối xác suất của đầu vào, trường hợp dự kiến ​​thì không.
Jörg W Mittag

@ JörgWMittag: Phải, nếu bạn biết phân phối xác suất trong thế giới thực của đầu vào, bạn có thể bỏ qua trường hợp trung bình. Nói cách khác, trường hợp dự kiến ​​là thời gian thuật toán của bạn đưa ra phân phối xác suất của các bộ đầu vào dự kiến.
Martijn Pieters

Câu trả lời:


15

Thời gian dự kiến ​​chỉ là thời gian trung bình, dự kiến , thời gian chạy của thuật toán sử dụng đầu vào dự định .

Giả sử bạn đã có vài triệu hồ sơ người dùng và muốn sắp xếp chúng, bạn có thể muốn sử dụng thuật toán phù hợp nhất với đầu vào của mình và như vậy sẽ mang lại thời gian chạy tốt nhất dự kiến , trái với thuật toán tốt hơn trường hợp xấu nhất thời gian chạy nhưng thời gian chạy dự kiến tồi tệ hơn .

Đôi khi ví dụ như các yếu tố liên tục cho thời gian phức tạp của một thuật toán rất cao mà nó làm cho cảm giác sử dụng các thuật toán với tồi tệ hơn thời gian phức tạp nhưng các yếu tố liên tục nhỏ hơn, vì nó cung cấp cho bạn tốt hơn dự kiến thời gian chạy với đầu vào nhỏ, mặc dù nó sẽ nhận được vượt trội khủng khiếp với đầu vào lớn hơn.

Có lẽ một ví dụ tốt hơn sẽ là thuật toán quicksort cổ điển, có thời gian chạy trường hợp xấu nhất là O (n²) nhưng thời gian chạy trung bình dự kiến ​​là O (n log n), bất kể đầu vào . Điều này là do thuật toán sử dụng (hoặc đúng hơn, có thể sử dụng , tùy thuộc vào việc thực hiện) ngẫu nhiên. Vì vậy, nó được gọi là thuật toán ngẫu nhiên . Nó chạy một chút khác nhau với mỗi lần gọi ngay cả với cùng một đầu vào. Như vậy, không có đầu vào trường hợp xấu nhất phổ biến nào cho việc triển khai, bởi vì đầu vào trường hợp xấu nhất phụ thuộc vào cách thuật toán chọn trục xoay để chia đầu vào đã cho. Và như vậy, người ta không thể chỉ cung cấp một số đầu vào được xác định trước gây ra thời gian chạy trong trường hợp xấu nhất. Đây thường là trường hợp với các thuật toán ngẫu nhiên, nhằm mục đích mong đợi tốt hơn, thời gian chạy trung bình bất kể đầu vào.

Đó là tất cả về việc sử dụng thuật toán phù hợp cho đầu vào trong tay.


Câu trả lời tuyệt vời. Cảm ơn . Tôi nghĩ rằng sự khác biệt giữa dự kiến ​​và trung bình là khi chúng ta biết phân phối đầu vào và chạy thuật toán, nó được gọi là "trung bình" và khi chúng ta sử dụng một trình tạo số ngẫu nhiên để hoán vị các đầu vào trong tay, nó được gọi là thời gian chạy dự kiến. Bạn có đồng ý với tiền đề này không?
Geek

4

Thời gian chạy dự kiến ​​của một thuật toán ngẫu nhiên là một khái niệm được xác định rõ, giống như thời gian chạy tồi tệ nhất. Nếu một thuật toán được chọn ngẫu nhiên, thời gian chạy của nó cũng là ngẫu nhiên, điều đó có nghĩa là chúng ta có thể xác định giá trị dự kiến ​​của thời gian chạy.

Một ví dụ nổi tiếng là Quicksort: nếu chúng ta chọn ngẫu nhiên các pivots, chúng ta có thể chứng minh rằng thời gian chạy dự kiến ​​của nó trở thành O (n log n), mặc dù thời gian chạy tệ nhất của nó vẫn là O (n ^ 2). Một ví dụ trong đó ngẫu nhiên hóa rất mạnh là vấn đề vòng tròn bao quanh nhỏ nhất: có một thuật toán đơn giản có thời gian chạy tệ nhất là O (n ^ 3), nhưng trong kỳ vọng, thời gian chạy của nó chỉ là O (n).

Thời gian chạy trung bình thường được sử dụng khi nói về hành vi của thuật toán 'đối với hầu hết các đầu vào'. Ví dụ, chúng tôi xác định một số cách tạo ngẫu nhiên một đầu vào, chúng tôi điền vào một mảng với các số ngẫu nhiên hoặc chúng tôi hoán vị ngẫu nhiên các số từ 1 đến n (để không trùng lặp) hoặc chúng tôi lật một đồng xu và có được một bộ giảm dần hoặc tăng dần số. Thời gian chạy trung bình của một thuật toán cho phân phối đầu vào ngẫu nhiên đó là thời gian chạy dự kiến ​​của thuật toán (trong trường hợp đó thuật toán có thể không được chọn ngẫu nhiên, nhưng đầu vào là).

Ví dụ: có những vấn đề hình học mà thuật toán tồn tại dường như hoạt động tốt ngay từ cái nhìn đầu tiên, cho đến khi bạn phát hiện ra một cách phân phối rất kỳ lạ, giả sử, các dòng đầu vào. Nếu bạn giả sử các dòng được phân phối ngẫu nhiên, thì có thể xảy ra trường hợp những tình huống kỳ lạ này cực kỳ khó xảy ra, vì vậy thuật toán của bạn kết thúc tốt.

Tương phản: thời gian chạy dự kiến ​​là về cách thuật toán thực hiện 'trừ khi bạn gặp xui xẻo' - thử lại cùng một thuật toán trên cùng một đầu vào nhưng với các lựa chọn ngẫu nhiên khác nhau có thể dẫn đến việc giải quyết nhanh hơn nhiều. Thời gian chạy trung bình nói về việc thuật toán hoạt động tốt như thế nào 'đối với hầu hết các đầu vào' - thử lại cùng một thuật toán trên cùng một đầu vào sẽ không giúp bạn (trừ khi thuật toán cũng được chọn ngẫu nhiê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.