n * log n dan n / log n terhadap waktu berjalan polinomial

14

Saya mengerti bahwa lebih cepat dari dan lebih lambat dari . Yang sulit saya pahami adalah bagaimana sebenarnya membandingkan dan dengan mana .Θ ( n log n ) Θ ( n / log n ) Θ ( n log n ) Θ ( n / log n ) Θ ( n f ) 0 < f < 1Θ(n)Θ(nlogn)Θ(n/logn)Θ(nlogn)Θ(n/logn)Θ(nf)0<f<1

Sebagai contoh, bagaimana kita memutuskan vs. atauΘ ( n 2 / 3 ) Θ ( n 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

Saya ingin memiliki beberapa arah untuk melanjutkan dalam kasus-kasus seperti itu. Terima kasih.

mihsathe
sumber

Jawaban:

3

Jika Anda hanya menggambar beberapa grafik, Anda akan berada dalam kondisi yang baik. Wolfram Alpha adalah sumber yang bagus untuk penyelidikan semacam ini:

persamaan

Grafik

Dihasilkan oleh tautan ini . Perhatikan bahwa dalam grafik, log (x) adalah logaritma natural, yang merupakan alasan persamaan satu grafik terlihat sedikit lucu.


sumber
Selain setuju dengan Raphael, gambar ini akan memberikan ide yang jauh lebih baik , memilih rentang yang lebih besar membuat fungsi kedua menghilang yang mungkin membingungkan.
phant0m
9

logn adalah kebalikan dari . Sama seperti tumbuh lebih cepat daripada polinomial terlepas dari seberapa besar terbatas , akan tumbuh lebih lambat daripada fungsi polinomial apa pun terlepas dari seberapa kecil bukan nol, positif adalah.2n2nnkklognnkk

n/logn vs , karena identik dengan: vsnkk<1n/lognn/n1k

sebagai untuk besar , untuk dan besar .n1k>lognnn/logn>nkk<1n

Taedrin
sumber
3

Untuk banyak algoritma, kadang-kadang terjadi bahwa konstanta berbeda, menyebabkan satu atau yang lain lebih cepat atau lebih lambat untuk ukuran data yang lebih kecil, dan tidak diurutkan dengan baik oleh kompleksitas algoritmik.

Karena itu, jika kita hanya mempertimbangkan ukuran data super besar , yaitu. yang mana akhirnya menang, lalu O(n^f)lebih cepat daripada O(n/log n)untuk 0 < f < 1.

Sebagian besar kompleksitas algoritmik adalah untuk menentukan algoritma mana yang pada akhirnya lebih cepat, sehingga mengetahui bahwa O(n^f)itu lebih cepat daripada O(n/log n)untuk 0 < f < 1, seringkali sudah cukup.

Aturan umum adalah bahwa mengalikan (atau membagi) pada log nakhirnya akan diabaikan dibandingkan dengan mengalikan (atau membagi) oleh n^funtuk apa pun f > 0.

Untuk menunjukkan ini dengan lebih jelas, mari kita pertimbangkan apa yang terjadi ketika n bertambah.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Perhatikan mana yang berkurang lebih cepat? Itu adalah n^fkolom.

Bahkan jika fmendekati 1, n^fkolom hanya akan mulai lebih lambat, tetapi ketika n dua kali lipat, laju perubahan penyebut mempercepat, sedangkan penyebut n/log nkolom tampaknya berubah pada laju yang konstan.

Mari kita plot kasus tertentu pada grafik

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Sumber: Wolfram Alpha

Saya memilih O(n^k)sedemikian rupa sehingga kcukup dekat dengan 1 (at 0.9). Saya juga memilih konstanta sehingga awalnya O(n^k)lebih lambat. Namun, perhatikan bahwa pada akhirnya "menang" pada akhirnya, dan membutuhkan waktu lebih sedikit daripada O(n/log n).

ronalchn
sumber
bagaimana dengan n / log n
Itu agak salah ketik, itulah yang saya maksudkan di awal. Bagaimanapun, saya menambahkan grafik yang lebih tepat yang menunjukkan pada n^kakhirnya menjadi lebih cepat, bahkan jika konstanta dipilih sedemikian rupa sehingga awalnya lebih lambat.
3

Anggap saja sebagai . Jadi untuk contoh Anda, . Maka mudah untuk membandingkan pertumbuhannfnn1fn2/3=n/n1/3

nlognvs.nn1f.

Ingat bahwa tumbuh lebih lambat secara asimptotik daripada , untuk setiap .lognnεε>0

A.Schulz
sumber
1

Saat membandingkan waktu berjalan, selalu membantu untuk membandingkannya dengan menggunakan nilai n yang besar. Bagi saya, ini membantu membangun intuisi tentang fungsi mana yang lebih lambat

Dalam kasus Anda, pikirkan n = 10 ^ 10 dan a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Oleh karena itu, O (n ^ a) lebih cepat daripada O (n / logn), ketika 0 <a <1 Saya hanya menggunakan satu nilai, namun, Anda dapat menggunakan beberapa nilai untuk membangun intuisi tentang fungsi tersebut


sumber
1
Jangan menulis O(10^9), tetapi poin utama tentang mencoba beberapa angka untuk membangun intuisi adalah benar.
Gagal. Ini tidak benar. Anda mengganti konstanta n tunggal, yang mungkin bias. Jika saya memilih konstanta yang berbeda, saya dapat membuat algoritma apa pun terlihat lebih baik. Notasi O besar digunakan untuk menetapkan tren apa yang akan lebih cepat dalam jangka panjang. Untuk melakukan ini, Anda harus dapat menunjukkan bahwa lebih cepat untuk n besar, bahkan jika lebih lambat ketika n lebih kecil.
Terima kasih. Menambahkan beberapa nilai dan untuk mempertimbangkan angka yang lebih besar
Perlu dicatat bahwa hanya karena f (a)> g (a) untuk beberapa konstanta, tidak harus berarti bahwa O (f (x))> O (g (x)). Ini berguna untuk membangun intuisi, tetapi tidak cukup untuk membuat bukti yang kuat. Untuk menunjukkan bahwa hubungan ini berlaku, Anda harus menunjukkan bahwa ini benar untuk SEMUA besar n, bukan hanya satu besar n. Demikian juga, Anda harus menunjukkan bahwa itu benar untuk semua polinomial dengan derajat positif <1.
1

Biarkan menunjukkan "f tumbuh secara asimptot lebih lambat dari g", maka Anda dapat menggunakan aturan mudah berikut untuk polylogarithmic? fungsi:fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

Relasi urutan antara tupel adalah leksikografis. Yaitu dan(2,10)<(3,5)(2,10)>(2,5)

Diterapkan pada contoh Anda:

O(n/logn)(1,1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

Anda bisa mengatakan: kekuatan n mendominasi kekuatan log, yang mendominasi kekuatan log.

Sumber: Matematika Beton, hlm. 441

hantu0m
sumber