04-Mar-04 IKI10100 - PM 1
Recursion Properties
z
base case, problem paling sederhana yang memproses input tanpa perlu recursive lagi.
z
recursive case:
1. membagi problem menjadi bagian yang lebih kecil.
2. memanggil fungsi secara recursive untuk setiap bagian
3. menggabungkan solusi tiap bagian ke menjadi solusi dari problem utama.
04-Mar-04 IKI10100 - PM 2
Factorial :
static public int factorial( int n) { // return n!
if( n <= 1) // base case return 1;
else
return n * factorial(n-1);
}
04-Mar-04 IKI10100 - PM 3
Recursive version
Case 1: Max sum dihasilkan oleh elemen di paruh pertama Case 2: Max sum dihasilkan oleh elemen di paruh kedua Case 3: Max sum dihasilkan oleh elemen awal di paruh
pertama dan berakhir di paruh kedua
Pilih dari ketiganya yang menghasilkan nilai terbesar.
MaxSubseqSum
Case 1 Case 2
Case 3
04-Mar-04 IKI10100 - PM 4
Recursive version
public int maxSubSum (int[ ] a) { return maxSumRec(a, 0, a.length-1);
}
private int maxSumRec(int[ ] a, int left, int right) { int center = (left+right)/2;
if(left == right)
return a[left] > 0 ? a[left] : 0;
int maxLeftSum = maxSumRec(a, left, center);
int maxRightSum = maxSumRec(a, center+1, right);
….
MaxSubseqSum
cari index tengah base case
cari max di paruh kiri
cari max di paruh kanan
04-Mar-04 IKI10100 - PM 5
Recursive Version
for(int i=center; i>=left; i--) { leftBorderSum += a[i];
if(leftBorderSum > maxLeftBorderSum) maxLeftBorderSum = leftBorderSum;
}
for(int j=center+1; j<=right; j++) { rightBorderSum += a[j];
if(rightBorderSum > maxRightBorderSum) maxRightBorderSum = rightBorderSum;
}
return max3(maxLeftSum, maxRightSum,
maxLeftBorderSum + maxRightBoderSum);
}
MaxSubseqSum
pilih max dari ketiga kemungkinan cari max jumlah dari tengah ke kiri
cari max jumlah dari tengah ke kanan
04-Mar-04 IKI10100 - PM 6
Recursive Version
4 -3 5 -2 -1 2 6 -2
First Half Second Half
-1 1 7 5 4 0 3 -2
maxSeqSum
Running Time
N N N N O (N log N)
Recursive Call
Binary Search
low high
mid int binsearch(data[ ], n, low, high) {
mid = data.length() / 2;
if( data[mid] == n ) return mid;
else if ( n < data[mid] ) return binsearch(data[ ], n, low, mid );
else return binsearch( data[ ], n, mid+1, high);
04-Mar-04 IKI10100 - PM 9
Running Time of BinarySearch
O (log N)
04-Mar-04 IKI10100 - PM 10
Tower of Hanoi (Lucas, 1883)
z
Pindahkan tumpukan disc dari source ke dest dengan bantuan auxiliary
z
Tumpukan disc harus mengecil ke atas.
source auxiliary destination
04-Mar-04 IKI10100 - PM 11
Recursive Solution (N discs)
Tower of Hanoi
1. Move the top N-1 disks from Src to Aux (using Dst as an intermediary peg)
2. Move the bottom disks from Src to Dst
3. Move N-1 disks from Aux to Dst (using Src as an intermediary peg)
Solve(N, Src, Aux, Dst) if N is 0 exit
Solve(N-1, Src, Dst, Aux) Move from Src to Dst Solve(N-1, Aux, Src, Dst)
04-Mar-04 IKI10100 - PM 12
Change-making Problem:
z Dengan coin yang tersedia C 1 ,
C 2 , .., C N (cents) tentukan jumlah
minimum coin yang diperlukan
untuk “kembalian” sejumlah K
cents.
04-Mar-04 IKI10100 - PM 13
Greedy Algorithm
z Dengan divide-and-conquer, hasilkan penyelesaian terbaik untuk setiap sub-problem tanpa
memperhitungkan hasil akhir.
z Dengan coin: 1, 5, 10, 21 dan 25 cent, kembalian 63 cent: 25, 25, 10, 1, 1, 1.
04-Mar-04 IKI10100 - PM 14
Inefficient makeChange
int makeChange (int[] coins, int change, int differentCoins) { int minCoins = change;
for (int i=0; i<differentCoins; i++) if (coins[i] == change) return 1;
for (int j=1; j<=change/2; j++) {
int thisCoins = makeChange(coins, j, differentCoins) + makeChange(coins, change-j, differentCoins);
if(thisCoins < minCoins) minCoins = thisCoins }
return minCoins;
}
max # of coins
ada coin yg = change
Brute-Force Recursive Version
Coin = 1, 5, 7 Change = 10
minCoin(10)
1+minCoin(9)
5+minCoin(5)
7+minCoin(3)
1+minCoin(8) 5+minCoin(4) 7+minCoin(2) 1+minCoin(4) 5+minCoin(0) X
1+minCoin(2) X
X
Dynamic Programming
z Hasil perhitungan disimpan dalam
cache untuk kemudian dipakai lagi
untuk permasalah yang sama.
04-Mar-04 IKI10100 - PM 17
Result Caching
z
Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel.
Kembalian Jml Coin
1 1
2 2
. .
5 1
6 2
. .
10 1
11 2
23 3
63 3
Dynamic Programming
04-Mar-04 IKI10100 - PM 18
for loop Version
coinUsed[0]=0; lastCoin[0]=1;
for(int cents = 1; cents <= change; cents++) { int minCoins = cents; int newCoin = 1;
for(int j = 0; j < diffCoins; j++) {
if(coins[ j ] > cents) continue; // can’t use coin j if(coinUsed[ cents - coins[ j ] ] + 1 < minCoins) {
minCoins = coinUsed[ cents-coins[ j ] ] + 1;
newCoin = coins[ j ];
} }
coinUsed[ cents ]=minCoins; lastCoin[ cents ]=newCoin;
}
j = index coin Pelajari algoritma ini dan ubah ke bentuk recursive!
04-Mar-04 IKI10100 - PM 19
Reporting Coin List
for (int i = change; i > 0; ) {
System.out.print( lastCoin[ i ] + “ “);
i -= lastCoin[ i ];
}
System.out.println( );
04-Mar-04 IKI10100 - PM 20
Result Caching
z
Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel .
Kembalian Jml Coin
0 0
1 1
. .
5 1
… .
12 1
25 1
… .
37 2
38 3
Kembalian Last Coin
0 0
1 1
… .
5 5
… .
12 12
25 25
… .
37 12
38 1
coinUsed[ ] lastCoin[ ] Change(38)