Sự khác nhau giữa là gì Big-O ký hiệu O(n)
và Little-O ký hiệu o(n)
?
Sự khác nhau giữa là gì Big-O ký hiệu O(n)
và Little-O ký hiệu o(n)
?
Câu trả lời:
f ∈ O (g) nói, về cơ bản
Đối với ít nhất một lựa chọn của hằng số k > 0, bạn có thể tìm thấy hằng số a sao cho bất đẳng thức 0 <= f (x) <= kg (x) giữ cho tất cả x> a.
Lưu ý rằng O (g) là tập hợp tất cả các hàm mà điều kiện này giữ.
f ∈ o (g) nói, về cơ bản
Với mọi lựa chọn hằng số k > 0, bạn có thể tìm thấy hằng số a sao cho bất đẳng thức 0 <= f (x) <kg (x) giữ cho tất cả x> a.
Một lần nữa, lưu ý rằng o (g) là một tập hợp.
Trong Big-O, bạn chỉ cần tìm một số nhân k cụ thể mà bất đẳng thức vượt quá một số x tối thiểu .
Trong Little-o, phải có tối thiểu x sau đó bất đẳng thức giữ cho dù bạn tạo k nhỏ đến mức nào , miễn là nó không âm hoặc bằng 0.
Cả hai đều mô tả giới hạn trên, mặc dù hơi phản trực giác, Little-o là tuyên bố mạnh mẽ hơn. Có một khoảng cách lớn hơn nhiều giữa tốc độ tăng trưởng của f và g nếu f ∈ o (g) so với nếu f ∈ O (g).
Một minh họa cho sự chênh lệch này là: f ∈ O (f) là đúng, nhưng f ∈ o (f) là sai. Do đó, Big-O có thể được đọc là "f ∈ O (g) có nghĩa là sự tăng trưởng tiệm cận của f không nhanh hơn g", trong khi "f ∈ o (g) có nghĩa là sự tăng trưởng tiệm cận của f chậm hơn so với g". Nó giống như <=
so với <
.
Cụ thể hơn, nếu giá trị của g (x) là bội số không đổi của giá trị f (x), thì f ∈ O (g) là đúng. Đây là lý do tại sao bạn có thể bỏ hằng số khi làm việc với ký hiệu big-O.
Tuy nhiên, để f ∈ o (g) là đúng, thì g phải bao gồm công suất cao hơn của x trong công thức của nó và do đó, khoảng cách tương đối giữa f (x) và g (x) thực sự phải lớn hơn khi x lớn hơn.
Để sử dụng các ví dụ toán học thuần túy (thay vì tham khảo các thuật toán):
Những điều sau đây đúng với Big-O, nhưng sẽ không đúng nếu bạn sử dụng little-o:
Những điều sau đây là đúng đối với little-o:
Lưu ý rằng nếu f ∈ o (g), điều này có nghĩa là f ∈ O (g). ví dụ: x² o (x³) vì vậy cũng đúng là x² O (x³), (một lần nữa, hãy nghĩ về O as <=
và o as <
)
a
có k
: ...", đó là "vì mọi thứ đều k
có a
: ..."
Big-O là ít-o như ≤
là để <
. Big-O là một giới hạn trên bao gồm, trong khi Little-o là một giới hạn trên nghiêm ngặt.
Ví dụ: hàm f(n) = 3n
là:
O(n²)
, o(n²)
vàO(n)
O(lg n)
, o(lg n)
hoặco(n)
Tương tự, số 1
là:
≤ 2
, < 2
Và≤ 1
≤ 0
, < 0
hoặc< 1
Đây là một bảng, hiển thị ý tưởng chung:
(Lưu ý: bảng là một hướng dẫn tốt nhưng định nghĩa giới hạn của nó phải theo giới hạn vượt trội thay vì giới hạn bình thường. Ví dụ: 3 + (n mod 2)
dao động trong khoảng từ 3 đến 4 mãi mãi. O(1)
Mặc dù không có giới hạn bình thường, bởi vì nó vẫn có giới hạn bình thường a lim sup
: 4.)
Tôi khuyên bạn nên ghi nhớ cách ký hiệu Big-O chuyển thành so sánh tiệm cận. Các so sánh dễ nhớ hơn, nhưng kém linh hoạt hơn vì bạn không thể nói những điều như n O (1) = P.
Tôi thấy rằng khi tôi không thể nắm bắt một cách khái niệm một cái gì đó, nghĩ về lý do tại sao một người sẽ sử dụng X là hữu ích để hiểu X. (Không phải nói rằng bạn đã không thử điều đó, tôi chỉ đang thiết lập giai đoạn.)
[những thứ bạn biết] Một cách phổ biến để phân loại thuật toán là theo thời gian chạy và bằng cách trích dẫn độ phức tạp lớn của thuật toán, bạn có thể có được ước tính khá tốt về cái nào là "tốt hơn" - bất kỳ cái nào có chức năng "nhỏ nhất" trong O! Ngay cả trong thế giới thực, O (N) "tốt hơn" O (N²), loại bỏ những thứ ngớ ngẩn như hằng số siêu lớn và những thứ tương tự. [/ Thứ bạn biết]
Giả sử có một số thuật toán chạy trong O (N). Khá tốt hả? Nhưng giả sử bạn (bạn là người thông minh, bạn) nghĩ ra một thuật toán chạy trong O ( N ⁄ loglogloglogN ). YAY! Nó nhanh hơn! Nhưng bạn sẽ cảm thấy ngớ ngẩn khi viết đi viết lại nhiều lần khi bạn viết luận án. Vì vậy, bạn viết nó một lần và bạn có thể nói "Trong bài báo này, tôi đã chứng minh rằng thuật toán X, trước đây có thể tính toán được trong thời gian O (N), trên thực tế có thể tính toán được trong o (n)."
Do đó, mọi người đều biết rằng thuật toán của bạn nhanh hơn --- bằng bao nhiêu không rõ ràng, nhưng họ biết nó nhanh hơn. Về mặt lý thuyết. :)