Memecahkan atau memperkirakan hubungan perulangan untuk urutan angka


89

Dalam ilmu komputer, kita sering harus memecahkan hubungan pengulangan , yaitu menemukan bentuk tertutup untuk urutan angka yang didefinisikan secara rekursif. Ketika mempertimbangkan runtimes, kita sering tertarik terutama pada pertumbuhan asimptotik urutan .

Contohnya adalah

  1. Runtime dari fungsi rekursif-ekor melangkah ke bawah ke dari yang tubuhnya membutuhkan waktu :0nf(n)

    T(0)=0T(n+1)=T(n)+f(n)

  2. The Fibonacci urutan :

    F0=0F1=1Fn+2=Fn+Fn+1

  3. Jumlah kata Dyck dengan pasangan kurung:n

    C0=1Cn+1=i=0nCiCni

  4. Perulangan runtime mergesort pada daftar panjang :n

    T(1)=T(0)=0T(n)=T(n/2)+T(n/2)+n1

Apa metode untuk menyelesaikan hubungan perulangan? Kami sedang mencari

  • metode umum dan
  • metode untuk subkelas yang signifikan

sebaik

  • metode yang menghasilkan solusi yang tepat dan
  • metode yang memberikan (terikat pada) pertumbuhan asimptotik.

Ini seharusnya menjadi pertanyaan referensi. Harap kirim satu jawaban per metode dan berikan deskripsi umum serta contoh ilustratif.


9
Catatan ini mungkin bermanfaat. (Tetapi tidak, saya tidak akan menuliskannya menjadi jawaban.)
JeffE

Jawaban:


35

Mengubah Sejarah Lengkap menjadi Sejarah Terbatas

Ini adalah langkah pertama dalam menyelesaikan kekambuhan di mana nilai pada bilangan bulat apa pun bergantung pada nilai di semua bilangan bulat yang lebih kecil. Pertimbangkan, misalnya, pengulangan yang muncul dalam analisis quicksort acak . (Di sini, adalah pangkat poros yang dipilih secara acak.) Untuk setiap bilangan bulat , nilai tergantung pada semua dengan . Perulangan bentuk ini disebut perulangan riwayat penuh .knT(n)T(k)k<n

T(n)=n+1nk=1n(T(k1)+T(nk))
knT(n)T(k)k<n

Untuk mengatasi perulangan ini, kita dapat mengubahnya menjadi perulangan sejarah yang terbatas , di mana hanya bergantung pada jumlah konstan dari nilai sebelumnya. Tapi pertama-tama, ini membantu menyederhanakan perulangan sedikit, untuk mengumpulkan istilah umum dan menghilangkan pecahan sial. Sekarang untuk mengonversi ke perulangan riwayat terbatas , kami menuliskan pengulangan untuk , kurangi, dan regather istilah: n T ( n )T(n) T(n-1) ( n - 1 ) T ( n - 1 )

nT(n)=n2+2k=1n1T(k)
T(n1)
(n1)T(n1)=(n1)2+2k=1n2T(k)nT(n)(n1)T(n1)=(2n1)+2T(n1)nT(n)=(2n1)+(n+1)T(n1)T(n)n+1=2n1n(n+1)+T(n1)n

Sekarang jika kita mendefinisikan dan mengganti pecahan dengan bentuk asimptotik yang lebih sederhana , kami memperoleh pengulangan yang lebih sederhana Memperluas pengulangan ini menjadi penjumlahan segera memberi kita , di mana adalah bilangan harmonik ke- . Kami menyimpulkan bahwa .2 n - 1t(n)=T(n)/(n+1) Θ(1/n)t(n)=Θ(1/n)+t(n-1). t(n)=Θ(Hn)=Θ(logn)Hnn2n1n(n+1)Θ(1/n)

t(n)=Θ(1/n)+t(n1).
t(n)=Θ(Hn)=Θ(logn)HnnT(n)=Θ(nlogn)

1
Jika Anda menginginkan solusi tepat untuk , itu juga tidak sulit (di sini), jika agak membosankan; kita mendapatkan . Sebenarnya, membingungkan saya jadi saya lebih suka varian yang tepat. Jumlah sial dari istilah Landau . T ( n ) = 2 ( n + 1 ) H n + ( T ( 0 ) - 3 ) n + T ( 0 ) Σ n i = 1 Θ ( 1 / i ) = Θ ( H n )TT(n)=2(n+1)Hn+(T(0)3)n+T(0)i=1nΘ(1/i)=Θ(Hn)
Raphael

Sebenarnya, cukup untuk mengamati (secara induktif) bahwa , di mana . Sebenarnya, saya sudah menggunakan trik itu sejak awal, ketika saya mengganti waktu untuk mempartisi sebuah array dengan lebih sederhana . Ini merupakan penyalahgunaan standar notasi. t ( n ) = 1 / n + t ( n - 1 ) Θ ( n ) nT(n)/(n+1)=Θ(t(n))t(n)=1/n+t(n1)Θ(n)n
JeffE

28

Menghasilkan Fungsi

Setiap seri angka sesuai dengan fungsi pembangkit . Seringkali dapat dengan nyaman diperoleh dari perulangan untuk memiliki koefisien - elemen seri - dipetik.

