Tại sao Big O được dạy thay vì Big Theta?


21

Ký hiệu Big O cung cấp giới hạn trên cho một chức năng trong khi Big Theta cung cấp giới hạn chặt chẽ. Tuy nhiên tôi thấy rằng ký hiệu Big O thường (và không chính thức) được dạy và sử dụng khi chúng thực sự có nghĩa là Big Theta.

ví dụ: "Quicksort là O (N ^ 2)" có thể biến thành câu lệnh mạnh mẽ hơn nhiều "Quicksort là Θ (N ^ 2)"

Mặc dù việc sử dụng Big O là đúng về mặt kỹ thuật, nhưng việc sử dụng Big Theta phổ biến hơn sẽ có ý nghĩa hơn và dẫn đến ít nhầm lẫn hơn? Có một số lý do lịch sử tại sao Big O này được sử dụng phổ biến hơn?

Wikipedia ghi chú:

Một cách không chính thức, đặc biệt là trong khoa học máy tính, ký hiệu Big O thường được phép lạm dụng để mô tả một ràng buộc chặt chẽ không có triệu chứng trong đó sử dụng ký hiệu Big Theta có thể phù hợp thực tế hơn trong một bối cảnh nhất định.


3
Tôi biết điều này không thực sự liên quan đến câu hỏi, nhưng quicksort không phải là theta (N ^ 2). Đó là O (N ^ 2).
jsternberg

Big O là những gì người mới bắt đầu / không phải CS cần biết. Big Theta là những gì được đề cập trong phần giới thiệu về thuật toán, sẽ không được thực hiện bởi mọi chuyên ngành. Những người đã có một lớp thuật toán có thể đọc sâu hơn ký hiệu Big O nếu họ muốn. Tôi không chắc những gì trích dẫn Wikipedia đề cập đến. Với các ấn phẩm học thuật, bạn sẽ bị rạch họng tại một hội nghị nếu bạn nhầm lẫn giữa Big O và Theta lớn. Một số người dành cả đời để theo đuổi Theta và đó là những vấn đề CỨNG CỨNG.
Công việc

@jsternberg Về mặt kỹ thuật bạn đã đúng. Điều này cũng đúng, nhưng vô nghĩa: "Quicksort trong mọi trường hợp (tệ nhất, tốt nhất, ...) là O (n ^ 100). Nhưng tôi đồng ý với OP nên chính xác hơn: Trường hợp xấu nhất của QuickSort là Theta (N ^ 2), trường hợp tốt nhất của QuickSort là Theta (NlogN). Bởi vì trong mỗi trường hợp, chúng tôi sẽ có chức năng khác nhau.
Eldar

Câu trả lời:


26

Bởi vì bạn thường chỉ quan tâm đến trường hợp xấu nhất khi phân tích hiệu suất. Như vậy, biết giới hạn trên là đủ.

Khi nó chạy nhanh hơn dự kiến ​​cho một đầu vào nhất định - không sao, đó không phải là điểm quan trọng. Đó chủ yếu là thông tin không đáng kể.

Một số thuật toán, như @Peter Taylor lưu ý, không có ràng buộc chặt chẽ nào cả. Xem quicksort ví dụ là O (n ^ 2) và Omega (n).

Hơn nữa, giới hạn chặt chẽ thường khó tính toán hơn.

Xem thêm:


6
Nhưng Big O không nhất thiết phải tương ứng với hiệu suất trường hợp xấu nhất. Tôi có thể nói quicksort chạy trong O (2 ^ n) và chính xác 100%. Sẽ có ý nghĩa hơn nhiều nếu tôi nói thuật toán X chạy trong Theta (N ^ 2) chứ không phải O (N ^ 2).
tskuzzy

Ngoài ra, giới hạn chặt chẽ hầu như luôn được tính toán khi phân tích các thuật toán thay vì chỉ giới hạn trên. Tôi đang hỏi tại sao mọi người không sử dụng ký hiệu theta biểu cảm hơn nhiều khi họ có thể.
tskuzzy

9
Tôi đã nói với bạn tại sao hầu hết các lập trình viên không sử dụng nó. Chúng tôi lười biếng và không cần nhiều sự chính xác. Không ai ngăn bạn sử dụng theta lớn nếu bạn muốn. Đi trước, làm điều đó. Sự lựa chọn thuật toán của bạn rất có thể sẽ không được hưởng lợi nhiều từ nó. Tôi chưa bao giờ nghe nói về một lập trình viên bối rối bởi ký hiệu O lớn. Tôi cũng vậy, tôi không thấy khó hiểu chút nào.
Falcon

9

Một lý do là có nhiều trường hợp không được biết đến. Chẳng hạn, phép nhân Ma trận là O (n ^ 2.376) nhưng không có ràng buộc chặt chẽ nào được biết đến. Chắc chắn, như xa như tôi có thể nói, đó một ràng buộc chặt chẽ cho Matrix nhân, nhưng chúng tôi không biết giá trị của nó.


Nhưng đó sẽ là giới hạn cho thời gian chạy của một vấn đề, không phải là một thuật toán cụ thể. Mặc dù phép nhân ma trận nói chung có thể được giải quyết nhanh hơn thời gian khối, thuật toán ngây thơ là Θ (n ^ 3) không có vấn đề gì.
tskuzzy

5
@tskuzzy, dùng quicksort. Nó không có giới hạn Theta, vì đó là O (n ^ 2) và Omega (n).
Peter Taylor
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.