Fungsi penyortiran berdasarkan pertumbuhan asimptotik

35

Asumsikan saya memiliki daftar fungsi, misalnya

nloglog(n),2n,n!,n3,nlnn,

Bagaimana cara saya mengurutkannya asimptotik, yaitu setelah relasi didefinisikan oleh

fOgfO(g) ,

dengan asumsi mereka memang sebanding secara berpasangan (lihat juga di sini )? Menggunakan definisi tampaknya canggung, dan seringkali sulit untuk membuktikan keberadaan konstanta yang cocok dan .Ocn0

Ini tentang ukuran kompleksitas, jadi kami tertarik pada perilaku asimptotik sebagai , dan kami menganggap bahwa semua fungsi hanya mengambil nilai non-negatif ( ).n+n,f(n)0

JAN
sumber
4
Karena OP tidak pernah kembali, saya menghapus barang-barang yang dilokalkan dan membuat pertanyaan referensi dari ini.
Raphael

Jawaban:

48

Jika Anda ingin bukti yang kuat, lemma berikut ini sering kali berguna. lebih berguna daripada definisi.

c=limnf(n)g(n)

  • c=0 fo(g) ,
  • c(0,)fΘ(g) dan
  • c=   fω(g) .

Dengan ini, Anda harus dapat memesan sebagian besar fungsi yang muncul dalam analisis algoritma¹. Sebagai latihan, buktikan!

Tentu saja Anda harus dapat menghitung batas yang sesuai. Beberapa trik yang berguna untuk memecah fungsi-fungsi rumit menjadi yang mendasar adalah:

  • Ekspresikan kedua fungsi sebagai dan bandingkan eksponen; jika rasio mereka cenderung ke atau , demikian juga hasil bagi aslinya. 0 e0
  • Lebih umum: jika Anda memiliki cembung, terus terdiferensialkan dan ketat meningkatkan fungsi sehingga Anda dapat menulis ulang quotient Anda sebagaih

    f(n)g(n)=h(f(n))h(g(n)) ,

    dengan dangΩ(1)

    limnf(n)g(n)= ,

    kemudian

    limnf(n)g(n)= .

    Lihat di sini untuk bukti ketat aturan ini (dalam bahasa Jerman).

  • Pertimbangkan kelanjutan fungsi Anda di atas real. Anda sekarang dapat menggunakan aturan L'Hôpital ; perhatikan kondisinya²!

  • Lihatlah ekuivalen diskritnya , Stolz-Cesàro .
  • Saat faktorial muncul, gunakan rumus Stirling :

    n!2πn(ne)n

Juga berguna untuk menyimpan kumpulan hubungan dasar yang Anda buktikan sekali dan sering gunakan, seperti:

  • logaritma tumbuh lebih lambat dari polinomial, yaitu

    α , β > 0(logn)αo(nβ) untuk semua .α,β>0

  • urutan polinomial:

    α<βnαo(nβ) untuk semua .α<β

  • polinomial tumbuh lebih lambat daripada eksponensial:

    αc>1nαo(cn) untuk semua dan .αc>1


Dapat terjadi bahwa lemma di atas tidak berlaku karena batas tidak ada (misalnya ketika fungsi berosilasi). Dalam hal ini, pertimbangkan karakterisasi berikut kelas Landau menggunakan limau superior / inferior :

Dengan kami memilikics:=lim supnf(n)g(n)

  • 0cs<fO(g) dan
  • cs=0fo(g) .

Dengan kami memilikici:=lim infnf(n)g(n)

  • 0<cifΩ(g) dan
  • ci=fω(g) .

Selanjutnya,

  • 0<ci,cs<fΘ(g)gΘ(f) dan
  • ci=cs=1fg .

Periksa di sini dan di sini jika Anda bingung dengan notasi saya.


¹ Nota bene: Kolega saya menulis fungsi Mathematica yang melakukan ini dengan sukses untuk banyak fungsi, sehingga lemma benar-benar mengurangi tugas menjadi perhitungan mekanis.

² Lihat juga di sini .

Raphael
sumber
@ Juho Tidak secara terbuka, afaik, tapi penting untuk menulis sendiri; menghitung Limit[f[n]/g[n], n -> Infinity]dan melakukan pembedaan kasus.
Raphael
20

Kiat lain: terkadang menerapkan fungsi monoton (seperti log atau exp) ke fungsi yang membuat semuanya lebih jelas.

Suresh
sumber
5
Ini harus dilakukan dengan hati-hati: , tetapi . 2 2 nO ( 2 n )2nO(n)22nO(2n)
Shaull
2
Diperbantukan. Hal "terapkan fungsi monoton" tampaknya semacam cerita rakyat yang tidak berfungsi secara umum. Kami telah mengerjakan kriteria yang cukup dan telah menemukan apa yang saya posting di revisi terbaru dari jawaban saya .
Raphael
17

Skiena menyediakan daftar hubungan dominasi yang tersortir di antara fungsi-fungsi paling umum dalam bukunya, The Algorithm Design Manual:

n!cnn3n2n1+ϵnlgnnn1/2
lg2nlgnlgnlglgnlglgnα(n)1

Di sini menunjukkan fungsi Ackermann terbalik .α(n)

Robert S. Barnes
sumber
Itu daftar khusus yang aneh. Banyak hubungan (apapun cara persis) dapat diringkas ke beberapa lemmata yang lebih umum.
Raphael
Ini notasinya untuk hubungan dominasi.
Robert S. Barnes
11

