Intuisi algoritma untuk kompleksitas logaritmik


60

Saya percaya saya memiliki pemahaman yang masuk akal tentang kompleksitas seperti , dan .O(1)Θ(n)Θ(n2)

Dalam hal daftar, adalah pencarian konstan, jadi hanya mendapatkan kepala daftar. adalah tempat saya menelusuri seluruh daftar, dan berjalan daftar sekali untuk setiap elemen dalam daftar.O(1)Θ(n)Θ(n2)

Apakah ada cara intuitif yang serupa untuk memahami selain dari hanya mengetahuinya terletak di antara dan ?Θ(logn)O(1)Θ(n)


8
log n untuk "search": think binary search
Suresh

2
Menggunakan untuk mengajukan pertanyaan ini salah, karena hanya menunjukkan batas atas. Misalnya waktu konstan adalah . akan lebih tepat. Lihat pertanyaan meta: meta.cs.stackexchange.com/questions/182/…O ( log n ) θOO(logn)θ
Aryabhata

1
Informasi lebih lanjut tentang SO: apa arti sebenarnya? O(logn).
Ran G.

Sedikit catatan: Dalam pengaturan Mesin Turing klasik, semua algoritma adalah , karena mereka perlu membaca setiap simbol input setidaknya sekali. Pencarian biner dapat dilakukan dalam karena kami memiliki janji bahwa daftar diurutkan, misalnya. Ω(n)O(logn)
chazisop

1
Kontribusi terlambat: menurut definisi, basis logaritma angka hanyalah berapa kali Anda mengalikan dengan sendirinya untuk mendapatkan . . Misalnya, . Jadi jika Anda memiliki nomor dan Anda ingin mengetahui apa yangterus membaginya dengan sampai Anda mencapai (dengan asumsi adalah kekuatan untuk kesederhanaan). Jumlah divisi sama dengan . Algoritma yang menunjukkan perilaku divisi ini memiliki waktu berjalan dibnbnbl=nl=logb(n)n l o g b ( n ) = ? b 1 n b l o g b ( n ) O ( l o g ( n ) )23=8log2(8)=3nlogb(n)=?b1nblogb(n)O(log(n)).
saadtaame

Jawaban:


54

Kompleksitas biasanya terhubung dengan subdivisi. Saat menggunakan daftar sebagai contoh, bayangkan daftar yang elemennya diurutkan. Anda dapat mencari di daftar ini dalam waktu - Anda sebenarnya tidak perlu melihat setiap elemen karena sifat daftar yang diurutkan.O ( log n )Θ(logn)O(logn)

Jika Anda melihat elemen di tengah daftar dan membandingkannya dengan elemen yang Anda cari, Anda dapat langsung mengatakan apakah itu terletak di bagian kiri atau kanan array. Kemudian Anda bisa mengambil setengah ini dan ulangi prosedur sampai Anda menemukannya atau mencapai daftar dengan 1 item yang Anda bandingkan dengan mudah.

Anda dapat melihat bahwa daftar secara efektif membagi dua langkah. Itu berarti jika Anda mendapatkan daftar panjang , langkah maksimum yang Anda butuhkan untuk mencapai daftar satu item adalah . Jika Anda memiliki daftar item, Anda hanya perlu langkah, untuk daftar Anda hanya perlu langkah dll.5 128 = 2 7 7 1024 = 2 10 10325128=2771024=21010

Seperti yang Anda lihat, eksponen dalam selalu menunjukkan jumlah langkah yang diperlukan. Logaritma digunakan untuk "mengekstrak" persis angka eksponen ini, misalnya . Ini juga menggeneralisasi untuk membuat daftar panjang yang bukan kekuatan dua panjang.2 n log 2 2 10 = 10n2nlog2210=10


4
Perlu dicatat bahwa ini hanya O(log n)jika daftar memiliki akses acak waktu konstan. Pada implementasi daftar yang lebih umum (daftar tertaut) ini adalahO(n log n)
asm

1
Pencarian biner tidak berfungsi pada daftar karena kekurangan pointer; biasanya dilakukan pada array.
Raphael

Pencarian biner bekerja dengan baik pada daftar. Itu hanya tidak ada gunanya karena jauh lebih rumit daripada yang dibutuhkan / berguna / praktis.
Anton

@AndrewMyers Mencari daftar tertaut lebih akuratO(n)
phant0m

