Ký hiệu Big Oh (O, Theta, Omega) là về tốc độ tăng trưởng của các chức năng.
Khi bạn thực hiện một thuật toán, nó có một đặc điểm nhất định về cách thời gian chạy thay đổi khi bạn tăng bộ dữ liệu hoạt động. Bây giờ, bạn có thể tối ưu hóa thuật toán để nó chạy nhanh hơn với hệ số 100. Chắc chắn, điều này thật tuyệt, nhưng về cơ bản, nó vẫn là thuật toán tương tự. Tương tự, trong một vài năm, máy tính có thể nhanh gấp đôi so với ngày nay.
Ký hiệu Landau trừu tượng hóa các yếu tố không đổi này. Nó không quan tâm đến việc liệu một thuật toán f
luôn nhanh gấp đôi so với thuật toán khác hay không g
: Có g
thể được tối ưu hóa để chạy nhanh hơn 4 lần hoặc bạn có thể mua phần cứng nhanh hơn thay thế. Nếu bạn nhìn nó từ quan điểm này, bạn có thể nói họ "giống nhau". (Điều đó không có nghĩa là bạn có thể (luôn luôn) bỏ qua các yếu tố không đổi trong thực tế.)
Big oh chỉ định một giới hạn trên, nó tương tự như <=
mối quan hệ.
Bạn sẽ đồng ý đó 1 < 2
là sự thật. Điều đó có nghĩa là 1
không thể ít hơn bất kỳ số nào khác? Chắc chắn không. Có một số lượng vô hạn lớn hơn 1
.
Với tốc độ tăng trưởng, nó tương tự. O(n)
biểu thị tập hợp của tất cả các hàm, tăng trưởng tuyến tính (hoặc chậm hơn). O(n^2)
mặt khác biểu thị tất cả các chức năng đó, phát triển với sự đồng bộ bậc hai (hoặc chậm hơn). Tôi chắc chắn rằng bạn sẽ đồng ý rằng một hàm tuyến tính phát triển chậm hơn một hàm bậc hai.
Đây là lý do tại sao một hàm có thể nằm trong nhiều lớp "Big-oh".
Dưới đây là so sánh các hàm khác nhau với : (từ toán học cụ thể của Knuth)
Từ trái sang phải, các chức năng phát triển nhanh hơn.
Ngoài ra, có nghĩa là n ^ 2 tăng nhanh hơn n ^ 1 vì 2> 1.
Các định nghĩa
"f phát triển nhanh hơn hoặc nhanh bằng g"
"f phát triển chậm hơn hoặc nhanh bằng g"
Sự kết hợp của hai điều trên. Nó nói rằng chức năng f
phát triển "nhanh như nhau" như g
. Đó là một mối quan hệ tương đương.
Diễn dịch
Giả sử bạn có hai thuật toán f
và g
.
Omega
Giả sử , có nghĩa là bất kể ngân sách của bạn, không có sức mạnh tính toán liên tục mà bạn có thể thêm vào hệ thống của mình, như vậy f
sẽ luôn chạy nhanh như vậy g
.
Lớn rồi
Giả sử , có nghĩa là nếu bạn có đủ dữ liệu, f
sẽ luôn chạy nhanh hơn g
, bất kể bạn có thêm bao nhiêu năng lực tính toán vào hệ thống của mình.
Bằng chứng
Nếu bạn thực sự cố gắng chứng minh điều này, bạn cần thể hiện bằng cách sử dụng các định nghĩa của ký hiệu Landau rằng chức năng của bạn đáp ứng các điều kiện cần thiết.
Vì vậy, bạn cần phải tìm giá trị cho c
, d
, n_0
như vậy tình trạng nắm giữ.
Đây là cách bạn có thể làm điều đó cho giới hạn dưới với c
:
Điều quan trọng là nhận ra rằng, tôi tùy tiện xác định c
là nhỏ hơn a-1
là hoàn toàn tốt. Định nghĩa của Theta (g) nói rằng "tồn tại một c
". Nó có thể là bất kỳ giá trị nào miễn là lớn hơn 0. (Nếu a
là số thực dương, bạn sẽ cần thay đổi bằng chứng một chút, vì a - 1
thực tế có thể là số âm)
(Tôi giả sử a
là dương, nếu không, hàm sẽ luôn âm đối với các giá trị lớn n
, điều này không có nghĩa đối với hàm biểu thị thời gian chạy.)
Bạn có thể thử làm nó cho giới hạn trên, nó khá giống nhau. Nếu bạn không biết làm thế nào, tôi có thể cung cấp bằng chứng cho bạn.
Gợi ý: bắt đầu với d > a + 1
Chú ý
Điều quan trọng là bạn không chứng minh nó sai cách. Nếu bạn cho rằng (an + b) nằm trong O (n) và đi từ đó, bạn chưa chứng minh được mình muốn gì. Bạn sẽ cần xác minh rằng tất cả các bước của bạn đi cả hai chiều, tức là thay vì =>
bạn có <=>
.