(vì đây là câu trả lời dài hơn, hãy đọc phần in đậm để tóm tắt )
Hãy lấy ví dụ của bạn và từng bước thực hiện nó, hiểu mục đích đằng sau những gì chúng ta đang làm. Chúng tôi bắt đầu với chức năng của bạn và mục tiêu tìm kiếm ký hiệu Big Oh của nó:
f(n) = 6n+4
Đầu tiên, hãy O(g(n))
là ký hiệu Big Oh mà chúng tôi đang cố gắng tìm kiếm f(n)
. Từ định nghĩa của Big Oh, chúng ta cần tìm một đơn giản hóa g(n)
nơi tồn tại một số hằng số c
và n0
nơi nào c*g(n) >= f(n)
đúng với tất cả n
lớn hơn n0
.
Đầu tiên, chúng ta hãy chọn g(n) = 6n + 4
(sẽ mang lại O(6n+4)
Big Oh). Trong trường hợp này, chúng tôi thấy rằng c = 1
và bất kỳ giá trị nào n0
sẽ đáp ứng các yêu cầu toán học từ định nghĩa của chúng tôi về Big Oh, vì g(n)
luôn luôn bằng f(n)
:
c*g(n) >= f(n)
1*(6n + 4) >= 6n + 4 //True for all n's, so we don't need to pick an n0
Tại thời điểm này, chúng tôi đã đáp ứng các yêu cầu toán học. Nếu chúng ta dừng lạiO(6n+4)
, rõ ràng điều này không hữu ích hơn viết f(n)
, vì vậy nó sẽ bỏ lỡ mục đích thực sự của ký hiệu Big Oh: để hiểu độ phức tạp thời gian chung của thuật toán! Vì vậy, hãy chuyển sang bước tiếp theo: đơn giản hóa.
Đầu tiên, chúng ta có thể đơn giản hóa ra khỏi 6n
Big Oh O(4)
không? Không! (Tập thể dục cho người đọc nếu họ không hiểu tại sao)
Thứ hai, chúng ta có thể đơn giản hóa 4
để Big Oh được O(6n)
không? Đúng! Trong trường hợp đó g(n) = 6n
, vì vậy:
c*g(n) >= f(n)
c*6n >= 6n + 4
Tại thời điểm này, hãy chọn c = 2
từ đó bên trái sẽ tăng nhanh hơn (12) so với bên phải (6) cho mỗi lần tăng n
.
2*6n >= 6n + 4
Bây giờ chúng ta cần tìm một số dương n0
trong đó phương trình trên đúng với tất cả các n
giá trị lớn hơn giá trị đó. Vì chúng ta đã biết rằng bên trái đang tăng nhanh hơn bên phải, tất cả những gì chúng ta phải làm là tìm một giải pháp tích cực. Do đó, vì n0 = 2
làm cho những điều trên trở thành sự thật, chúng tôi biết rằng g(n)=6n
, hoặc O(6n)
là một ký hiệu Big Oh tiềm năng cho f(n)
.
Bây giờ, chúng ta có thể đơn giản hóa 6
để Big Oh được O(n)
không? Đúng! Trong trường hợp đó g(n) = n
, vì vậy:
c*g(n) >= f(n)
c*n >= 6n + 4
Hãy chọn c = 7
vì bên trái sẽ tăng nhanh hơn bên phải.
7*n >= 6n + 4
Chúng tôi thấy rằng những điều trên sẽ đúng với tất cả n
lớn hơn hoặc bằng n0 = 4
. Vì vậy, O(n)
là một ký hiệu Big Oh tiềm năng cho f(n)
. Chúng ta có thể đơn giản hóa g(n)
nữa không? Không!
Cuối cùng, chúng tôi đã thấy rằng ký hiệu Big Oh đơn giản nhất f(n)
là O(n)
. Tại sao chúng ta trải qua tất cả điều này? Bởi vì bây giờ chúng ta biết đó f(n)
là tuyến tính , vì ký hiệu Big Oh là phức tạp tuyến tính O(n)
. Điều tuyệt vời là bây giờ chúng ta có thể so sánh độ phức tạp thời gian của f(n)
các thuật toán khác! Ví dụ, bây giờ chúng ta biết rằng f(n)
là có thể so sánh thời gian phức tạp đến các chức năng h(n) = 123n + 72
, i(n) = n
, j(n) = .0002n + 1234
, vv; bởi vì sử dụng cùng một quy trình đơn giản hóa được nêu ở trên, tất cả chúng đều có độ phức tạp thời gian tuyến tính của O(n)
.
Ngọt!!!