Bagaimana cara menganalisis algoritma rekursif acak?

8

Pertimbangkan algoritma berikut, di mana adalah konstanta tetap.c

void partition(A[1..m], B[1..n])
{
   if m=1 or n=1
      return

   k = random(min(c,m,n));
   partition A into k sublists Asub[1..k] at k-1 distinct random indices
   partition B into k sublists Bsub[1..k] at k-1 distinct random indices

   for i = 1 to k
     for j = 1 to k
        partition(Asub[i], Bsub[j])

   Do something that takes O(n+m) time.
}

Berapa perkiraan waktu berjalan dari algoritma ini? Waktu yang berjalan tampaknya , tetapi saya tidak dapat menemukan buktinya.O(mn)

Jika kita sebaliknya mempartisi daftar input menjadi bagian yang berbeda dengan panjang yang sama, kita akan memiliki rekurensi dengan kasus dasar ; tidak sulit untuk membuktikan bahwa . Tapi algoritma partisi masukan ke dalam acak sejumlah bagian dengan acak ukuran. (Seperti biasa, "acak" adalah singkatan untuk "seragam secara acak".) Bagaimana seseorang menganalisis algoritma seperti itu?T ( n , m ) = k 2kT ( 1 , n ) = T ( m , 1 ) = O ( 1 ) T ( n , m ) = O ( m n )T(n,m)=k2T(n/k,m/k)+O(n+m)T(1,n)=T(m,1)=O(1)T(n,m)=O(mn)

Saeed
sumber
Algoritme Anda disebut partisi bertipe list -> list -> void, tetapi menurut saya, dalam panggilan terakhir Anda dari algoritma, ia memiliki tipe -> -> void? Apakah saya salah mengerti sesuatu? aaaa
Gopi
8
Pertanyaannya ditulis dengan buruk, tetapi di bawahnya ada pertanyaan asli tentang menganalisis pengulangan acak.
Suresh Venkat
5
Sunting besar. Mudah-mudahan saya telah mempertahankan rasa pertanyaan itu.
Jeffε
1
@ Jɛ ff E sekarang kamu harus menjawabnya :)
Suresh Venkat
1
Pernahkah Anda melihat kertas Chaudhuri-Dubhashi tentang kemungkinan berulang (ini mengembangkan lebih lanjut karya asli Karp tentang masalah ini): sciencedirect.com/science/article/pii/S030439759600261717
Suresh Venkat

Jawaban:

9

Berikut ini adalah bukti bahwa algoritma ini berjalan dalam waktu dalam harapan dan dengan probabilitas tinggi.O(nm)

Pertama pertimbangkan algoritma yang dimodifikasi sehingga dipilih dalam alih-alih secara acak dalam .k{2,3,..,min(c,n)}{1,2,...,min(c,n)}

Lemma 1. Untuk algoritma yang dimodifikasi ini, terlepas dari pilihan acak dari algoritma, waktu selalu .O(nm)

Bukti. Perbaiki input dan dan perbaiki pilihan acak dari algoritma secara sewenang-wenang. Dalam setiap (mungkin rekursif) panggilan untuk partisi (), dua argumen sesuai masing-masing dua subarrays: a subarray dari dan subarray dari . Identifikasi panggilan seperti itu dengan persegi panjang . Dengan demikian, panggilan tingkat atas adalah , dan setiap panggilan rekursif sesuai dengan sub-persegi panjang dalamB [ 1 .. m ] A [ i 1 . . i 2 ] A B [ j 1 . . j 2 ] B [ i 1 - 1 , i 2 ] × [ j 1 - 1 , j 2 ] [ 0 , n ] × [ 0 , m ] nA[1..n]B[1..m]A[i1..i2]AB[j1..j2]B[i11,i2]×[j11,j2][0,n]×[0,m]k × k kn×mempat persegi panjang. Persegi panjang ini membentuk pohon, di mana persegi panjang yang sesuai dengan satu panggilan memiliki sebagai anak-anak persegi panjang yang sesuai dengan panggilan yang dibuat langsung oleh panggilan itu. Setiap persegi panjang orang tua dipartisi oleh anak persegi panjangnya, yang membentuk kisi (dari persegi tidak seragam) dengan setidaknya 2. Tentu saja setiap sudut persegi panjang hanya memiliki koordinat bilangan bulat.k×kk

Waktu berjalan dari algoritma dibatasi oleh konstanta kali jumlah, di atas persegi panjang, dari perimeter semua persegi panjang ini. (Ini karena waktu dalam setiap panggilan adalah O (n + m), dan pembatas persegi panjang yang sesuai adalah .)2(n+m)