Kiat: gambar grafik fungsi-fungsi ini menggunakan sesuatu seperti Wolfram Alpha untuk merasakan bagaimana mereka tumbuh. Perhatikan bahwa ini tidak terlalu tepat, tetapi jika Anda mencobanya untuk jumlah yang cukup besar, Anda harus melihat pola pertumbuhan komparatif. Ini tentu saja bukan pengganti bukti.

Misalnya, coba: plot log (log (n)) dari 1 hingga 10.000 untuk melihat grafik individual atau plot log (log (n)) dan plot log (n) dari 1 hingga 10.000 untuk melihat perbandingan.

Dave Clarke
sumber
9
Haruskah kami benar-benar merekomendasikan vodoo ?
Raphael
+1 memberi saran untuk menggambar grafik fungsi, meskipun grafik yang ditautkan agak membingungkan kecuali Anda tahu apa artinya.
Tsuyoshi Ito
1
Ambil grafik sebagai petunjuk apa yang mungkin ingin Anda buktikan. Petunjuk itu mungkin salah tentu saja.
gnasher729
8

Saya menyarankan untuk melanjutkan sesuai dengan definisi berbagai notasi. Mulailah dengan beberapa ekspresi sewenang-wenang, dan tentukan urutannya, seperti diuraikan di bawah ini. Kemudian, untuk setiap elemen tambahan, temukan posisinya di daftar yang disortir menggunakan pencarian biner dan bandingkan seperti di bawah ini. Jadi, misalnya, mari kita urutkan dan , dua fungsi pertama n, untuk memulai daftar.nloglogn2n

Kami menggunakan properti yang untuk menulis ulang ekspresi pertama sebagai . Kita kemudian dapat melanjutkan untuk menggunakan definisi untuk menunjukkan bahwa , karena untuk konstanta apa pun , ada sedemikian rupa sehingga untuk , .n=2lognnloglogn=(2logn)loglogn=2lognloglognnloglogn=2lognloglogno(2n)c>0n0nn0c(nloglogn)=c(2lognloglogn)<2n

Selanjutnya, kami mencoba . Kami membandingkannya dengan , elemen terbesar yang telah kami tempatkan sejauh ini. Karena , kami juga menunjukkan bahwa .3n2n3n=(2log3)n=2nlog32no(3n)=o(2nlog3)

Dll

Patrick87
sumber
2

Berikut daftar dari Wikipedia , Semakin rendah tabel semakin tinggi kelas kompleksitasnya;

NameRunning TimeConstant timeO(1)Inverse Ackermann timeO(a(n))Iterated logarithmic timeO(logn)Log-logarithmicO(nlogn)Logarithmic timeO(logn)Polylogarithmic timepoly(logn)Fractional powerO(nc),where 0<c<1Linear timeO(n)"n log star n" timeO(nlogn)Quasilinear timeO(nlogn)Quadratic timeO(n2)Cubic timeO(n3)Polynomial timepoly(n)=2O(logn)Quasi-polynomial time2O(poly(logn))Sub-exponential time (first definition)O(2nϵ),ϵ>0Sub-exponential time (second definition)2o(n)Exponential time(with linear exponent)2O(n)Exponential time2poly(n)Factorial timeO(n!)

catatan:poly(x)=xO(1)

kelalaka
sumber
1
Juga, menarik bagaimana tabel menunjukkan bahwa . Meskipun tabel yang Anda tautkan agak akurat, tabel yang tertaut di sana (dan yang Anda salin) adalah tentang kelas kompleksitas, yang bukan merupakan hal yang berguna untuk digabungkan di sini. Notasi Landau bukan tentang "waktu". 2nlogno(n!)
Raphael
1
Saya menempatkan ini sehingga nama kelas kompleksitas dapat dibicarakan langsung di sini. Ya, Landau lebih tentang jenis algoritma tertentu dalam Kriptografi.
kelalaka
1
Saya keberatan dengan beberapa pandangan @ Raphael. Saya telah menjadi ahli matematika dan instruktur selama bertahun-tahun. Saya percaya, selain membuktikan hal-hal itu, meja besar seperti ini meningkatkan intuisi orang dengan mudah dan hebat. Dan nama-nama kelas asimptotik membantu orang mengingat dan berkomunikasi banyak.
Apass. Jack
1
@ Apass.Jack Dalam pengalaman mengajar saya, ketika diberikan sebuah meja banyak siswa akan mempelajarinya dengan hati dan gagal untuk memesan fungsi apa pun yang tidak ada dalam tabel. Perhatikan bagaimana efek itu tampaknya menjelaskan banyak pertanyaan mengenai pertumbuhan asimptotik yang mendarat di situs ini. Yang mengatakan, tentu saja kita akan menggunakan lemmata yang tersirat oleh tabel jika itu membuat bukti lebih mudah, tetapi itu datang setelah belajar bagaimana membuktikan tabel. (Untuk menekankan titik itu, orang yang datang ke sini tidak perlu bantuan barang-barang membaca dari meja Mereka membutuhkan bantuan. Membuktikan hubungan.)
Raphael
1
@kelalaka "Ya, Landau lebih tentang jenis algoritma tertentu dalam Kriptografi." - itu bahkan tidak masuk akal. Notasi Landau adalah singkatan untuk menggambarkan sifat fungsi matematika. Ini tidak ada hubungannya dengan algoritma apalagi kriptografi, per se.
Raphael