Jawaban ini mencakup ansatz umum dengan contoh lengkap, pintasan untuk kasus khusus dan beberapa catatan tentang menggunakan metode ini untuk mendapatkan asimptotik (bahkan jika hasil pastinya tidak dapat diperoleh).

Metode

Biarkan serangkaian angka. Kemudian, seri kekuatan formal(an)nN

A(z)=n=0anzn

adalah biasa fungsi pembangkit ¹ dari . Koefisien dalam ekspansi seri sama dengan urutan, yaitu . Sebagai contoh, fungsi pembangkit biasa dari nomor Catalan terkenal adalah A ( z ) [ z n ] A ( z ) = a n C n(an)nNA(z)[zn]A(z)=an Cn

C(z)=114z2z .

Definisi juga merupakan jawaban kami untuk menyelesaikan masalah yang berulang. Ini bekerja paling baik untuk pengulangan linier, jadi anggap demi kesederhanaan pengulangan bentukA

a0=c0ak1=ck1an=f(n)+i=1kbiani,nk

untuk beberapa fix dan suatu fungsi yang tidak tergantung pada semua . Sekarang kita cukup memasukkan kedua jangkar dan bagian rekursif ke dalam ansatz, yaitu f ( n ) : NN a ib1,,bkRf(n):NNai

A(z)=n=0anzn=c0z0+c1z1++ck1zk1+n=k[f(n)+(i=1kbiani)]zn

Dengan menggunakan mekanisme manipulasi jumlah, sifat seri kekuatan formal dan identitas yang diketahui ², sisi kanan terakhir harus dibawa ke dalam bentuk tertutup, biasanya dalam hal . Persamaan yang dihasilkan dapat (sering) diselesaikan untuk . Seri ekspansi hasil (yang dapat dengan mudah diperoleh, diketahui atau didekati) pada dasarnya adalah solusinya.A ( z )A(z)A(z)

Pengantar yang baik dapat ditemukan dalam buku Wilf [3] dan di GKP [4]. Materi canggih telah dikumpulkan oleh Flajolet dan Sedgewick [5].

Contoh

Mempertimbangkan

a0=1a1=2an=5n+3an12an2,n>1

Kami menghitung:

A(z)=n=0anzn=1+2z+n=2[3an12an2+5n]zn=1+2z+3n=2an1zn2n=2an2zn+5n=2nzn=1+2z+3zn=1anzn2z2n=0anzn+5n=2nzn=1+2z+3z(A(z)a0)2z2A(z)+5(z(1z)2z)=16z+(3z2z2)A(z)+5z(1z)2

Ini dipecahkan menjadi

A(z)=13z+13z26z3(12z)(1z)3=1612z51z5(1z)25(1z)3=16n=02nzn5n=0zn5n=0(n+1)zn5n=0(n+1)(n+2)2zn

Sekarang kita akhirnya bisa membacanya

an=162n55(n+1)52(n+1)(n+2)=2n+452n2252n15

Setelah Anda terbiasa , Anda perhatikan bahwa ini semua sangat mekanis. Bahkan, aljabar komputer dapat melakukan semua hal ini untuk Anda dalam banyak kasus. Yang baik adalah bahwa ia tetap (kurang lebih) mekanik bahkan jika perulangan lebih kompleks. Lihat di sini untuk contoh yang lebih terlibat, kurang mekanik.

Perhatikan juga bahwa teknik umum juga berfungsi jika objek yang dicari adalah bilangan kompleks, atau bahkan polinomial.

Jalan pintas

Untuk perulangan linier dan homogen, yaitu bentuk seperti itu

a0=c0ak1=ck1an=i=1kbiani,nk

hal di atas berjalan dengan cara yang persis sama, setiap saat. Dengan melakukan perhitungan di atas secara simbolis, kami menemukan lemma berikut . Membiarkan

zkb1zk1b2zk2bk

menjadi polinom karakteristik (dari pengulangan). Lebih jauh lagi -masing (berbeda berpasangan) nol dari polinomial dengan multiplisitas , masing-masing. Kemudian, koefisien yang diinginkan diberikan olehr iλ1,,λlri

an=i=1lj=1ribi,jnj1λin

dengan tidak dikenal . Karena polinom karakteristik memiliki derajat , ada persis (kompleks) nol, yaitu jumlah ke . Oleh karena itu, koefisien yang hilang dapat ditentukan dengan menyelesaikan sistem persamaan linear dengan persamaan diperoleh dengan menyamakan rumus di atas dengan setiap dari (misalnya jangkar). k k r i k k k a nbi,jkkrikkkan

Asimptotik

Mendapatkan ke formulir tertutup untuk biasanya merupakan bagian yang mudah. Mengekspresikannya dalam menghasilkan fungsi, kita tahu koefisien (seperti yang kita lakukan dalam contoh) dengan cepat menjadi sulit. Contohnya adalah dari atas dan satu untuk jumlah kata Dyck yang disebutkan dalam pertanyaan.C ( z )A(z)C(z)

