Thuật toán hiệu quả là gì?


10

Từ quan điểm của hành vi tiệm cận, thuật toán "hiệu quả" là gì? Tiêu chuẩn / lý do để vẽ đường tại điểm đó là gì? Cá nhân, tôi sẽ nghĩ rằng bất cứ điều gì mà tôi có thể gọi một cách ngây thơ là "đa thức phụ", sao cho như sẽ hiệu quả và bất cứ điều gì sẽ "không hiệu quả". Tuy nhiên, tôi đã nghe thấy bất cứ thứ gì thuộc bất kỳ thứ tự đa thức nào đều được gọi là hiệu quả. Lý do là gì?n 1 + ϵ Ω ( n 2 )f(n)= =o(n2)n1+εΩ(n2)


Câu trả lời:


11

Điều đó phụ thuộc vào bối cảnh. Trong khoa học máy tính lý thuyết, thông thường mọi thuật toán thời gian đa thức đều được coi là "hiệu quả". Trong thuật toán xấp xỉ ví dụ như một thời gian chạy của sẽ được coi là hiệu quả, mặc dù nó sẽ không thể sử dụng được trong thực tế đối với bất kỳ giá trị hợp lý của ε . Một thuật toán cho SAT chạy trong n 2 100 sẽ là một bước đột phá đáng kinh ngạc.n1/ϵ1/ϵϵn2100

Trong thuật toán cổ điển, tức là các thuật toán từ thập niên 80 trở về trước, thời gian chạy dưới hoặc hơn (nghĩ nhân ma trận, khớp chi phí tối thiểu, lưu lượng, lập trình tuyến tính) được coi là hiệu quả. Họ vẫn được coi là hiệu quả bởi hầu hết mọi người, tôi nói. Tất nhiên một n 2 thuật toán không được coi là hiệu quả nếu một n log n thuật toán được biết đến, như để phân loại ví dụ.n3n2nlogn

Ngày nay có một xu hướng đối với các thuật toán tuyến tính hoặc thuật toán phát trực tuyến có khả năng xử lý terabyte dữ liệu. Hãy thử sử dụng phép nhân ma trận để tính thứ hạng trang của tất cả các trang trong chỉ mục của Google. Điều đó sẽ không làm việc.

Tất nhiên, trong khi chắc chắn hữu ích, thời gian chạy tiệm cận của thuật toán không nói lên toàn bộ câu chuyện. Có những thuật toán có thời gian chạy tiệm cận tốt, nhưng các hằng số rất lớn đến mức chúng không thể được sử dụng một cách hiệu quả. Không bao giờ. Lipton gọi chúng là Thuật toán thiên hà . Robert Sedgewick thậm chí còn tuyên bố rằng giới hạn trường hợp xấu nhất là "thường vô dụng để dự đoán, thường vô dụng đối với các bảo đảm" và "phân tích trường hợp xấu nhất là vô ích để dự đoán hiệu suất" trong bài nói của ông đưa Khoa học trở lại Khoa học máy tính .


9
Tóm lại: hiệu quả là những gì giải quyết vấn đề của bạn trong một khung thời gian phù hợp với bạn.
Raphael

Điều này không thực sự cần câu trả lời của riêng nó, nhưng BPP, là lớp các hàm với thời gian chạy đa thức (như được mô tả trong câu trả lời) với tính ngẫu nhiên, thường được coi là hiệu quả. Nói cách khác, ở trên là đúng, nhưng máy tính thường được phép truy cập ngẫu nhiên để thực hiện các phép tính. Một trong những ứng dụng thực tế quan trọng nhất của ngẫu nhiên là băm.
SamM

Có lẽ "hiệu quả" không thực sự là thuật ngữ đúng ở nơi đầu tiên? Tôi chỉ đang xem lại một trong những cuốn sách tính toán của mình, và tác giả gọi các thời gian chạy đa thức là "có thể điều chỉnh được" và các thời gian chạy theo cấp số nhân là "không thể hiểu được".
Robert S. Barnes

1
@ RobertS.Barnes: Các từ khác nhau, cùng một vấn đề.
Raphael

4

2 xu của tôi từ góc của thuật toán phân tán: Khi xem xét các mạng quy mô lớn (P2P, mạng xã hội, v.v.), thuật toán phân tán được coi là hiệu quả nếu thời gian chạy của nó là cho một số hằng số c > 0 thuật toán sử dụng các thông điệp của các bit O ( log n ) . Lưu ý rằng yêu cầu về kích thước thư thường được đưa ra thậm chí còn quan trọng hơn thời gian chạy, đặc biệt đối với các sự cố "toàn cầu" có giới hạn thấp hơn về thời gian chạy, ví dụ MST được phân phối.Ôi(đăng nhậpcn)c>0 Ôi(đăng nhậpn)


3

Lý do đằng sau là, từ góc độ hành vi tiệm cận, tốc độ tăng trưởng đa thức thấp hơn một cách tầm thường so với tốc độ tăng trưởng siêu đa thức. Trong thực tế, thuật toán thời gian đa thức chạy nhanh hơn nhiều so với thuật toán thời gian siêu đa thức khi kích thước đầu vào tăng lên.

Tất nhiên, không ai có thể nói rằng một thuật toán có độ phức tạp đa thức của, ví dụ, là "hiệu quả", nhưng phần lớn các thuật toán hiếm khi vượt quá độ phức tạp của O ( n 5 ) .Ôi(n2000)Ôi(n5)

Ôi(n2)


3

Về lý thuyết, một thuật toán được cho là hiệu quả nếu thời gian chạy trong trường hợp xấu nhất của nó bị giới hạn bởi một đa thức trong độ dài đầu vào của nó. Lý do là đa thức có thuộc tính đóng tốt đẹp. Thêm, nhân, tạo đa thức là các phép toán tạo ra đa thức và chúng là tốt nếu bạn đang giảm các vấn đề với nhau.

Tất nhiên, khoảng cách giữa đa thức và hàm mũ sẽ rất lớn khi độ dài đầu vào tăng nên thuật toán thời gian đa thức là cách tốt hơn. Trong thực tế, thuật toán đa thức có thể mất nhiều thời gian trước khi chấm dứt nhưng có thể đó là một thuật toán tối ưu (tốt nhất có thể) trong trường hợp tôi sẽ nói là nó hiệu quả.


Mặc dù tôi có thể hiểu rằng nếu một cái gì đó là thuật toán được biết đến nhanh nhất cho một vấn đề cụ thể thì nó có thể được coi là "hiệu quả" theo quan điểm đó, thật khó để tôi nghĩ bất cứ điều gì chạy trong polytime đều hiệu quả. :-)
Robert S. Barnes

Đối với thời gian chạy đa thức, "hiệu quả" chỉ là một từ và là một từ sai lầm ở đó.
Raphael

@Raphael Có lẽ dễ sử dụng là một từ tốt hơn để sử dụng ...?
Robert S. Barnes

1
@ RobertS.Barnes: Không tốt hơn nhiều, imho. "Tractable" là mỗi bit tương đối như "hiệu quả".
Raphael

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.