Halaman 2
= (3/4) (cn ^ 2) + dn
Jadi jika dn <(cn ^ 2) / 4 (yaitu d <cn / 4 ) maka beta lebih cepat dari alpha
Khusus untuk semua n cukup besar , ( n> 4d / c = Konstan ), beta lebih cepat dari
alfa
Realisasi beta ini meningkat dengan alpha hanya dengan faktor konstan. Tapi jika
Ukuran masalah, n , cukup besar saat itu
n> 4d / c
n / 2> 4d / c
...
n / 2 ^ i> 4d / c
yang menunjukkan bahwa menggunakan beta dan bukan alpha untuk tahap
` solves this '
berulang kali sampai sub-sub-sub .. contohnya berukuran n0 <= (4d / c) akan
menghasilkan algoritma yang lebih cepat.
Jadi pertimbangkan algoritma baru berikut untuk contoh ukuran n
Prosedur gamma ( n : ukuran masalah ) adalah
mulai
jika n <= n ^ -0 maka
Selesaikan masalah dengan menggunakan Algorithm alpha ;
lain
Split menjadi 3 sub-contoh ukuran n / 2 ;
Gunakan gamma untuk memecahkan setiap sub-instance;
Kombinasikan 3 sub-solusi;
akhir jika ;
akhir gamma ;
Misalkan T (gamma) (n) menunjukkan waktu berjalan dari algoritma ini.
cn ^ 2
jika n <= n0
T (gamma) (n) =
3T (gamma) (n / 2) + dn sebaliknya
Halaman 3
Kita akan menunjukkan bagaimana hubungan bentuk ini dapat diperkirakan
kemudian di
Tentu saja. Dengan metode ini bisa ditunjukkan itu
T (gamma) (n) = O (n ^ {log3}) (= O (n ^ {1.59 ..})
Ini adalah perbaikan asimtotik pada algoritma alpha dan beta .
Perbaikan yang dihasilkan dari penerapan algoritma gamma adalah karena
Fakta bahwa hal itu memaksimalkan penghematan beta yang diraih .
Metode alpha yang relatif tidak efisien diterapkan hanya pada masalah "kecil"
ukuran.
Bentuk algoritma divide-and-conquer yang tepat ditandai dengan:
Ukuran input ambang batas, n0, di bawah ini yang masalah ukuran tidak sub-
terbagi.
Halaman 4
akhir jika ;
akhir D-dan-C ;
Algoritma semacam itu secara alami dan mudah direalisasikan sebagai:
Prosedur rekursif
dalam (cocok) bahasa pemrograman tingkat tinggi.
Contoh 1:
Pencarian Biner
Pertimbangkan masalah berikut: satu memiliki direktori yang berisi satu set
nama dan nomor telepon yang terkait dengan masing-masing nama.
Direktori diurutkan menurut urutan alfabet nama. Ini berisi n entri
yang disimpan dalam 2 array:
nama (1..n) ; angka (1..n)
Dengan diberi nama dan nilai n masalahnya adalah menemukan nomor
yang terkait
dengan namanya
Kami berasumsi bahwa nama masukan yang diberikan sebenarnya terjadi di
direktori,
agar eksposisi lebih mudah.
Algoritma Divide- & amp-Conquer untuk memecahkan masalah ini adalah yang
paling sederhana
contoh paradigma
Hal ini berdasarkan pengamatan berikut
Dengan diberi nama, X mengatakan,
X terjadi di tempat tengah deret nama
Atau
X terjadi pada paruh pertama dari deret nama . (U)
Atau
Halaman 5
X terjadi pada paruh kedua dari deret nama . (L)
U (masing-masing L ) benar hanya jika X datang sebelumnya (masing-
masing setelah ) itu
nama disimpan di tempat tengah
Pengamatan ini mengarah pada algoritma berikut:
pencarian fungsi ( X : nama ;
mulai,
selesai
:
bilangan bulat )
bilangan bulat kembali adalah
tengah : bilangan bulat ;
mulai
tengah : = (mulai + selesai) / 2 ;
jika nama (tengah) = x maka
nomor kembali (tengah) ;
elsif X & ltnames (tengah) lalu
pencarian kembali (X, start, middle-1) ;
lain - X & gtnames (tengah)
pencarian kembali (X, middle + 1, finish) ;
akhir jika ;
pencarian akhir ;
Latihan: Bagaimana seharusnya algoritma ini dimodifikasi untuk memenuhi
kemungkinan itu
bahwa nama yang diberikan tidak terjadi di direktori? Dalam hal generik
bentuk algoritma pembagian & amplitudo, pada tahap mana ini
modifikasi dibuat
Kami menunda analisis kinerja algoritma sampai nanti.
Contoh 2
Pasangan terdekat
Memasukkan:
P = {p (1), p (2), ..., p (n)}
dimana p (i) = (x (i), y (i)) .
Satu set n poin di pesawat.
Halaman 6
Keluaran
Jarak antara dua titik yang paling dekat.
Catatan: Jarak DELTA (i, j) antara p (i) dan p (j) didefinisikan oleh
ekspresi:
Akar kuadrat dari {(x (i) -x (j)) ^ 2 + (y (i) -y (j)) ^ 2}
Kami menggambarkan algoritma membagi dan menaklukkan untuk masalah ini.
Kami berasumsi bahwa:
n adalah kekuatan pasti 2, n = 2 ^ k .
Untuk setiap i , x (i) <= x (i + 1) , yaitu titik-titiknya dipesan dengan
meningkatkan x dari
kiri ke kanan.
Pertimbangkan menggambar garis vertikal ( L ) melalui himpunan titik P sehingga
setengahnya
dari titik-titik di P berbohong ke kiri L dan setengah berbohong di sebelah
kanan L.
Halaman 7
Ada tiga kemungkinan:
Halaman 8
jarak kembali dari p (1) sampai p (2) ;
lain
P-KIRI: = (p (1), p (2), ..., p (n / 2)) ;
P-RIGHT: = (p (n / 2 + 1), p (n / 2 + 2), ..., p (n)
);
DELTA-LEFT: = nextpair (P-KIRI, n / 2) ;
DELTA-RIGHT: = nextpair (P-RIGHT, n / 2
);
DELTA: = minimum (DELTA-LEFT, DELTA-RIGHT
);
-
*********************************************
Tentukan apakah ada titik p (l) di
P-KIRI dan p (r) di P-RIGHT dengan
jarak (p (l), p (r)) <DELTA . Jika ada
adalah poin seperti itu, atur DELTA menjadi
terkecil
jarak.
-
**********************************************
kembali DELTA ;
akhir jika ;
akhir terdekat_pair ;
Bagian antara dua baris komentar adalah tahap `kombinasi 'dari
Algoritma Divide-and-Conquer.
Jika ada titik p (l) dan p (r) yang jaraknya jauh lebih kecil dari DELTA
pasti begitu
Halaman 9
Tahap gabungan dapat diimplementasikan dengan:
Halaman 10
Contoh 3
Perkalian Integer
Divide-and-Conquer juga bisa diterapkan pada masalah selain itu
melibatkan pencarian Masalah berikut harus familiar:
The (2n) representasi desimal -digit produk x * y.
Catatan: Algoritma di bawah ini bekerja untuk setiap bilangan basis, misalnya
biner, desimal,
heksadesimal, dll. Kami menggunakan desimal hanya untuk kenyamanan.
Algoritma sekolah dasar klasik untuk perkalian membutuhkan O (n ^ 2)
Langkah untuk mengalikan dua nomor n -digit.
Sebuah langkah dianggap sebagai operasi tunggal yang melibatkan
dua digit angka tunggal ,
misalnya 5 + 6 , 3 * 4 , dll.
Pada tahun 1962, AA Karatsuba menemukan algoritma asimtotik lebih cepat untuk
mengalikan dua angka dengan menggunakan pendekatan membagi-dan-
menaklukkan.
Halaman 11
Halaman 12
Dari sini kita juga tahu bahwa hasil perkalian x dan y (yaitu z ) adalah
Halaman 13
Istilah (a * c) , (a * d) , (b * c) , dan (b * d) adalah setiap produk dari
2 (n / 2) -digit nomor.
Jadi ungkapan untuk perkalian x dan y dalam hal angka
a , b , c , dan d mengatakan bahwa:
Jika n> 1 maka produk dari 2 n -digit nomor dapat dinyatakan dalam
syarat 4 produk dari 2 (n / 2) -digit nomor (Divide-and-Conquer
tahap)
Halaman 14
fungsi Karatsuba
( xunder , yunder : n-digit
bilangan bulat ;
n : bilangan bulat )
kembali
(2n) -digit
bilangan bulat adalah
a , b , c , d : (n / 2) -digit integer
U , V , W : bilangan bulat n-digit ;
mulai
jika n = 1 maka
kembali x (0) * y (0) ;
lain
a: = x (n-1) ... x (n / 2) ;
b: = x (n / 2-1) ... x (0) ;
c: = y (n-1) ... y (n / 2) ;
d: = y (n / 2-1) ... y (0) ;
U: = Karatsuba (a, c, n / 2) ;
V: = Karatsuba (b, d, n / 2) ;
W: = Karatsuba (a + b, c + d, n / 2) ;
kembalikan U * 10 ^ n + (WUV) * 10 ^ n / 2 + V ;
akhir jika ;
akhiri Karatsuba ;
Analisis Kinerja
Halaman 15
Telah diamati sebelumnya bahwa satu alasan untuk memeriksa paradigma
algoritmik
adalah fakta bahwa waktu berjalan mereka seringkali bisa ditentukan dengan tepat.
Hal ini berguna dalam memungkinkan perbandingan antara pertunjukan dua
algoritma yang akan dibuat
Untuk algoritma Divide-and-Conquer, waktu berjalan terutama dipengaruhi oleh 3
kriteria:
Jumlah langkah yang diperlukan untuk membagi contoh awal dan untuk
menggabungkan sub-solusi, dinyatakan sebagai fungsi dari ukuran input, n .
Misalkan, P , adalah algoritma divide-and-conquer yang menginstall alpha sub-
Contoh, masing-masing ukuran n / beta .
Misalkan Tp (n) menunjukkan jumlah langkah yang diambil oleh P pada contoh
ukuran n .
Kemudian
Tp (n0) = Konstan (basis rekursif)
Tp (n) = alpha Tp (n / beta) + gamma (n)
Dalam kasus ketika alpha dan beta sama-sama konstan (seperti pada semua contoh
kita
telah diberikan) ada metode umum yang bisa digunakan untuk mengatasinya
relasi rekuren agar mendapatkan arus asimtotik untuk berlari
waktu Tp (n) .
Secara umum:
T (n) = alpha T (n / beta) + O (n ^ gamma)
(dimana gamma konstan) memiliki solusinya
O (n ^ gamma)
jika alpha <
beta ^ gamma
T (n) = O (n ^ gamma log n)
jika alpha =
beta ^ gamma}
O (n ^ {log ^ -beta (alfa)) jika alpha>
beta ^ gamma