Seseorang dapat menggunakan mesin analisis yang kompleks, khususnya analisis singularitas, untuk mendapatkan asimtotik untuk koefisien; kata kunci termasuk metode Darboux dan metode sadel. Ini didasarkan pada teorema residu dan formula integral Cauchy . Lihat [6] untuk detailnya.


  1. Anda dapat melakukan hal serupa dengan eksponensial , Dirichlet , dan beberapa fungsi pembangkit lainnya . Yang berfungsi paling baik tergantung pada urutan yang ada dan khususnya apakah Anda menemukan formulir tertutup yang diperlukan.
  2. Misalnya dari TCS Cheat Sheet atau [3].
  3. menghasilkanfungsiologi oleh H. Wilf (1994, 2nd ed.) - tersedia untuk diunduh gratis
  4. Matematika Beton oleh RL Graham, DE Knuth dan O. Patashnik (1994, 2nd ed.)
  5. Pengantar Analisis Algoritma oleh R. Sedgewick dan P. Flajolet (edisi ke-2, 2013) - tersedia untuk diunduh gratis
  6. Analytic Combinatorics oleh P. Flajolet dan R. Sedgewick (2009) - tersedia untuk diunduh gratis

21

Tuan Teorema

The Guru Teorema memberikan asymptotics untuk solusi dari apa yang disebut membagi & menaklukkan kambuh, yaitu seperti yang membagi parameter mereka ke dalam potongan proporsional (bukan memotong konstanta). Mereka biasanya terjadi ketika menganalisis (rekursif) membagi & menaklukkan algoritma, maka namanya. Teorema ini populer karena seringkali sangat mudah diterapkan. Di sisi lain, itu hanya dapat diterapkan pada pengulangan dari bentuk berikut:

T(n)=aT(nb)+f(n)

dengan . Ada tiga kasusa1,b>1

  1. fO(nlogb(a)ε)

    untuk beberapa ;ε>0

  2. fΘ(nlogbalogkn) ,

    untuk beberapa ;k0

  3. fΩ(nlogb(a)+ε)

    untuk beberapa danε>0

    af(nb)cf(n)

    untuk beberapa dan .n c<1n

yang menyiratkan asimtotik

  1. TΘ(nlogba) ,
  2. TΘ(nlogbalogk+1n) dan
  3. TΘ(f) ,

