Merge Sort Lestari Irfandi Amir H12111281
-
Upload
fandi-amir -
Category
Documents
-
view
103 -
download
0
Transcript of Merge Sort Lestari Irfandi Amir H12111281
TUGAS
ALGORITMA DAN STRUKTUR DATA
“Merge Sort“ “Metode Penyelesaian Rekurensi “
OLEH:
LESTARI IRFANDI AMIRH12111281STATISTIKA
JURUSAN MATEMATIKAFAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNVERSITAS HASANUDDIN2012
Merge Sort
Merge Sort adalah algoritma yang berdasarkan strategi divide-and-conquer. Algoritma ini
tediri dari dua bagian utama, yaitu bagian pembagian list menjadi sublist-sublist yang lebih kecil
dan bagian sort (pengurutan) dan merge (penggabungan) pada sublist-sublist tersebut.
Divide: membagi masalah menjadi beberapa submasalah yang memiliki kemiripan dengan
masalah semula namun berukuran lebih kecil (idealnya berukuran hampir sama),
Conquer: memecahkan (menyelesaikan) masing-masing submasalah (secara rekursif), dan
Combine: mengabungkan solusi masing-masing submasalah sehingga membentuk solusi
masalah semula.
Contoh:
Misalkan diberikan rangkaian data: 9,8,5,3,6,7,5,8,2,6,1,4
Divide
Divide
Divide
Conquer
9 8 5 3 6 7 5 8 2 6 1 4
9 8 5 3 6 7 5 8 2 6 1 4
9 8 5 3 6 7 5 8 2 6 1 4
9 8 5 3 6 7 5 8 2 6 1 4
Combine
Combine
Sebagai catatan, pengkombinasian dilakukan dengan cara pembandingan. Elemen yang nilainya lebih kecil akan masuk ke kotak terlebih dahulu dan mengisi bagian disebelah kiri terlebih dahulu.Pada merge sort, data yang akan digabungkan berada pada suatu array, sebutlah array x dan array yang digunakan untuk menampung hasil gabung adalah array yang berbeda dari array x tersebut, sebutlah array y. Penyalinan elemen data dari array x ke array y ditentukan oleh hasil perbandingan data kelompok pertama x(i) dan data kelompok setelahnya x(j). Apabila nilai x(i) lebih kecil dibanding x(j) maka x(i) disalin ke y(k) kemudian indeks I dan k masing – masing ditambah satu. Proses ini akan berulang sampai seluruh data habis diproses.
Berikut adalah source code dari merge sort :
void mergesort (int *x, int n)
{
int *r, i, j, k, l1, l2, u1, u2, size;
r = (int *) malloc (n * sizeof (int));
size = 1;
while (size < n)
{
l1 = 0; k = 0;
5 8 9 3 6 7 2 5 8 1 4 6
3 5 6 7 8 9 1 2 4 5 6 8
1 2 3 4 5 5 6 6 7 8 8 9
while (l1+size < n)
{
l2 = l1+size;
u1 = l2 – 1;
u2 = (l2 + size – 1 < n) ? l2 + size – 1 : n-1;
for (i=l1; j=l2; i<=u1 && j<=u2; k++)
r[k] = (x[i] <= x[j]) ? x[i++] : x[j++];
while (i<=u1) r[k++] = x[i++];
while (j<=u2) r[k++] = x[j++];
l1 = u2+1;
}
for(i=l1; k<n; i++) r[k++] = x[i];
for(i=0; i<n; i++) x[i] = r[i];
size *= 2;
}
Metode Penyelesaian Rekurensi
Relasi Recurrence untuk barisan {an} adalah persamaan yang menyatakan an dalam satu atau
lebih bentuk a0, a1, …, an-1 untuk semua n dengan n ³ n0 dimana n0 bilangan bulat non-negatif.
Barisan {an} tersebut dikatakan sebagai solusi dari relasi recurrence ini bila an memenuhi relasi
recurrence. Dalam menyelesaikan rekurensi, terbagi atas 3 metode:
1. Metode Subtitusi
Metode dengan cara membuat tebakan terhadap solusinya, kemudian tebakan tersebut
dibuktikan dengan induksi matematika. Contoh :
Metode substitusi
Diketahui :
Buktikan bahwa :
Buat tebakan T(n) = O(√n),
Berarti T(n) ≤ c√n
2. Metode (pohon) Rekursif
Metode dengan cara mengubah bentuk rekursif menjadi bentuk penjumlahan, kemudian
diselesaikan.
Contoh 1: T(n) = 3T([n/4])+ n
Bila bentuk rekursif diuraikan:
T(n) = n + 3T([n/4]) = n + 3([n/4]) + 3T(n/4[/4]))
= n + 3([n/4]+ 3([n/16]+ 3T(n/64)))
= n + 3n/4+ 9n/16+ 27T(n/64)
Suku ke-i berbentuk 3in/4i. Oleh karena n berkurang sebesar 4 pada setiap iterasi, maka
proses berlangsung sampai log4 N langkah
T(n) ≤ n + 3n/4 + 9n/16 + 27n/64 + . . .+ 3log4N N / N
T (1 )=1
T (n )=T (n
2 )+√n
T (n )=O (√n )
Contoh 2:
Tn = n + T(n)
T(n) = n+2T(n/2)= n log2n, nilai n = (n/2)
n n
n/2 n/2 n
n/4 n/4 n/4 n/4 n
_
nk
n
log2n
3. Metode master
Metode ini digunakan untuk menyelesaikan persamaan rekursif dalam bentuk :
Metode master menyediakan semacam “cookbook” untuk menyelesaikan persamaan
rekursif dalam bentuk:
dengan a ≥ 1 dan b > 1 adalahkonstantadan f(n) adalahfungsi yang secara asimtotik
positif.
Dalam metode master perlu diingat 3 kasus, namun sesudahnya bentuk-bentuk rekursif
dapat diselesaikan dengan lebih mudah, yaitu:
Kasus I:
dhi, f(n) secara polynomial lebih kecil dari nlog ba dengan faktor nε, sehingga
nlogba mendominasi
T(n) = aT(n/b) + f(n)
T(n) = aT(n/b) + f(n)
T(n) = aT(n/b) + f(n) a ≥ 1 , b > 1
Jika f(n) = O(nlogb(a-ε)), ε > 0
Maka T(n) = Θ(nlogba)
Kasus II:
dhi, cost setiap langkah adalah nlogb
a sehingga, padahal ada sebanyak log n
langkah, jadi T(n) = Θ(nlogb
alog n)
Kasus III:
dhi, f(n) >nlogba dengan factor polynomial sehingga suku dominan adalah
f(n) + f(n/b) + f(n/b2)… O(f(n))
Contoh:
Gunakan metode Master untuk menentukan:
T(n) = Θ(?) bila : T(n) = 7T(n/2) + n2
Solusi:
a = 7, b = 2, f(n) = n2, nlog27 = n2.803..
n2 = O(nlog27 - ε), oleh karena
n2 ≤ cn2.803..- ε ε, c > 0
T(n) = Θ(nlog27)
T(n) = aT(n/b) + f(n) a ≥ 1 , b > 1
Jika f(n) = Θ(nlogb
a)
maka T(n) = Θ(nlogb
alog n)
T(n) = aT(n/b) + f(n) a ≥ 1 , b > 1
Jika f(n) = Ω(nlogb
(a+ε)), ε > 0 dan a f(n/b) ≤ c f(n) untuk c < 1
maka T(n) = Θ(f(n))