Saya menyegarkan Teori CS saya, dan saya ingin tahu bagaimana mengidentifikasi bahwa algoritma O (log n) kompleksitas. Secara khusus, apakah ada cara mudah untuk mengidentifikasinya?
Saya tahu dengan O (n), Anda biasanya memiliki satu loop; O (n ^ 2) adalah loop ganda; O (n ^ 3) adalah triple loop, dll. Bagaimana dengan O (log n)?
algorithms
complexity
big-o
Atif
sumber
sumber
Jawaban:
Anda benar-benar melakukannya dengan cara yang salah di sini. Anda mencoba mengingat ekspresi O besar mana yang sesuai dengan struktur algoritmik yang diberikan, tetapi Anda harus benar-benar hanya menghitung jumlah operasi yang dibutuhkan algoritma dan membandingkannya dengan ukuran input. Algoritma yang mengulang seluruh inputnya memiliki kinerja O (n) karena menjalankan loop n kali, bukan karena memiliki loop tunggal. Inilah satu loop dengan kinerja O (log n):
Jadi, algoritma apa pun di mana jumlah operasi yang diperlukan adalah berdasarkan urutan logaritma ukuran input adalah O (log n). Hal penting yang diberitahukan oleh analisis big-O adalah bagaimana waktu eksekusi suatu algoritma berubah relatif terhadap ukuran input: jika Anda menggandakan ukuran input, apakah algoritma tersebut mengambil 1 langkah lebih banyak (O (log n)) , dua kali lebih banyak langkah (O (n)), empat kali lebih banyak langkah (O (n ^ 2)), dll.
Apakah itu membantu untuk mengetahui dari pengalaman bahwa algoritma yang berulang kali mempartisi input mereka biasanya memiliki 'log n' sebagai komponen kinerja mereka? Yakin. Tetapi jangan mencari partisi dan langsung ke kesimpulan bahwa kinerja algoritma adalah O (log n) - itu mungkin sesuatu seperti O (n log n), yang sangat berbeda.
sumber
Idenya adalah bahwa suatu algoritma adalah
O(log n)
jika alih-alih menelusuri struktur 1 demi 1, Anda membagi struktur menjadi dua berulang-ulang dan melakukan sejumlah operasi konstan untuk setiap pemisahan. Algoritme pencarian tempat ruang jawaban terus terpecah beradaO(log n)
. Contohnya adalah pencarian biner , di mana Anda terus membelah array yang dipesan menjadi dua berulang-ulang sampai Anda menemukan nomornya.Catatan: Anda tidak perlu menjadi membelah di bagian bahkan.
sumber
log n
refleks pencarian biner yang dipicu pada orang.Contoh khas adalah yang berhubungan dengan pencarian biner. Misalnya, algoritma pencarian biner biasanya
O(log n)
.Jika Anda memiliki pohon pencarian biner, cari , masukkan, dan hapus semuanya adalah
O(log n)
kompleksitas.Setiap situasi di mana Anda terus-menerus mempartisi ruang akan sering melibatkan
log n
komponen. Inilah sebabnya mengapa banyak algoritma pengurutan memilikiO(nlog n)
kompleksitas, karena mereka sering mempartisi satu set dan mengurutkannya.sumber
Jika Anda menginginkannya sesederhana "loop tunggal -> O (n), loop ganda -> O (n ^ 2)", daripada jawabannya mungkin "Tree -> O (log n)". Lebih akurat melintasi pohon dari akar ke satu (tidak semua!) Daun atau sebaliknya. Namun, ini semua penyederhanaan yang berlebihan.
sumber
Anda ingin tahu apakah ada cara mudah untuk mengidentifikasi apakah suatu algoritma adalah O (log N).
Nah: jalankan saja dan waktunya. Jalankan untuk input 1.000, 10.000, 100.000 dan sejuta.
Jika Anda melihat seperti waktu berjalan 3,4,5,6 detik (atau beberapa kelipatan) Anda dapat dengan aman mengatakan itu O (log N). Jika lebih seperti: 1,10,100,1000 detik maka mungkin O (N). Dan jika itu seperti 3.40.500.6000 detik maka itu O (N log N).
sumber