masing-masing. Perhatikan bahwa kasing dasar tidak dinyatakan atau digunakan di sini; itu masuk akal, mengingat kami hanya menyelidiki perilaku asimptotik . Kami diam-diam menganggap bahwa mereka adalah beberapa konstanta (apa lagi yang bisa mereka. Konstanta mana yang tidak kita lihat tidak relevan, mereka semua lenyap dalam .Θ

Contohnya

  1. Pertimbangkan pengulangannya

    T(n)=4T(n3)+n .

    Dengan dan - perhatikan bahwa kita melihat bahwa case satu berlaku dengan . Karenanya, .b = 3 log b a 1.26 ε = 0.25 T Θ ( n log 3 4 ) = Θ ( n 1.261 ... )f(n)=n,a=4b=3logba1.26ε=0.25TΘ(nlog34)=Θ(n1.261)

  2. Pertimbangkan pengulangannya

    T(n)=2T(n/2)+n .

    Dengan dan - perhatikan bahwa kita melihat bahwa kasus dua berlaku dengan . Oleh karena itu, .b = 2 log b a = 1 k = 0 T Θ ( n log n )f(n)=n,a=2b=2logba=1k=0TΘ(nlogn)

  3. Pertimbangkan pengulangannya

    T(n)=3T(n4)+n .

    Dengan dan - perhatikan bahwa kita melihat bahwa case tiga berlaku dengan dan . Oleh karena itu, .b = 4 log b a 0,79 ε = 0,2 c = 1 T Θ ( n )f(n)=n,a=3b=4logba0.79ε=0.2c=1TΘ(n)

  4. Pertimbangkan pengulangannya

    T(n)=16T(n4)+n!

    Di sini kita memiliki , dan- banyak contoh standar akan memiliki polinomial , tetapi ini bukan aturan. Kami memiliki , dan huruf tiga berlaku lagi. Dalam contoh ini, kita dapat memilih dan sebagai untuk semua . Oleh karena itu .b = 4 f ( n ) = n ! f log b a = 2 ε c > 0 n ! ohm ( n k ) k T q ( n ! )a=16b=4f(n)=n!flogba=2εc>0n!Ω(nk)kTΘ(n!)

Bacaan lebih lanjut

  • Sangat mungkin bahwa tidak ada kasus teorema Master yang berlaku. Sebagai contoh, subproblem mungkin tidak memiliki ukuran yang sama atau memiliki bentuk yang lebih kompleks. Ada beberapa ekstensi pada teorema Master, misalnya Akra-Bazzi [1] atau Roura [2]. Bahkan ada versi yang bekerja untuk rekurensi diskrit (yaitu lantai dan langit-langit digunakan pada parameter rekursif) dan memberikan hasil yang lebih tajam [3].

  • Biasanya, Anda harus memijat relasi rekurensi aktual yang Anda miliki sebelum dapat menerapkan teorema Master. Transformasi umum yang mempertahankan asimptotik termasuk menjatuhkan lantai dan langit-langit serta mengasumsikan . Berhati-hatilah untuk tidak merusak barang-barang di sini; lihat [4] bagian 4.6 dan pertanyaan ini untuk perincian.n=bk


  1. Pada Solusi Persamaan Linier Linear oleh M. Akra dan L. Bazzi (1998)
  2. Teorema master yang ditingkatkan untuk rekurensi divide-and-conquer oleh S. Roura (1997)
    Mengacu pada teorema master yang lebih baik.
  3. Teorema master untuk kesenjangan rekurensi dan menaklukkan diskrit oleh M. Drmota dan W. Szpankowski (2011)
  4. Pengantar Algoritma oleh Cormen et al. (2009, edisi ke-3)

Ini mungkin pertanyaan bodoh tapi saya sering gagal memegang model mental ketika a tidak sama dengan b, saya tidak tahu mengapa tetapi dengan intuisi saya selalu merasa bahwa keduanya harus selalu sama, seperti dalam mergesort kita membagi masalah dalam dua bagian yang hampir sama (hampir) dan masing-masing dengan n / 2. Lebih lanjut jika kita membagi algoritma dalam tiga bagian yang sama maka input juga harus dibagi dalam tiga bagian yang sama yang lagi membuat a dan b sama. Bagaimana saya bisa mematahkan intuisi yang salah ini?
CodeYogi

17

Tebak & Buktikan

Atau bagaimana saya suka menyebutnya, " technique". Ini dapat diterapkan untuk semua jenis identitas. Idenya sederhana:

Tebak solusinya dan buktikan kebenarannya.

Ini adalah metode yang populer, bisa dibilang karena biasanya membutuhkan beberapa kreativitas dan / atau pengalaman (baik untuk pamer) tetapi sedikit mekanik (terlihat elegan). Seni di sini adalah membuat tebakan yang bagus dan terpelajar; buktinya (dalam kasus kami) biasanya induksi yang kurang lebih sederhana.

Saat diterapkan pada perulangan, "menebak" biasanya dilakukan oleh

  • memperluas pengulangan beberapa kali,
  • mencari tahu jangkar dan
  • menebak pola untuk perantara ( ).

Contoh sederhana

s0=s1=s2=1sn=5sn3+6n2

Mari kita perluas definisi beberapa kali:sn

sn=5sn3+6=5(5sn6+6)+6=5(5(5sn9+6)+6)+6 =5(5(5(51n÷3 times+6)+6)+6)+6n÷3 times

Di sini, polanya mudah dikenali dan menuntun kita pada klaim:

sn=5n3+6i=0n315i=525n364

Sekarang kami membuktikan identitas dengan induksi. Untuk , kita dapat menetapkan kebenaran dengan memasukkan nilai masing-masing. Dengan asumsi identitas berlaku untuk semua untuk sewenang-wenang tetapi diperbaiki , kami menghitungn n n 3n{0,1,2}nnn3

sn+3=5sn+6=5(525n364)+6=525n3+164=525n+3364

yang membuktikan identitas dengan kekuatan induksi.

Jika Anda mencoba menggunakan ini pada rekurensi yang lebih terlibat, Anda dengan cepat menemukan kelemahan utama dari metode ini: mungkin sulit untuk melihat polanya, atau memadatkannya ke bentuk tertutup yang bagus.

Asimptotik

Dimungkinkan juga untuk menggunakan metode ini untuk asimptotik. Perlu diketahui, bahwa Anda harus menebak konstanta untuk simbol Landau karena harus ada satu konstanta yang menetapkan batas untuk semua , yaitu faktor konstan tidak dapat berubah selama induksi.n

Pertimbangkan, misalnya, pengulangan runtime Mergesort, disederhanakan untuk kasus ¹:n=2k

T(1)=T(0)=0T(n)=2T(n/2)+n1n1

Kami menebak bahwa dengan konstanta , yaitu . Kami membuktikan ini dengan induksi lebih dari ; langkah induktif terlihat seperti ini:c = 1 T ( n ) n log n kT(n)O(nlogn)c=1T(n)nlognk

T(n)=2T(n/2)+n12n2logn2+n1=nlognnlog2+n1<nlogn


  1. Untuk urutan natural yang tidak berkurang, setiap urutan tak terbatas memiliki pertumbuhan asimptotik yang sama dengan urutan aslinya.

15

Metode Akra-Bazzi

Metode Akra-Bazzi memberikan asimptotik untuk pengulangan bentuk: Ini mencakup recurrences membagi dan menaklukkan yang biasa, tetapi juga kasus di mana pembagiannya tidak merata. "Istilah fudge" dapat memenuhi divisi yang tidak keluar dengan tepat, misalnya. Ketentuan untuk penerapan adalah: h i ( x )

T(x)=1ikaiT(bix+hi(x))+g(x)for xx0
hi(x)
  • Ada cukup kasus dasar untuk mendapatkan pengulangan
  • The dan semua konstantab iaibi
  • Untuk semua ,a i > 0iai>0
  • Untuk semua ,0 < b i < 1i0<bi<1
  • c x |g(x)|=O(xc) untuk beberapa konstanta sebagaicx
  • Untuk semua ,| h i ( x ) | = O ( x / ( log x ) 2 )i|hi(x)|=O(x/(logx)2)
  • x0 adalah konstanta

Perhatikan bahwa , dan sebagai fungsi gigi gergaji selalu antara 0 dan 1, menggantikan (atau as ) memenuhi persyaratan pada .{ u } = u - u b i x b i x h ibix=bix{bix}{u}=uubixbixhi

Temukan sedemikian rupa sehingga: Kemudian perilaku asimptotik dari sebagai diberikan oleh: dengan "cukup besar", yaitu terdapat sehingga untuk semua .1 i k a i b p i = 1 T ( x ) x T ( x ) = Θ ( x p ( 1 + x x 1 g ( u ))p

1ikaibip=1
T(x)xx1k1>0g(x/2)k1g(x)x>x1
T(x)=Θ(xp(1+x1xg(u)up+1du))
x1k1>0
(2)g(x/2)k1g(x)
x>x1

Contoh A

Sebagai contoh, ambil rekursi untuk , di mana : Kondisi terpenuhi, kita perlu : Seperti keberuntungan, . Jadi kita memiliki: n5T(0)=T(1)=T(2)=T(3)=T(4)=17

T(n)=9T(n/5)+T(4n/5)+3nlogn
p
9(15)p+(45)p=1
p=2
T(n)=Θ(n2(1+3n3uloguu3du))=Θ(n2)

karena dengan kami memenuhi untuk semua . Perhatikan bahwa karena integral menyatu bahkan jika kita menggunakan konstanta lain, seperti , sebagai batas bawah, adalah sah untuk menggunakannya juga; perbedaan menghilang dalam .k112(1log2log3)(2)x31Θ

Contoh B

Contoh lain adalah yang berikut untuk : Kami memiliki , periksa. Kami memiliki satu , , yang memeriksa. Dengan asumsi bahwa benar-benar dan / atau , tersirat juga memeriksa. Jadi kita membutuhkan: Jadi , dan: n2

T(n)=4T(n/2)+n2/lgn
g(n)=n2/lnn=O(n2)a1=4b1=1/2n/2n/2n/2hi(n)
a1b1p=4(1/2)p=1
p=2
T(n)=Θ(n2(1+2nu2duu3lnu))=Θ(n2(1+2nduulnu))=Θ(n2lnlnn)
Kami menerapkan trik yang sama seperti di atas untuk batas bawah integral, hanya saja kita menggunakan karena integral tidak konvergen untuk .21

(Bantuan maxima dengan aljabar sangat berterima kasih)


1
Saya memeriksa kertas aslinya. Mereka memiliki batasan teknis pada batas bawah integral; versi Anda (mengutip survei oleh Mehlhorn?) secara eksplisit mengharuskan integral terpusat. Karena saya pikir kondisi aslinya lebih mudah untuk diperiksa, saya mengubah pernyataan dan contoh yang sesuai, silakan periksa.
Raphael

1
Lebih lanjut, makalah asli tidak memberikan versi dengan ; Apakah ini diambil dari naskah Leighton? Apakah Anda memiliki referensi peer-review untuk itu? Haruskah kita pindah ke versi yang diberikan di koran tahun 1998 oleh Akra & Bazzi? hi
Raphael

1
Saya telah menemukan apa yang tampaknya menjadi inkonsistensi dalam teorema . Mungkin Anda tahu jawabannya?
Raphael

11

Penjumlahan

Seringkali kita menemukan pengulangan bentuk mana adalah monoton. Dalam hal ini, kita dapat memperluas dan diberi nilai awal , untuk memperkirakan kita perlu memperkirakan jumlah .

T(n)=T(n1)+f(n),
f(n)
T(n)=T(c)+m=c+1nf(m),
T(c)T(n)f(c+1)++f(m)

Non-penguranganf(n)

Ketika adalah monoton non-menurun, kita memiliki batas yang jelas Batas-batas ini paling mungkin dalam arti bahwa mereka ketat untuk beberapa fungsi: batas atas untuk fungsi konstan, dan batas bawah untuk fungsi langkah ( untuk dan untuk ). Namun, dalam banyak kasus perkiraan ini tidak terlalu membantu. Misalnya, ketika , batas bawah adalah dan batas atas adalah , sehingga keduanya berjauhan.f(n)

f(n)m=c+1nf(m)(nc)f(n).
f(m)=1mnf(m)=0m<nf(m)=mn(nc)n

Integrasi

Perkiraan yang lebih baik diberikan oleh integrasi: Untuk , ini memberikan nilai penjumlahan yang benar ke istilah dengan urutan lebih rendah: Ketika kita dapat menghitung jumlah secara eksplisit, tetapi dalam banyak kasus perhitungan eksplisit sulit. Sebagai contoh, ketika antiderivatif dari adalah , dan begitu

cnf(x)dxm=c+1nf(m)c+1n+1f(x)dx.
f(m)=m
12n212c2m=c+1nm12(n+1)212(c+1)2.
f(m)=mf(m)=mlogmf(1/2)x2logx(1/4)x2
m=c+1nmlogm=12n2logn±Θ(n2).

The Euler-Maclaurin rumus memberikan perkiraan yang lebih baik. Formula ini dapat digunakan, misalnya, untuk membuktikan bentuk kuat rumus Stirling, dengan memperkirakan jumlah .logn!=m=1nlogm

Non-meningkatf(n)

Dalam beberapa kasus, monoton tidak meningkat. Estimasi sepele menjadi dan estimasi integral Sebagai contoh, untuk , menggunakan kita memperoleh f(n)

f(1)m=c+1nf(m)(nc)f(1),
c+1n+1f(x)dxm=c+1nf(m)cnf(x)dx.
f(m)=1/mf(m)=logm
m=c+1n1m=logn±Θ(1).

Jawaban ini lebih sedikit berurusan dengan pemecahan rekurensi tetapi lebih pada memperkirakan jumlah (yang mungkin berguna untuk memecahkan rekurensi); tekniknya adalah ganda dari jumlah Riemann . Ini juga harus bekerja dengan bentuk lain seperti untuk konstanta ? T(nd)d
Raphael

Benar, juga dapat diselesaikan dengan cara ini. T(n)=cT(nd)+f(n)
Yuval Filmus

9

Sedgewick dan Flajolet telah melakukan pekerjaan yang luas dalam analitik kombinatorik , yang memungkinkan rekurensi diselesaikan secara asimptotik menggunakan kombinasi fungsi pembangkit dan analisis kompleks. Pekerjaan mereka memungkinkan banyak pengulangan diselesaikan secara otomatis, dan telah diimplementasikan dalam beberapa sistem aljabar komputer.

Buku pelajaran ini tentang subjek ditulis oleh Flajolet dan Sedgewick dan merupakan referensi yang sangat baik. Eksposisi yang agak sederhana, diarahkan pada aplikasi untuk analisis algoritma, adalah teks ini oleh Sedgewick dan Flajolet.

Semoga ini membantu!


4
Ini adalah referensi yang bagus, tetapi kami ingin mengumpulkan metode dengan cara yang dapat diakses. Bisakah Anda menyajikan satu metode tertentu secara detail?
Raphael

9

Mungkin ada saat-saat ketika Anda menemukan perulangan aneh seperti ini: Jika Anda seperti saya, Anda akan menyadari bahwa Anda tidak dapat menggunakan Teorema Master dan kemudian Anda mungkin berpikir, " hmmm ... mungkin analisis pohon perulangan bisa bekerja. " Maka Anda akan menyadari bahwa pohon mulai menjadi sangat cepat. Setelah beberapa pencarian di internet Anda melihat metode Akra-Bazzi akan berfungsi! Kemudian Anda benar-benar mulai melihat ke dalamnya dan menyadari Anda tidak benar-benar ingin melakukan semua matematika. Jika Anda seperti saya sampai saat ini, Anda akan senang mengetahui ada cara yang lebih mudah.

T(n)={cn<72T(n5)+4T(n7)+cnn7


Teorema Perpecahan Tidak Rata Bagian 1

Biarkan dan menjadi konstanta positif.ck

Kemudian biarkan menjadi konstanta positif sehingga .{a1,a2,,ak}1kai<1

Kita juga harus memiliki pengulangan formulir (seperti contoh kita di atas):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Klaim

Kemudian saya mengklaim mana adalah konstanta (misalnya linear asimptotik) dan:T(n)bnb

b=c1(1kai)

Bukti oleh Induksi

Dasar :n<max{a11,a21,,ak1}T(n)c<b<bn

Induksi : Asumsikan true untuk setiap , yang kemudian kita milikin<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+ba1n+ba2n++bakncn+ba1n+ba2n++bakn=cn+bn1kai=cncn1kai1(1kai)+cn1kai1(1kai)=cn1(1kai)=bn

Maka kita memiliki .T(n)bnT(n)=O(n)

Contoh

T(n)={cn<72T(n5)+4T(n7)+cnn7
Kami pertama-tama memverifikasi koefisien di dalam panggilan rekursif berjumlah kurang dari satu:
1>1kai=15+15+17+17+17+17=25+47=3435

Kami selanjutnya memverifikasi bahwa kasus dasar kurang dari maks dari invers koefisien-koefisien:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7}=7

Dengan kondisi ini terpenuhi, kita tahu mana adalah konstan sama dengan: Oleh karena itu kami memiliki: T(n)bnb

b=c1(1kai)=c13435=35c
T(n)35cnT(n)cnT(n)=Θ(n)


Teorema Perpecahan Tidak Rata Bagian 2

Demikian pula kita dapat membuktikan batasan ketika . Buktinya akan mengikuti banyak format yang sama:1k=1

Biarkan dan menjadi konstanta positif sehingga .ckk>1

Kemudian biarkan menjadi konstanta positif sehingga .{a1,a2,,ak}1kai=1

Kita juga harus memiliki pengulangan formulir (seperti contoh kita di atas):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Klaim

Kemudian saya mengklaim (kita memilih basis karena akan menjadi faktor percabangan dari pohon rekursi) di mana dan adalah konstanta (misalnya linearitmik yang asimptotik) ) seperti yang:T(n)αnlogkn+βnlogkkαβ

β=c
dan
α=c1kailogkai1

Bukti oleh Induksi

Dasar :n<max{a11,a21,,ak1}T(n)c=β<αnlogkn+βn

Induksi : Asumsikan true untuk setiap , yang kemudian kita milikin<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+1k(αainlogkain+βain)=cn+αn1k(ailogkain)+βn1kai=cn+αn1k(ailogknai1)+βn=cn+αn1k(ai(logknlogkai1))+βn=cn+αn1kailogknαn1kailogkai1+βn=αn1kailogkn+βn=αnlogkn+βn

Maka kita memiliki .T(n)αnlogkn+βnT(n)=O(nlogn)

Contoh

Mari kita modifikasi contoh sebelumnya yang kita gunakan sedikit saja:

T(n)={cn<352T(n5)+4T(n7)+T(n35)+cnn35

Kami pertama-tama memverifikasi koefisien di dalam panggilan rekursif dengan satu:

1=1kai=15+15+17+17+17+17+135=25+47+135=3535

Kami selanjutnya memverifikasi bahwa kasus dasar kurang dari maks dari invers koefisien-koefisien:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7,35}=35

Dengan kondisi ini terpenuhi, kita tahu mana dan adalah konstanta yang sama dengan: Oleh karena itu kami memiliki: T(n)αnlogn+βnβ=cα

b=c1kailogkai1=c2log755+4log777+log735351.048c
T(n)1.048cnlog7n+cnT(n)=O(nlogn)


6

Setelah memeriksa posting ini lagi, saya terkejut ini belum ada di sini.

Transformasi Domain / Perubahan Variabel

Ketika berhadapan dengan perulangan, terkadang berguna untuk mengubah domain Anda jika tidak jelas seberapa dalam tumpukan rekursi akan terjadi.

Misalnya, lakukan pengulangan berikut:

T(n)=T(22loglogn)+logloglogn

Bagaimana kita bisa menyelesaikan ini? Kami bisa memperluas seri, tetapi saya berjanji ini akan menjadi sangat cepat. Sebagai gantinya, mari pertimbangkan bagaimana input kami berubah dengan setiap panggilan.

Pertama-tama kita memiliki:

  1. n kemudian
  2. 22loglogn , lalu
  3. 22loglog(22loglogn) , dan seterusnya.

Tujuan dari transformasi domain sekarang adalah untuk mengubah pengulangan kami menjadi setara sehingga alih-alih transisi di atas, kami hanya memiliki .S(k)k,k1,k2,

Misalnya, jika kita membiarkan , maka inilah yang kita dapatkan untuk pengulangan di atas: Kemudian kita cukup menulis ulang sebagai: Maka yang harus Anda lakukan adalah mengonversi kembali ke untuk mendapatkan: n=2222k

T(2222k)=T(22loglog2222k)+logloglog(2222k)=T(2222k1)+2k
T(k)=T(k1)+2k=i=1k2k=2k+11
kn
T(n)=2(loglogloglogn)+11=O(logloglogn)


Dengan contoh ini, kita sekarang dapat melihat tujuan kita.

Asumsikan Untuk beberapa konstanta dan fungsi dan .

T(n)={h(1)n=1aT(f(n))+h(n)otherwise
af(n)h(n)

Kami sekarang mencoba menemukan beberapa fungsi dan sedemikian rupa sehingga g(k)=nf(g(k))=g(k1)

T(g(k))=aT(f(g(k)))+h(g(k))=aT(g(k1))+h(g(k))

Secara umum, kita ingin mana adalah aplikasi berulang dari pada , kali. (mis. ). Ini akan memungkinkan untuk bertindak sebagai fungsi "iterasi". Dimana, pada kedalaman rekursi, kerja yang dilakukan hanya .f(i)(n)=g(ki)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(ki))

Maka kita dapat dengan mudah mengkonversi ini ke sehingga Maka kita hanya perlu khawatir tentang meringkas untuk semua hingga kasing dasar yang diberikan. Yaitu, S(k)=T(g(k))

S(k)=aS(k1)+h(g(k))
h(g(k))k
S(k)=i=g1(1)kakih(g(i))

Jika kita dapat menentukan untuk beberapa fungsi bentuk tertutup , maka kita dapat menentukan sebagai S(k)=γ(k)γT(n)

T(n)=γ(g1(n))

Kemudian kami menggunakan ini untuk mendapatkan terikat pada melalui salah satu metode lain di atas. Anda jelas dapat memodifikasi metode ini sedikit untuk spesifikasi Anda, tetapi secara umum Anda mencoba menemukan fungsi iterasi untuk mengubah menjadi rekursi sederhana.T(n)g(k)T(n)

Saya tidak tahu cara pasti untuk menentukan pada titik ini, tetapi saya akan terus memikirkannya dan memperbarui jika menjadi lebih jelas (atau jika ada komentator punya beberapa tips!). Saya kebanyakan menemukan fungsi melalui trial and error di masa lalu (lihat di sini , di sini , di sini , dan di sini untuk contohnya).g(k)g(k)


1
Apakah ada batasan untuk , , dan / atau ? Saya bertanya secara khusus karena trik substitusi cerita rakyat yang sama terkadang gagal ketika notasi Landau terlibat, yang membuat saya khawatir jika itu benar-benar selalu merupakan jawaban yang benar. fghγg1
Raphael

@ Raphael, ini adalah bagian yang saya tidak sepenuhnya yakin. Ada beberapa hal yang saya pikir perlu kita pastikan untuk membangun kesetaraan. 1) Kedalaman rekursi adalah sama, ini dapat dipastikan dengan dan . 2) pekerjaan yang dilakukan pada setiap tingkat rekursi adalah sama, yang saya percaya dipaksakan oleh dan kemudian . Ide dasarnya adalah dengan mengubah menjadi jumlah, yaitu . Konversi dari ke Saya juga tidak 100% yakin (saya tidak punya bukti), tetapi saya tidak bisa melihat mengapa itu terjadi. salah. Pikiran? f(g(k))=g(k1)g(k)=ng(k)=nh(g(k))=h(n)T(n)i=ckh(g(i))γ(k)γ(g1(n))
ryan

