- Metode Greedy
Contoh 1 (Masalah Penukaran uang):
Persoalan: Diberikan uang senilai A. Tukar A dengan koin-koin uang yang ada. Berapa jumlah minimum koin yang diperlukan untuk penukaran tersebut?
Contoh: tersedia koin-koin 1, 5, 10, dan 25
Uang senilai 57 dapat ditukar dengan cara berikut
57 = 1 + 1 + … + 1 (57 koin)
57 = 1 + 1 + … + 1 (57 koin)
57 = 5 + 5 + 5 + 10 + 10 + 10 + 10 + 1 + 1 (9 koin)
57 = 10 + 10 + 10 + 10 + 10 + 5 + 1 + 1 (8 koin)
57 = 10 + 10 + 10 + 10 + 10 + 5 + 1 + 1 (8 koin)
… dan seterusnya
Minimum: 57 = 25 + 25 + 5 + 1 + 1 hanya 5 koin
Strategi greedy yang digunakan adalah:
Pada
setiap langkah, pilihlah koin dengan nilai sebesar mungkin dari
himpunan koin yang tersisa dengan syarat (kendala) tidak melebihi nilai
uang yang ditukarkan.
Tinjau masalah menukarkan uang 57 dengan koin 1, 5, 10, dan 25:
Langkah 1: pilih 2 buah koin 25 (Total = 50)
Langkah 2: pilih 1 buah koin 5 (Total = 50 + 5 = 55)
Langkah 3: pilih 2 buah koin 1 (Total = 25+25++5+1+1= 57)
Solusi: Jumlah koin minimum = 5 (solusi optimal!)
Pada
setiap langkah di atas kita memperoleh optimum lokal, dan pada akhir
algoritma kita memperoleh optimum global (yang pada contoh ini merupakan
solusi optimum).Divide and Conquer
Komputer pada awalnya diciptakan sebagai perangkat untuk melakukan kalkulasi secara otomatis dan akurat. Meskipun awalnya hanya berfokus pada kalkukasi numerik, komputer modern yang dijumpai sekarang telah melakukan kalkulasi pada banyak hal, seperti teks ataupun gambar. Berbagai kalkulasi dan analisa yang dilakukan komputer biasanya diimplementasikan melalui perangkat lunak. Dengan semakin besarnya ruang lingkup hal-hal yang dilakukan oleh komputer, perangkat lunak yang dikembangkan juga menjadi semakin kompleks. Algoritma, sebagai bagian dari perangkat lunak yang melakukan pemrosesan, juga memerlukan berbagai teknik baru. Misalkan, untuk menghitung total jumlah dari bilangan-bilangan yang ada di dalam sebuah list, kita dapat menggunakan perulangan sederhana:nums = [1, 2, 3, 5, 6, 7, 19, 28, 58, 18, 28, 67, 13]
total = 0
for i in range(0, len(nums)):
total = total + nums[i]
print(total) # 255
total tergantung kepada kalkulasi nilai total
sebelumnya. Kita tidak dapat melakukan perhitungan total dari depan dan
belakang list sekaligus, sehingga kita dapat mempercepat perhitungan
dua kali lipat. Dengan kode di atas, kita tidak dapat membagi-bagikan
pekerjaan ke banyak pekerja / CPU!Lalu apa yang dapat kita lakukan? Langkah pertama yang dapat kita lakukan adalah menerapkan teknik rekursif untuk membagi-bagikan masalah menjadi masalah yang lebih kecil. Jika awalnya kita harus menghitung total keseluruhan list satu per satu, sekarang kita dapat melakukan perhitungan dengan memecah-mecah list terlebih dahulu:
def sums(lst):
if len(lst) >= 1:
return lst[0]
mid = len(lst) // 2
left = sums(lst[:mid])
right = sums(lst[mid:])
return left + right
print(sums(nums)) # 255
- Baris
if len(lst) >= 1memberikan syarat pemberhentian fungsi rekursif, yang akan mengembalikan isi dari list ketika list berukuran 1 (hanya memiliki satu elemen). - Baris
mid = len(lst) // 2mengambil median dari list, sebagai referensi ketika kita membagi list menjadi dua bagian. - Baris
left = sum(lst[:mid])dan selanjutnya membagikan list menjadi dua bagian, dengan nilaimidsebagai tengah dari list.
Langkah Kerja Divide and Conquer
left = ... dan right = ...) ke satu unit kerja baru, yang dikenal dengan nama thread. Mekanisme pada sistem operasi atau compiler
kemudian akan membagi-bagikan tugas pembagian dan perhitungan lanjutan
agar dapat dijalankan secara paralel, misalnya dengan membagikan tugas
ke dalam beberapa core prosesor, atau bahkan ke dalam mesin lain (jika terdapat sistem dengan banyak mesin).Dengan membagi-bagikan pekerjaan ke dalam banyak unit, tentunya pekerjaan akan lebih cepat selesai! Teknik memecah-mecah pekerjaan untuk kemudian dibagikan kepada banyak pekerja ini dikenal dengan nama divide and conquer.
sumber :
bertzzie.com
google.com
Nama : Fadhly Muharram
NPM : 53414754
Kelas: 1IA24
Comments
Post a Comment