Saya mengklaim bahwa dalam set persegi panjang seperti yang dijelaskan di atas, jumlah perimeter maksimal . Jika benar, ini membuktikan lemma.12nm

Untuk membuktikan klaim tersebut, perhatikan terlebih dahulu bahwa, karena , untuk persegi panjang orang tua mana pun, perimeter orang tua paling banyak 2/3 kali perimeter total anak-anak. (Batas orang tua adalah . Batas total anak-anak adalah , dan )2 ( n + m ) ( 1 + k ) ( n + m ) k > = 2k22(n+m)(1+k)(n+m)k>=2

Ini mengikuti dengan argumen pengisian standar bahwa pembatas total semua persegi panjang paling banyak kali pembatas hanya persegi panjang daun . (Pengamatan menyiratkan bahwa , di mana adalah perimeter total persegi panjang non-daun dan adalah perimeter total semua persegi panjang. Ini menyiratkan , dan adalah perimeter total dari persegi panjang daun.)P N( 2 / 3 ) P T P N P T P T3 ( P T - P N ) P T - P N(1+2/3+(2/3)2+)=3PN(2/3)PTPNPTPT3(PTPN)PTPN

Selanjutnya, amati bahwa persegi panjang daun mempartisi persegi panjang asli . Perimeter maksimum yang mungkin dari daun diperoleh ketika daun sesuai dengan kuadrat unit dengan titik akhir bilangan bulat, dalam hal ini total perimeter daun adalah . Jadi, jumlah perimeter maksimal , yaitu, paling banyak .4n×m3 44nm12 n34nm12nm

Ini membuktikan Lemma 1.

Konsekuensi: Algoritme asli berjalan dalam waktu dengan harapan.O(nm)