@Raphael Anda juga dapat mempertimbangkan kasus ini, di mana bukan , kemudian mengonversi ke harus lebih lurus meneruskan. Mudah dibuktikan saya pikir jika Anda hanya menunjukkan kesetaraan dalam penjumlahan. Anda mungkin akan mengalami masalah lucu dengan notasi Landau di sini, tetapi jika Anda membiarkan Landau keluar dan hanya terjebak dengan kesetaraan yang tepat, saya pikir itu akan baik-baik saja. S(k)=γ(k)ΘT(n)=γ(g1(n))
ryan

@Raphael Saya mengeditnya hanya menggunakan persamaan, jadi notasi landau seharusnya tidak mengacaukannya. Juga digeneralisasi sedikit lebih. Yang Anda bahkan bisa menggeneralisasi sedikit lebih banyak untuk menggunakan fungsi daripada konstanta . Maka alih-alih dalam penjumlahan, gunakan saja aplikasi . β(n)aakiβ(g(i))
ryan

5

Ada satu lagi pendekatan yang berfungsi untuk hubungan perulangan yang sederhana: minta Wolfram Alpha untuk menyelesaikan perulangan untuk Anda.

Misalnya, coba ketikkan f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)Wolfram Alpha. Anda akan mendapatkan solusi, dengan tautan ke angka Fibonacci. Atau coba f(1)=1, f(n)=f(n-1)+natau f(1)=1, f(n)=2*f(n-1)+3*natau f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3untuk contoh lainnya. Namun, berhati-hatilah: Wolfram Alpha dapat memecahkan beberapa pengulangan yang sangat sederhana, tetapi berantakan untuk yang lebih kompleks.

