Terkadang saya melihat Θ (n) dengan simbol Θ aneh dengan sesuatu di tengahnya, dan kadang-kadang hanya O (n). Apakah hanya malas mengetik karena tidak ada yang tahu cara mengetik simbol ini, atau apakah itu berarti sesuatu yang berbeda?
Terkadang saya melihat Θ (n) dengan simbol Θ aneh dengan sesuatu di tengahnya, dan kadang-kadang hanya O (n). Apakah hanya malas mengetik karena tidak ada yang tahu cara mengetik simbol ini, atau apakah itu berarti sesuatu yang berbeda?
Jawaban:
Jika suatu algoritma adalah dari Θ (g (n)), itu berarti bahwa waktu berjalan dari algoritma sebagai n (ukuran input) semakin besar sebanding dengan g (n).
Jika suatu algoritma adalah dari O (g (n)), itu berarti bahwa waktu berjalan dari algoritma ketika n semakin besar paling sebanding dengan g (n).
Biasanya, bahkan ketika orang berbicara tentang O (g (n)) yang sebenarnya mereka maksud Θ (g (n)) tetapi secara teknis, ada perbedaan.
O (n) mewakili batas atas. Θ (n) berarti terikat erat. Ω (n) mewakili batas bawah.
f (x) = Θ (g (x)) iff f (x) = O (g (x)) dan f (x) = Ω (g (x))
Pada dasarnya ketika kita mengatakan suatu algoritma adalah O (n), itu juga O (n 2 ), O (n 1000000 ), O (2 n ), ... tetapi algoritma Θ (n) bukan Θ (n 2 ) .
Faktanya, karena f (n) = Θ (g (n)) berarti untuk nilai n yang cukup besar, f (n) dapat terikat dalam c 1 g (n) dan c 2 g (n) untuk beberapa nilai c 1 dan c 2 , yaitu laju pertumbuhan f secara asimptotik sama dengan g: g dapat berupa batas bawah dan dan batas atas dari f. Ini secara langsung menyiratkan f dapat menjadi batas bawah dan batas atas g juga. Karena itu,
f (x) = Θ (g (x)) iff g (x) = Θ (f (x))
Demikian pula, untuk menunjukkan f (n) = Θ (g (n)), itu cukup untuk menunjukkan g adalah batas atas f (yaitu f (n) = O (g (n))) dan f adalah batas bawah dari g (yaitu f (n) = Ω (g (n)) yang merupakan hal yang sama persis dengan g (n) = O (f (n)))). Secara singkat,
f (x) = Θ (g (x)) iff f (x) = O (g (x)) dan g (x) = O (f (x))
Ada juga ω
notasi -oh dan little-omega ( ) kecil yang mewakili batas fungsi atas dan bawah yang longgar.
Untuk meringkas:
f(x) = O(g(x))
(Besar-oh) berarti bahwa tingkat pertumbuhanf(x)
secara asimtotik kurang dari atau sama dengan tingkat pertumbuhang(x)
.
f(x) = Ω(g(x))
(big-omega) berarti bahwa tingkat pertumbuhanf(x)
secara asimptot lebih besar dari atau sama dengan tingkat pertumbuhang(x)
f(x) = o(g(x))
(little-oh) berarti bahwa laju pertumbuhanf(x)
secara asimptotik lebih rendah daripada laju pertumbuhang(x)
.
f(x) = ω(g(x))
(little-omega) berarti bahwa laju pertumbuhanf(x)
secara asimptotik lebih besar daripada laju pertumbuhang(x)
f(x) = Θ(g(x))
(theta) berarti bahwa laju pertumbuhanf(x)
secara asimptotik sama dengan laju pertumbuhang(x)
Untuk diskusi yang lebih terperinci, Anda dapat membaca definisi tentang Wikipedia atau membaca buku teks klasik seperti Pengantar Algoritma oleh Cormen et al.
>= \Omega(...)
artinya Saya mengerti jika kita mengatakan itu anggota \Omega(...)
, tetapi jika lebih besar dari itu? Apa artinya itu?
Ada cara sederhana (trik, kurasa) untuk mengingat notasi mana yang berarti apa.
Semua notasi Big-O dapat dianggap memiliki bilah.
Saat melihat Ω, bilah berada di bagian bawah, jadi itu adalah batas bawah (asimptotik).
Saat melihat Θ, bilah jelas berada di tengah. Jadi itu adalah ikatan ketat (asimptotik).
Saat tulisan tangan O, Anda biasanya selesai di bagian atas, dan menggambar coretan. Oleh karena itu O (n) adalah batas atas fungsi. Agar adil, yang ini tidak bekerja dengan sebagian besar font, tetapi itu adalah pembenaran asli nama-nama.
satu adalah Big "O"
satu adalah Big Theta
http://en.wikipedia.org/wiki/Big_O_notation
Big O berarti algoritma Anda akan dieksekusi dalam tidak lebih dari langkah dalam ekspresi yang diberikan (n ^ 2)
Big Omega berarti algoritma Anda akan dieksekusi dalam langkah tidak kurang dari pada ekspresi yang diberikan (n ^ 2)
Ketika kedua kondisi tersebut benar untuk ekspresi yang sama, Anda dapat menggunakan notasi theta besar ....
Daripada memberikan definisi teoretis, yang sudah dirangkum dengan indah di sini, saya akan memberikan contoh sederhana:
Asumsikan waktu menjalankan f(i)
adalah O(1)
. Di bawah ini adalah fragmen kode yang runtime asimptotiknya Θ(n)
. Ini selalu memanggil fungsi f(...)
n
kali. Baik batas bawah dan atas adalah n.
for(int i=0; i<n; i++){
f(i);
}
Fragmen kode kedua di bawah ini memiliki runtime asimptotik O(n)
. Ini panggilan fungsi f(...)
paling n
banyak. Batas atas adalah n, tetapi batas bawah bisa Ω(1)
atau Ω(log(n))
tergantung pada apa yang terjadi di dalam f2(i)
.
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
Θ(n)
akan tumbuh secara linear ketika n bertambah, misalnya runtime T dapat dinyatakan sebagai T (n) = a * n + b. Untuk nilai kecil n (misalnya n = 1 atau 2) ini mungkin bukan cara terbaik untuk menggambarkan perilaku - mungkin Anda memiliki beberapa kode inisialisasi yang membutuhkan waktu lebih lama daripada f (i).
Theta adalah cara singkat untuk merujuk pada suatu sangkaan khusus di mana O dan Omega besar adalah sama.
Jadi, jika seseorang mengklaim The Theta is expression q
, maka mereka juga harus mengklaim itu Big O is expression q
dan Omega is expression q
.
Analogi kasar:
Jika: Theta mengklaim, "Binatang itu memiliki 5 kaki." maka berikut: Big O benar ("Hewan itu memiliki kurang dari atau sama dengan 5 kaki.") dan Omega benar ("Hewan itu memiliki lebih dari atau sama dengan 5 kaki.")
Ini hanya analogi kasar karena ekspresi tidak harus angka tertentu, melainkan fungsi berbagai urutan besarnya seperti log (n), n, n ^ 2, (dll).
Sebuah grafik bisa membuat jawaban sebelumnya lebih mudah untuk memahami:
Dalam Bahasa Inggris,
Di sebelah kiri, perhatikan bahwa ada batas atas dan batas bawah yang keduanya memiliki urutan besarnya yang sama (yaitu g (n) ). Abaikan konstanta, dan jika batas atas dan batas bawah memiliki urutan magnitudo yang sama, seseorang dapat dengan benar mengatakan f (n) = Θ (g (n)) atau f (n) berada dalam theta besar dari g (n) .
Dimulai dengan yang benar, contoh yang lebih sederhana, dikatakan bahwa batas atas g (n) hanyalah urutan besarnya dan mengabaikan konstanta c (seperti halnya semua notasi O besar ).
f(n)
milik O(n)
jika ada positif k
sebagaif(n)<=k*n
f(n)
milik Θ(n)
jika ada positif k1
, k2
sepertik1*n<=f(n)<=k2*n
Mari kita pertimbangkan f(n) > 0
dan g(n) > 0
untuk semua n
. Tidak masalah untuk mempertimbangkan ini, karena algoritma nyata tercepat memiliki setidaknya satu operasi dan menyelesaikan eksekusi setelah dimulainya. Ini akan menyederhanakan kalkulus, karena kita dapat menggunakan nilai ( f(n)
) alih-alih nilai absolut ( |f(n)|
).
f(n) = O(g(n))
Umum:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
Untuk g(n) = n
:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
Contoh:
Expression Value of the limit
------------------------------------------------
n = O(n) 1
1/2*n = O(n) 1/2
2*n = O(n) 2
n+log(n) = O(n) 1
n = O(n*log(n)) 0
n = O(n²) 0
n = O(nⁿ) 0
Contoh tandingan:
Expression Value of the limit
-------------------------------------------------
n ≠ O(log(n)) ∞
1/2*n ≠ O(sqrt(n)) ∞
2*n ≠ O(1) ∞
n+log(n) ≠ O(log(n)) ∞
f(n) = Θ(g(n))
Umum:
f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
Untuk g(n) = n
:
f(n)
0 < lim ──────── < ∞
n➜∞ n
Contoh:
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1
Contoh tandingan:
Expression Value of the limit
-------------------------------------------------
n ≠ Θ(log(n)) ∞
1/2*n ≠ Θ(sqrt(n)) ∞
2*n ≠ Θ(1) ∞
n+log(n) ≠ Θ(log(n)) ∞
n ≠ Θ(n*log(n)) 0
n ≠ Θ(n²) 0
n ≠ Θ(nⁿ) 0
Kesimpulan: kita menganggap O besar, besar θ dan besar Ω sebagai hal yang sama.
Mengapa? Saya akan sampaikan alasannya di bawah ini:
Pertama, saya akan mengklarifikasi satu pernyataan yang salah, beberapa orang berpikir bahwa kita hanya peduli pada kompleksitas waktu terburuk, jadi kita selalu menggunakan O besar daripada besar θ. Saya akan mengatakan pria ini omong kosong. Batas atas dan batas bawah digunakan untuk menggambarkan satu fungsi, tidak digunakan untuk menggambarkan kompleksitas waktu. Fungsi waktu terburuk memiliki batas atas dan bawahnya; fungsi waktu terbaik juga memiliki batas atas dan bawahnya.
Untuk menjelaskan dengan jelas hubungan antara big O dan big θ, saya akan menjelaskan hubungan antara big O dan small o terlebih dahulu. Dari definisi tersebut, kita dapat dengan mudah mengetahui bahwa o kecil adalah subset dari O besar. Misalnya:
T (n) = n ^ 2 + n, kita dapat mengatakan T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4). Tetapi untuk o kecil, T (n) = o (n ^ 2) tidak memenuhi definisi o kecil. Jadi, hanya T (n) = o (n ^ 3), T (n) = o (n ^ 4) benar untuk o kecil. T redundan (n) = O (n ^ 2) adalah apa? Ini besar θ!
Secara umum, kita mengatakan O besar adalah O (n ^ 2), hampir tidak mengatakan T (n) = O (n ^ 3), T (n) = O (n ^ 4). Mengapa? Karena kita menganggap O besar sebagai besar θ secara tidak sadar.
Demikian pula, kita juga menganggap besar Ω sebagai besar θ secara tidak sadar.
Dalam satu kata, besar O, besar θ dan besar Ω bukan hal yang sama dari definisi, tetapi mereka adalah hal yang sama di mulut dan otak kita.