Apa perbedaan antara Big-O notasi O(n)
dan kecil-O notasi o(n)
?
Apa perbedaan antara Big-O notasi O(n)
dan kecil-O notasi o(n)
?
Jawaban:
f ∈ O (g) mengatakan, pada dasarnya
Untuk setidaknya satu pilihan konstan k > 0, Anda dapat menemukan sebuah konstanta suatu sehingga ketidaksamaan 0 <= f (x) <= kg (x) berlaku untuk semua x> a.
Perhatikan bahwa O (g) adalah himpunan semua fungsi tempat kondisi ini berlaku.
f ∈ o (g) mengatakan, pada dasarnya
Untuk setiap pilihan konstan k > 0, Anda dapat menemukan sebuah konstanta suatu sehingga ketidaksamaan 0 <= f (x) <kg (x) berlaku untuk semua x> a.
Sekali lagi, perhatikan bahwa o (g) adalah himpunan.
Dalam Big-O, Anda hanya perlu menemukan pengganda tertentu k yang ketidaksamaannya melebihi beberapa minimum x .
Dalam Little-o, harus ada minimum x setelah ketimpangan itu berlaku tidak peduli seberapa kecil Anda menghasilkan k , selama itu tidak negatif atau nol.
Keduanya menggambarkan batas atas, meskipun agak kontra-intuitif, Little-o adalah pernyataan yang lebih kuat. Ada jarak yang jauh lebih besar antara tingkat pertumbuhan f dan g jika f ∈ o (g) daripada jika f ∈ O (g).
Satu ilustrasi perbedaan adalah ini: f ∈ O (f) benar, tetapi f ∈ o (f) salah. Oleh karena itu, Big-O dapat dibaca sebagai "f ∈ O (g) berarti bahwa pertumbuhan asimptotik f tidak lebih cepat dari g", sedangkan "f ∈ o (g) berarti bahwa pertumbuhan asimtotik f benar-benar lebih lambat daripada g". Ini seperti <=
versus <
.
Lebih khusus lagi, jika nilai g (x) adalah kelipatan konstan dari nilai f (x), maka f ∈ O (g) benar. Inilah sebabnya Anda bisa menghilangkan konstanta saat bekerja dengan notasi O-besar.
Namun, agar f ∈ o (g) benar, maka g harus memasukkan kekuatan x yang lebih tinggi dalam formulanya, sehingga pemisahan relatif antara f (x) dan g (x) harus benar-benar menjadi lebih besar karena x semakin besar.
Untuk menggunakan contoh matematika murni (alih-alih merujuk pada algoritma):
Berikut ini benar untuk Big-O, tetapi tidak akan benar jika Anda menggunakan sedikit-o:
Berikut ini berlaku untuk little-o:
Perhatikan bahwa jika f ∈ o (g), ini berarti f ∈ O (g). misalnya x² ∈ o (x³) sehingga benar juga bahwa x² ∈ O (x³), (sekali lagi, anggap O sebagai <=
dan o sebagai <
)
a
ada k
yang: ...", itu "untuk setiap k
ada a
yang: ..."
Big-O adalah untuk sedikit-o sebagaimana ≤
adanya <
. Big-O adalah batas atas inklusif, sedangkan little-o adalah batas atas yang ketat.
Misalnya, fungsinya f(n) = 3n
adalah:
O(n²)
, o(n²)
, danO(n)
O(lg n)
, o(lg n)
atauo(n)
Secara analog, angkanya 1
adalah:
≤ 2
,, < 2
dan≤ 1
≤ 0
, < 0
atau< 1
Ini sebuah tabel, menunjukkan ide umum:
(Catatan: tabel adalah panduan yang baik tetapi definisi batasnya harus dalam hal batas superior daripada batas normal. Misalnya, 3 + (n mod 2)
berosilasi antara 3 dan 4 selamanya. O(1)
Meskipun tidak memiliki batas normal, karena masih memiliki batas a lim sup
: 4.)
Saya sarankan untuk mengingat bagaimana notasi Big-O dikonversi menjadi perbandingan asimptotik. Perbandingannya lebih mudah diingat, tetapi kurang fleksibel karena Anda tidak bisa mengatakan hal-hal seperti n O (1) = P.
Saya menemukan bahwa ketika saya tidak dapat memahami sesuatu secara konseptual, memikirkan mengapa seseorang akan menggunakan X sangat membantu untuk memahami X. (Belum lagi Anda belum mencobanya, saya hanya mengatur panggung.)
[hal-hal yang Anda ketahui] Cara umum untuk mengklasifikasikan algoritma adalah dengan runtime, dan dengan mengutip kompleksitas algoritma-Oh yang besar, Anda bisa mendapatkan estimasi yang cukup bagus tentang mana yang "lebih baik" - mana saja yang memiliki fungsi "terkecil" di dalam O! Bahkan di dunia nyata, O (N) "lebih baik" dari O (N²), kecuali hal-hal konyol seperti konstanta super-masif dan sejenisnya.
Katakanlah ada beberapa algoritma yang berjalan di O (N). Cukup bagus, ya? Tapi katakanlah Anda (Anda orang yang cerdas, Anda) datang dengan algoritma yang berjalan di O ( N ⁄ loglogloglogN ). YAY! Lebih cepat! Tetapi Anda akan merasa konyol menulis itu berulang-ulang ketika Anda menulis tesis Anda. Jadi Anda menulisnya sekali, dan Anda dapat mengatakan "Dalam makalah ini, saya telah membuktikan bahwa algoritma X, yang sebelumnya dapat dihitung dalam waktu O (N), sebenarnya dapat dihitung dalam o (n)."
Dengan demikian, semua orang tahu bahwa algoritme Anda lebih cepat --- seberapa banyak yang tidak jelas, tetapi mereka tahu lebih cepat. Secara teoretis. :)