Big O chính thức
O ( f( n ) ) = { g( n ) | ∃ c > 0 , ∃n0> 0 , ∀ n >n0: 0 ≤ g( n ) ≤ c ∗ f( n ) }
Big O không chính thức
O ( f( n ) ) là tập hợp các hàm phát triển chậm hơn (hoặc nhanh tương đương) so với f( n ). Điều này có nghĩa là bất cứ chức năng nào bạn chọn từO ( f( n ) ), hãy đặt tên cho cô ấy g( n )và bạn chọn một số tiền đủ lớn n, f( n ) sẽ lớn hơng( n ). Hay nói cách khácf( n ) cuối cùng sẽ vượt qua bất kỳ chức năng nào trong O ( f( n ) ) khi nào n phát triển lớn hơn. n là kích thước đầu vào của thuật toán của bạn.
Làm ví dụ Hãy chọnf( n ) =n2.
Chúng ta có thể nói về điều đó f( N ) ∈ O (n3). Lưu ý rằng, theo thời gian, chúng tôi cho phép lạm dụng ký hiệu nên hầu như mọi người đều viếtf( n ) = O (n3) hiện nay.
Thông thường khi chúng tôi đánh giá các thuật toán, chúng tôi xem xét thứ tự của chúng. Bằng cách này, chúng ta có thể dự đoán như thế nào thời gian chạy của thuật toán sẽ tăng lên khi kích thước đầu vào (n) tăng.
Trong ví dụ của bạn, cả hai thuật toán đều có thứ tự O (n2). Vì vậy, thời gian chạy của chúng sẽ tăng theo cùng một cách (bậc hai) nhưntăng. Thuật toán thứ hai của bạn sẽ chậm hơn bốn lần so với thuật toán đầu tiên, nhưng đó là điều chúng tôi thường không quan tâm đến ** về mặt lý thuyết *. Các thuật toán có cùng thứ tự có thể có các yếu tố khác nhau (ctrong định nghĩa chính thức) hoặc các thuật ngữ bậc thấp khác nhau trong hàm đánh giá số bước. Nhưng thường thì đó là vì chi tiết triển khai và chúng tôi không quan tâm đến điều đó.
Nếu bạn có một thuật toán chạy trong O ( l o g( n ) ) thời gian chúng ta có thể nói rằng nó sẽ nhanh hơn Ô ( n ) [1] bởi vì l o g( n ) = O ( n ). Dù tệ đến đâuO ( l o g( n ) ) thuật toán được triển khai, cho dù bạn đặt thuật toán bao nhiêu tiền, nó sẽ luôn nhanh hơn [1] Ô ( n )thuật toán. Ngay cả khi số lượng các bước trong thuật toán là9999 * l o g( n ) = O ( l o g( n ) ) và 0,0001 ∗ n = O ( n ), các O ( l o g( n ) ) thuật toán cuối cùng sẽ nhanh hơn [1].
Nhưng, có lẽ, trong ứng dụng của bạn, n luôn luôn thấp và sẽ không bao giờ đủ lớn để O ( l o g( n ) )thuật toán sẽ nhanh hơn trong thực tế . Vì vậy, sử dụngÔ ( n ) thuật toán sẽ dẫn đến thời gian chạy nhanh hơn, mặc dù n = O ( l o g( n ) )
[1] nếu n là đủ lớn.
n
nhỏ vàn
thường nhỏ. Các thuật toán ưa thích có hằng số lớn. Cho đến khi bạn biết rằngn
nó thường sẽ lớn, đừng 'không được ưa thích. " Điều này là do sự khác biệt giữa độ phức tạp lý thuyết và hiệu quả thực tế, được xác định rõ ràng trong các câu trả lời dưới đây.