1
@ phant0m Ya, butuh saya sedikit untuk mengetahui bahwa itu dengan asumsi Anda bergerak dari posisi saat ini daripada melintasi dari awal setiap waktu.
asm

38

Dalam hal pohon (seimbang) (katakanlah, pohon biner, jadi semua adalah basis 2):log

  • Θ(1) mendapatkan akar pohon
  • Θ(logn) adalah jalan dari akar ke daun
  • Θ(n) melintasi semua simpul pohon
  • Θ(n2) adalah tindakan pada semua himpunan bagian dua node di pohon, misalnya, jumlah jalur yang berbeda antara dua node.
  • k kΘ(nk) - generalisasi di atas untuk setiap subset dari node (untuk konstanta )kk
  • k = 1 , 2 , , nΘ(2n) adalah tindakan pada semua subset node yang mungkin (subset dari semua ukuran yang mungkin, yaitu, .). Misalnya, jumlah sub-pohon yang berbeda dari pohon tersebut.k=1,2,,n

5
Untuk menambah ini, intuisi untuk berasal dari dua hal: 1.) Pengulangan dan 2.) Pencarian biner pada sesuatu dari ukuran yaitu pencarian biner pada ketinggian pohon. T ( n ) = T ( Θ(loglogn)log(n)T(n)=T((n))+1log(n)
mcorley

17

Agar dimungkinkan, Anda harus dapat mengurangi ukuran masalah secara proporsional dengan jumlah sewenang-wenang sehubungan dengan dengan operasi waktu yang konstan.nO(logn)n

Misalnya, dalam kasus pencarian biner, Anda dapat mengurangi ukuran masalahnya hingga setengah dengan setiap operasi perbandingan.

Sekarang, apakah Anda harus mengurangi ukuran masalah menjadi setengahnya, sebenarnya tidak. Algoritma adalah bahkan jika itu dapat mengurangi ruang pencarian masalah sebesar 0,0001%, selama persentase dan operasi yang digunakan untuk mengurangi ukuran masalah tetap konstan, itu adalah algoritma, itu tidak akan menjadi algoritma yang cepat, tetapi masih O ( log n ) dengan konstanta yang sangat besar. (Dengan asumsi kita berbicara tentang log n dengan log basis 2)O ( log n )O(logn)O(logn)O(logn)logn


1
Apa jadinya jika 'jumlah tebang habis' tidak konstan?
Svish

@Vish Jika Anda dapat memotong masalah pada tingkat positif, itu masih akan menjadi algoritma , meskipun mungkin tidak akan lagi menjadi ikatan yang ketat. Tingkat negatif sulit dikatakan. Asumsi dibuat untuk membuat jawaban agak sederhana dalam kasus ini, karena pertanyaan ini memiliki kelebihannya sendiri, Anda dipersilakan untuk mengajukan pertanyaan ini sebagai pertanyaan sendiri. O(logn)
Ken Li

Ya, saya bermaksud bahwa ruang pencarian masalah selalu menurun, tetapi tidak harus dengan kecepatan konstan. Baru saja memikirkan "selama persentase dan operasi yang digunakannya untuk mengurangi ukuran masalah tetap konstan, itu adalah algoritma O (log n)"; jika memiliki nama yang berbeda jika persentasenya tidak konstan.
Svish

8

Pikirkan tentang algoritma untuk mengkonversi angka desimal ke binern

while n != 0:
   print n%2, 
   n = n/2

whileLoop ini menjalankan kali.log(n)


1
Tentu saja program ini loop kali, tetapi umumnya ketika kita berbicara tentang kompleksitas , adalah ukuran input Anda. Di sini ukuran input Anda sudah , jadi saya akan mengatakan program ini hanya linear (dalam )O ( f ( s ) ) s s = log n O ( s )lognO(f(s))ss=lognO(s)
jmad

@jmad Benar. Tapi contoh ini memberi Anda intuisi ke log (n).
Pratik Deoghare

@ Ahmad saya bisa menggunakan algoritma untuk menghasilkan angka acak juga, tetapi saya ingin sesederhana mungkin.
Pratik Deoghare

8

Ya, adalah antara dan , tetapi lebih dekat ke dari . Apa itu ? Fungsi log adalah fungsi terbalik dari eksponen. Mari saya mulai dengan eksponen dan Anda harus mendapatkan ide yang lebih baik tentang apa itu logaritma.1 n 1 n log ( n )log(n)1n1nlog(n)

Pertimbangkan dua angka, dan . adalah dikalikan dengan dirinya sendiri kali. Anda dapat dengan usaha menghitung angka, tetapi dapatkah Anda menghitung ? Saya yakin Anda tidak bisa. Mengapa? adalah jumlah yang begitu besar sehingga lebih besar dari jumlah semua atom di alam semesta. Renungkan itu sejenak. Ini adalah jumlah yang sangat besar, yang memungkinkan Anda untuk memberikan setiap atom nama (nomor). Dan jumlah atom di kuku jari Anda mungkin sekitar miliaran. seharusnya cukup untuk siapa pun (pun intended :)).2 100 2 100 2 100 100 2 100 2 100 2 100100210021002100100210021002100

