Tôi đang hỏi câu hỏi này vì tôi bối rối về một khía cạnh liên quan đến ký hiệu O lớn.
Tôi đang sử dụng cuốn sách, Cấu trúc dữ liệu và Trừu tượng với Java của Frank Carrano. Trong chương về "Hiệu quả của thuật toán", ông trình bày thuật toán sau:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Ông ban đầu mô tả thuật toán này có tốc độ tăng trưởng là (n 2 + n) / 2 . Mà nhìn vào có vẻ trực quan.
Tuy nhiên, sau đó được tuyên bố rằng (n 2 + n) / 2 hoạt động như n 2 khi n lớn. Trong cùng một đoạn ông nói (n 2 + n) / 2 cũng cư xử giống như n 2 / 2 . Ông sử dụng điều này để phân loại thuật toán trên là O (n 2 ) .
Tôi nhận được rằng (n 2 + n) / 2 cũng tương tự như n 2 / 2 vì tỷ lệ khôn ngoan, n làm cho sự khác biệt nhỏ. Điều tôi không nhận được là tại sao (n 2 + n) / 2 và n 2 giống nhau, khi n lớn.
Ví dụ: nếu n = 1.000.000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Cái cuối cùng không giống nhau chút nào. Trên thực tế, khá rõ ràng, nó gấp đôi so với giữa. Vậy làm thế nào Frank Carrano có thể nói họ giống nhau? Ngoài ra, thuật toán được phân loại là O (n 2 ) như thế nào . Nhìn vào vòng lặp bên trong đó tôi sẽ nói đó là n 2 + n / 2
n
phát triển, cả hai chức năng 'n ^ 2` và chức năng của bạn, hoạt động tương tự nhau, có một sự khác biệt không đổi trong tốc độ tăng trưởng của chúng. Nếu bạn có một biểu thức phức tạp, chức năng phát triển nhanh hơn chiếm ưu thế.