Bukti. Jika partisi memilih , itu hanya akan menduplikasi persegi panjang. Sejak , probabilitas paling banyak 1/2. Dengan demikian, jumlah yang diharapkan dari setiap persegi yang diduplikasi adalah paling banyak 1 (dan jumlah salinan yang diharapkan dari setiap persegi paling banyak 2). Jadi, untuk algoritma asli, jumlah yang diharapkan dari perimiter dari semua persegi panjang paling banyak dua kali lipat dari algoritma yang dimodifikasi, yaitu paling banyak . Sama seperti dalam analisis algoritma itu, waktu berjalan sebanding dengan jumlah ini, demikian juga . QEDn > 1 k = 1 24 nk=1n>1k=1O ( n24nmO(nm)

Akibat wajar. Batas juga berlaku dengan probabilitas tinggi (dengan asumsi dan cenderung tak terhingga).mnm

Sketsa bukti. Memperbaiki setiap pilihan acak kecuali jumlah duplikat dari setiap persegi panjang, waktunya sebanding dengan di mana adalah himpunan persegi panjang yang dihasilkan, adalah jumlah kali diduplikasi (yaitu, saat untuk persegi panjang itu), danadalah keliling .RXrrk=1| r| r

rR(1+Xr)|r|
RXrrk=1|r|r

Variabel independen, dan masing-masingadalah , jadi dengan standar Chernoff terikat, probabilitas bahwa jumlah melebihi dua kali harapannya adalah . (Lebih khusus, ambil , lalu terapkan Chernoff ke jumlah 's.) QED| r | O ( n + m ) = o ( n m ) o ( 1 ) Y r = ( 1 + X r ) | r | / 2 ( n + m ) Y r{Xr:rR}|r|O(n+m)=o(nm)o(1)Yr=(1+Xr)|r|/2(n+m)Yr


Sebagai tambahan: jika algoritma memilih secara acak hingga alih-alih dan kemudian lakukan bekerja di setiap panggilan (alih-alih ), total waktu akan tetap dalam harapan.min ( n , m ) min ( c , n ) O ( m n ) O ( m + n ) O ( m n )kmin(n,m)min(c,n)O(mn)O(m+n)O(mn)

Bukti. Catatan pertama bahwa total waktu akan sebanding dengan jumlah area dari semua persegi panjang. Jumlah ini sama dengan jumlah, di atas koordinat bilangan bulat , dari jumlah persegi panjang yang muncul di. Ini adalah dalam ekspektasi karena, dalam ekspektasi, setiap diberikan dalam persegi panjang asli terjadi di persegi panjang. ( i , j ) O ( n m ) ( i , j ) O ( 1 )(i,j)(i,j)O(nm)(i,j)O(1)

Untuk melihat ini, misalkan terkandung dalam persegi panjang , dan pertimbangkan panggilan ke partisi pada . Biarkan . Biarkan menjadi persegi panjang yang merupakan anak (mengandung ) dari . Dengan probabilitas setidaknya , dipilih setidaknya . Dengan syarat, , jadi dengan probabilitas konstan paling banyak 1. Jika itu terjadi, maka adalah daun (tidak memiliki anak). Ini mengikuti dari ini bahwa jumlah persegi yang diharapkanr r q ( r ) = min ( n r , m r ) r ' ( i , j ) r 1 / 3 k ( 2 / 3 ) q ( r ) E [ q ( r ' ) ] 3 / 2 q ( r ' ) r ' ((i,j)rrq(r)=min(nr,mr)r(i,j)r1/3k(2/3)q(r)E[q(r)]3/2q(r)rO ( 1 )(i,j)is in adalah . QEDO(1)

(Apakah batas akan berlaku dengan probabilitas tinggi adalah pertanyaan yang menarik .. Saya pikir itu akan. Tentu saja akan menahan whp)O ( n m log ( n m ) )O(nm)O(nmlog(nm))

Neal Young
sumber
Terima kasih banyak, ini ide yang sangat menarik dan cerdas. Hanya untuk catatan tambahan, kami dapat menggunakan ide Anda untuk mempartisi array d-dimensional. Hanya tentang bagian yang Anda katakan anak-anak membuat grid, sebenarnya mereka membagi orang tua dalam bagian dari persegi panjang, tidak perlu bagian ukuran yang sama, sehingga mereka tidak akan membuat kotak, tetapi argumen Anda masih berlaku perimeter orang tua dari total anak. Juga saya tidak bisa mendapatkan bagaimana jika kita mengganti dengan sebagai biaya tambahan untuk setiap proses, masih kita memiliki total waktu pengoperasian . Sekali lagi terima kasih banyak atas ide yang sangat cerdas. K 2 2 / 3 O ( m + n ) O ( m n ) O ( m n )K×KK22/3O(m+n)O(mn)O(mn)
Saeed
Sama-sama! Saya akan mengedit buktinya untuk mengklarifikasi poin yang Anda angkat ..
Neal Young
Klarifikasi yang bagus dan pertanyaan yang bagus pada akhirnya, terima kasih banyak.
Saeed
4

Pendekatan khas adalah untuk menganalisis nilai yang diharapkan dari waktu berjalan dari algoritma. Dalam kasus ini, nilai yang diharapkan dari waktu berjalan, pada masalah apa pun dengan , adalah sesuatu seperti kali waktu berjalan yang diharapkan dari partisi subproblem [ ]. Untuk setiap ukuran subproblem adalah variabel acak.k 2 A i , B j i , jm,nk2Ai,Bji,j

Panjang daftar adalah perbedaan antara statistik urutan ke - dan ke- ketika elemen digambar dari . Ini pada dasarnya adalah (yaitu kali undian dari variabel acak ). Karena itu kita punya i i + 1 k { 1 , . . . , m } m β ( k , m + k + 1 ) m β ( 1 , m + k + 1 )Aiii+1k{1,...,m}mβ(k,m+k+1)mβ(1,m+k+1)

T[m,n|k]=C(m+n)+k2x,yT(mx,ny)xk1yk1(1x)m+k1(1y)n+k1β(k,n+k+1)β(k,m+k+1)dxdy

Ada beberapa kesalahan pembulatan di sini, karena kita harus benar-benar memiliki di integrand.T(mx,ny)

Sayangnya adalah variabel acak sehingga kita juga harus berintegrasi dengannya. Saya tidak berpikir ada gunanya meminta , karena jika Anda hanya akan mempartisi data menjadi sub-daftar yang mungkin kosong. Jadi katakanlah dipilih secara seragam secara acak dari . Maka Anda mendapatkank n k n k 1 , , ckknknk1,,c

T[m,n]=C(m+n)+k=1ck2cx,yT(mx,ny)xk1yk1(1x)m+k1(1y)n+k1β(k,n+k+1)β(k,m+k+1)dxdy

Perulangan ini cukup mengerikan, tetapi jika Anda memiliki tebakan untuk terikat pada (saya kira ) Anda bisa pasang dan verifikasi.T ( m , n ) = O ( ( log m + log n ) ( m + n ) )T[m,n]T(m,n)=O((logm+logn)(m+n))

David Harris
sumber