Pendekatan ini menghindari perlunya pemikiran apa pun, yang dapat dilihat sebagai bug atau fitur.


3
Saya tidak berpikir bahwa tujuan dari situs ini akan menjelaskan bagaimana aljabar komputer melakukan hal-hal seperti ini, tidak menganjurkan penggunaan buta nya. Tetapi alat - alat itu berguna, sangat berguna sehingga orang mungkin harus selalu mencobanya sebelum "membuang-buang waktu" (dalam "latihan").
Raphael

Dari pengalaman saya sendiri, mencoba untuk menggunakan aljabar komputer tanpa setiap rasa apa yang "keras" atau "mudah" tidak membuat Anda sangat jauh. Khususnya dalam analisis algoritma, beberapa pemijatan dapat dibutuhkan. Saya tidak tahu bagaimana Anda melakukan itu tanpa mengetahui bagaimana menyelesaikannya sendiri. (Adapun untuk tujuan situs ini, ada beberapa sudut pandang. Fakta: sejauh ini, "ini berguna untuk seseorang " tidak cukup untuk membenarkan posting.)
Raphael

5

Kasus 2 dari teorema master, seperti biasanya dinyatakan, hanya menangani pengulangan dari bentuk di mana untuk . Teorema berikut, diambil dari handout Jeffrey Leon, memberikan jawaban untuk negatif :T(n)=aT(n/b)+f(n)f(n)=Θ(nlogablogkn)k0k

