Saya mengajukan pertanyaan ini karena saya bingung tentang satu aspek tentang notasi O besar.
Saya menggunakan buku, Struktur Data dan Abstraksi dengan Java oleh Frank Carrano. Dalam bab tentang "Efisiensi Algoritma" ia menunjukkan algoritma berikut:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Dia awalnya menggambarkan algoritma ini sebagai memiliki tingkat pertumbuhan (n 2 + n) / 2 . Yang melihatnya sepertinya intuitif.
Namun, kemudian dinyatakan bahwa (n 2 + n) / 2 berperilaku seperti n 2 ketika n besar. Dalam ayat yang sama ia menyatakan (n 2 + n) / 2 juga berperilaku seperti n 2 / 2 . Dia menggunakan ini untuk mengklasifikasikan algoritma di atas sebagai O (n 2 ) .
Saya mendapatkan bahwa (n 2 + n) / 2 adalah sama dengan n 2 / 2 karena persentase bijaksana, n membuat sedikit perbedaan. Yang tidak saya dapatkan adalah mengapa (n 2 + n) / 2 dan n 2 serupa, ketika n besar.
Misalnya, jika n = 1.000.000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Yang terakhir tidak sama sekali. Faktanya, cukup jelas, ini dua kali lebih banyak dari yang di tengah. Jadi bagaimana Frank Carrano mengatakan mereka serupa? Juga, bagaimana algoritma diklasifikasikan sebagai O (n 2 ) . Melihat lingkaran dalam itu saya akan mengatakan itu adalah n 2 + n / 2
n
tumbuh, baik fungsi 'n ^ 2` dan fungsi Anda, berperilaku sama, ada perbedaan konstan dalam tingkat pertumbuhannya. Jika Anda memiliki ekspresi yang kompleks, fungsi yang tumbuh lebih cepat mendominasi.