Pertimbangkan algoritma berikut, di mana adalah konstanta tetap.
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.
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 2T ( 1 , n ) = T ( m , 1 ) = O ( 1 ) T ( n , m ) = O ( m n )
Jawaban:
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] A B[j1..j2] B [i1−1,i2]×[j1−1,j2] [0,n]×[0,m] k × k kn×m empat 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×k k
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 > = 2k≥2 2(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 T ≤ 3 ( P T - P N ) P T - P N(1+2/3+(2/3)2+…)=3 PN≤(2/3)PT PN PT PT≤3(PT−PN) PT−PN
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×m 3 ⋅ 44nm 12 n3⋅4nm 12nm
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=1 n>1 k=1 O ( n24nm O(nm)
Akibat wajar. Batas juga berlaku dengan probabilitas tinggi (dengan asumsi dan cenderung tak terhingga).mn m
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
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:r∈R} |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 )k min(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) r r q(r)=min(nr,mr) r′ (i,j) r 1/3 k (2/3)q(r) E[q(r′)]≤3/2 q(r′) r′ O ( 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))
sumber
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,n k2 Ai,Bj i,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 )Ai i i+1 k {1,...,m} mβ(k,m+k+1) m β(1,m+k+1)
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 , … , ck k≤n k≥n k 1,…,c
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))
sumber