Pertimbangkan rekurensi dengan case dasar yang sesuai.T(n)=aT(n/b)+f(n)

  1. Jika untuk maka .f(n)=O(nlogbalogc1n)c<0T(n)=Θ(nlogba)

  2. Jika untuk maka .f(n)=Θ(nlogbalogc1n)c=0T(n)=Θ(nlogbaloglogn)

  3. Jika untuk maka ).f(n)=Θ(nlogbalogc1n)c>0T(n)=Θ(nlogbalogcn

Buktinya menggunakan metode substitusi berulang, seperti yang sekarang kita sketsa. Misalkan dan . Kemudian untuk kekuatan , Sekarang mari kita perhatikan kasus satu per satu. Ketika , seri menyatu, dan begitu . Ketika , jumlahnya adalah jumlah harmonik , dan seterusnyaf(n)=nlogbalogbc1nT(1)=0nb

T(n)=i=0logbn1ai(nbi)logbalogbc1(nbi)=i=0logbn1nlogba(logbni)c1=nlogbaj=1logbnjc1.
c<0j=0jc1T(n)=Θ(nlogba)c=0Hlogbn=log(logbn)+O(1)T(n)=Θ(nlogbaloglogn) . Ketika , kita dapat memperkirakan jumlah menggunakan integral: dan .c>0T(n)=Θ(nlogbalogcn)
j=1logbn0logbnxc1dx=xcc|0logbn=logbcnc,
T(n)=Θ(nlogbalogcn)
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.