Sekarang, di antara dua angka, dan , adalah logaritma (dalam basis ). relatif kecil dari . Siapa pun harus memiliki item berbeda di rumah mereka. Tapi, cukup baik untuk alam semesta. Pikirkan home vs universe saat memikirkan dan .2 100 100 2 100 2 100 2 100 100 2 100 log ( n ) n10021001002100210021001002100log(n)n

Dari mana eksponen dan logaritma berasal? Mengapa mereka begitu tertarik pada ilmu komputer? Anda mungkin tidak memperhatikan, tetapi eksponasi ada di mana-mana. Apakah Anda membayar bunga dengan kartu kredit? Anda baru saja membayar sebuah semesta untuk rumah Anda (Tidak terlalu buruk, tetapi kurvanya pas). Saya suka berpikir bahwa eksponen berasal dari aturan produk, tetapi yang lain dipersilakan untuk memberikan lebih banyak contoh. Apa aturan produk, Anda mungkin bertanya; Dan saya akan menjawab.

Katakanlah Anda memiliki dua kota dan , dan ada dua cara untuk pergi di antara mereka. Berapa jumlah jalur di antara mereka? Dua. Itu sepele. Sekarang katakanlah, ada kota lain , dan Anda dapat pergi dari ke dengan tiga cara. Berapa banyak jalur yang ada antara dan sekarang? Enam, kan? Bagaimana cara kamu mendapatkan itu? Apakah Anda menghitungnya? Atau apakah Anda melipatgandakannya? Bagaimanapun, mudah untuk melihat bahwa kedua cara memberikan hasil yang serupa. Sekarang jika Anda menambahkan kota yang dapat dicapai dari dalam empat cara, berapa banyak cara yang ada antara danB C B C A C D C A D 2 3 4 24 2 10 1024 2 10 10 10 2 10 10 1024ABCBCACDCAD? Hitung jika Anda tidak mempercayai saya, tetapi itu sama dengan yaitu . Sekarang, jika ada sepuluh kota dan ada dua jalur dari satu kota ke kota lain, dan mereka diatur seperti mereka berada di garis lurus. Berapa banyak jalur yang ada dari awal hingga akhir? Lipat gandakan jika Anda tidak mempercayai saya, tetapi saya akan memberi tahu Anda ada , yaitu . Lihat bahwa adalah hasil eksponensial dari , dan adalah logaritma dari . adalah jumlah kecil dibandingkan dengan .2342421010242101010210101024

Fungsi logaritma adalah untuk apa adalah (perhatikan bahwa adalah basis logaritma). Jika Anda mengalikan dengan dirinya sendiri kali (perhatikan bahwa adalah basis logaritma) Anda mendapatkan . sangat kecil, sangat kecil dibandingkan dengan , bahwa itu adalah ukuran rumah Anda di mana adalah ukuran alam semesta.n n 2 n 2 log b ( n ) b b n log ( n ) n nlog2(n)nn2n2logb(n)bbnlog(n)nn

log(n)n


3
log(n)

3
Saya mencoba memberikan intuisi tentang betapa kecilnya itu.
Ravi

5

O(logn)x

Itu masih didasarkan pada ukuran daftar, tetapi Anda hanya perlu mengunjungi sebagian kecil elemen.


4

Θ(lgkn)Θ(lgk+1n)

Θ(1)lgn

The pencarian biner algoritma adalah contoh klasik.


1

Intuisi adalah berapa kali Anda dapat membagi dua angka, katakan n, sebelum dikurangi menjadi 1 adalah O (lg n).

Untuk memvisualisasikan, cobalah menggambarnya sebagai pohon biner dan hitung jumlah level dengan menyelesaikan perkembangan geometrik ini.

2^0+2^1+...+2^h = n

lognn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.