DAA VI – Decrease and Conquer

advertisement
Design and Analysis of Algorithm
Decrease and Conquer Algorithm
Aryo Pinandito, ST, M.MT – PTIIK Universitas Brawijaya
Decrease and Conquer

Mengurangi permasalahan menjadi lebih kecil pada
permasalahan yang sama

Selesaikan permasalahan yang lebih kecil tersebut

Kembangkan permasalahan yang lebih kecil itu
sehingga menyelesaikan permasalahan sebenarnya

Dapat dilakukan dengan dengan metode top down
atau bottom up
Variasi decrease and conquer

Mengurangi dengan sebuah constant (Decrease by a
constant)

Ukuran dari masalah dikurangi dengan faktor
konstanta yang sama – biasanya dikurangi sebanyak
dua pada setiap iterasi

Pola pengurangan ukuran masalah
bervariasi/berbeda antara iterasi satu dengan yang
lainnya
Decrease and Conquer

Decrease by a constant (usually by 1):





Decrease by a constant factor (usually by half)




binary search and bisection method
exponentiation by squaring
multiplication à la russe
Variable-size decrease




insertion sort
graph traversal algorithms (DFS and BFS)
topological sorting
algorithms for generating permutations, subsets
Euclid's algorithm
Selection by partition
Nim-like games
Biasanya menggunakan algoritma rekursif.
Permasalahan Eksponensial

Permasalahan: Hitung xn

Brute Force:

Divide and conquer:

Decrease by one:

Decrease by constant factor:
n-1 multiplications
T(n) = 2 * T(n/2) + 1
= n-1
T(n) = T(n-1) + 1 = n-1
T(n) = T(n/a) + a-1
= (a-1) loga n
= log2 n when a = 2
Sorting in Decrease and Conquer
Insertion Sort, Selection Sort
Insertion Sort
procedure InsertionSort(input/output A : TabelInt,
input i, j : integer)
{ Mengurutkan tabel A[i..j] dengan algoritma Insertion Sort.
Masukan: Tabel A dengan n elemen
Keluaran: Tabel A yang terurut
}
Deklarasi:
k : integer
Algoritma:
if i < j then
{ Ukuran(A)> 1}
k¬i
InsertionSort(A, i, k)
InsertionSort(A, k+1, j)
Merge(A, i, k, j)
endif
Insertion Sort dengan Divide and Conquer
procedure InsertionSort(input/output A : TabelInt,
input i, j : integer)
{ Mengurutkan tabel A[i..j] dengan algoritma Insertion Sort.
Masukan: Tabel A dengan n elemen
Keluaran: Tabel A yang terurut
}
Deklarasi:
k : integer
Algoritma:
if i < j then
k¬i
Insertion(A, k+1, j)
Merge(A, i, k, j)
endif
{ Ukuran(A)> 1}
Prosedur Merge dapat diganti dengan prosedur penyisipan sebuah elemen
pada tabel yang sudah terurut (lihat algoritma Insertion Sort versi iteratif).
Divide, Conquer, and Solve
Misalkan tabel A berisi elemen-elemen berikut:
4
12 23 9
21 1
5
2
DIVIDE, CONQUER, dan SOLVE::
4
12 3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
4
12
3
9
1
21
5
2
Merge
MERGE:
4
12
3
9
1
21
5
2
3
4
12
9
1
21
5
2
3
4
9
12
1
21
5
2
1
3
4
9
12
21
5
2
1
3
4
9
12
21
5
2
1
3
4
5
9
12
21
2
1
2
3
4
5
9
12
21
Kompleksitas Insertion Sort
ìï
a
, n =1
T (n) = í
ïî T(n -1) + cn , n >1
Penyelesaian:
T(n) = cn + T(n – 1)
= cn + { c × (n – 1) + T(n – 2) }
= cn + c(n – 1) + { c × (n – 2) + T(n – 3) }
= cn + c × (n – 1) + c × (n – 2) + {c(n – 3) + T(n – 4) }
= ...
= cn + c × (n – 1) + c(n – 2) + c(n – 3) + ... + c2 + T(1)
= c{ n + (n – 1) + (n – 2) + (n – 3) + ... + 2 } + a
= c{ (n – 1)(n + 2)/2 } + a
2
= cn /2 + cn/2 + (a – c )
= O(n2)
Selection Sort
procedure SelectionSort(input/output A : TabelInt, input i,j: integer)
{ Mengurutkan tabel A[i..j] dengan algoritma Selection Sort.
Masukan: Tabel A[i..j] yang sudah terdefinisi elemen-elemennya.
Keluaran: Tabel A[i..j] yang terurut menaik.
}
Algoritma:
if i < j then
{ Ukuran(A) > 1 }
Bagi(A, i, j)
SelectionSort(A, i+1, j)
endif
Pseudocode Selection Sort
procedure Bagi(input/output A : TabInt, input i,j: integer)
{ Mencari elemen terkecil di dalam tabel A[i..j],
dan menempatkan elemen terkecil sebagai elemen pertama tabel.
Masukan: A[i..j]
Keluaran: A[i..j] dengan Ai adalah elemen terkecil.
}
Deklarasi
idxmin, k, temp : integer
Algoritma:
idxmin¬i
for k¬i+1 to jdo
if Ak < Aidxmin then
idxmin¬k
endif
endfor
{ pertukarkan Ai dengan Aidxmin }
temp¬Ai
Ai¬Aidxmin
Aidxmin¬temp
Contoh Selection Sort
Kompleksitas Selection Sort
Searching
Depth-First Search (DFS)
Breadth-First Search (BFS)
Binary Search Tree (BST)
Depth-First Search (DFS)

Mengunjungi vertex-vertex pada grafik dengan selalu
bergerak dari vertex yang terakhir dikunjungi ke vertex
yang belum dikunjungi, lakukan backtrack apabila tidak
ada vertex tetangga yang belum dikunjungi.
Rekursif atau menggunakan stack




Vertex di-push ke stack ketika dicapai untuk pertama kalinya
Sebuah vertex di-pop off atau dilepas dari stack ketika vertex
tersebut merupakan vertex akhir (ketika tidak ada vertex
tetangga yang belum dikunjungi)
"Redraws" atau gambar ulang grafik dalam bentuk
seperti pohon (dengan edges pohon dan back edges
untuk grafik tak berarah/undirected graph)
Pseudo code DFS
Example: DFS traversal of undirected graph
a
b
c
d
e
f
g
h
DFS traversal stack:
a
ab
abf
abfe
abf
ab
abg
abgc
abgcd
abgcdh
abgcd
…
DFS tree:
1
2
6
7
a
b
c
d
e
f
g
4
3
5
Red edges are tree edges
and black edges are back
edges.
h
8
1
2
4
3
5
6
7
8

DFS : 1, 2, 4, 8, 5, 6, 3, 7
1
2
4
3
5
6
7
8

DFS : 1, 2, 3, 6, 8, 4, 5, 7
1
2
5
8
3
6
4
7
9

DFS : 1, 2, 5, 8, 9, 6, 3, 7, 4
Notes on DFS



Time complexity of DFS is O(|V|). Why?
each edge (u, v) is explored exactly once,
All steps are constant time.
Breadth-first search (BFS)

Mengunjungi vertex-vertex grafik dengan berpindah
ke semua vertex tetangga dari vertex yang terakhir
dikunjungi

BFS menggunakan queue

Mirip dengan level ke level dari pohon merentang

"Redraws" atau gambar ulang grafik dalam bentuk
seperti pohon (dengan edges pohon dan back edges
untuk grafik tak berarah/undirected graph)
Example of BFS traversal of undirected graph
a
b
c
d
e
f
g
h
BFS traversal queue:
a
bef
efg
fg
g
ch
hd
d
BFS tree:
1
2
6
8
a
b
c
d
e
f
g
h
3
4
5
7
Red edges are tree edges and
black edges are cross edges.
Pseudo code BFS
Notes on BFS



Asumsi: setiap simpul dapat membangkitkan b buah
simpul baru.
Misalkan solusi ditemukan pada aras ke-d
Jumlah maksimum seluruh simpul:
1+b+b2 +b3 +...+bd =(bd+1 –1)/(b–1)
T(n) = O(bd)

Kompleksitas ruang algoritma BFS = sama dengan
kompleksitas waktunya, karena semua simpul daun
dari pohon harus disimpan di dalam memori selama
proses pencarian.
Breadth First Search (grafik berarah)
2
s
5
3
28
4
8
7
6
9
Breadth First Search
1
Shortest path
from s
0
2
s
4
5
3
7
6
Undiscovered
Discovered
Top of queue
29
Finished
8
Queue: s
9
Breadth First Search
1
2
0
s
4
5
3
7
6
1
Undiscovered
Discovered
Top of queue
30
Finished
8
Queue: s 2
9
Breadth First Search
1
2
0
4
5
s
8
7
1
3
6
1
Undiscovered
Discovered
Top of queue
31
Finished
Queue: s 2 3
9
Breadth First Search
1
2
0
4
s
5
8
7
1
3
6
1
Undiscovered
Discovered
Top of queue
32
Finished
Queue: 2 3 5
9
Breadth First Search
1
2
0
2
4
s
5
8
7
1
3
6
1
Undiscovered
Discovered
Top of queue
33
Finished
Queue: 2 3 5
9
Breadth First Search
1
2
0
2
4
s
5 already discovered:
7
don't enqueue
5
1
3
8
6
1
Undiscovered
Discovered
Top of queue
34
Finished
Queue: 2 3 5 4
9
Breadth First Search
1
2
0
2
4
s
5
8
7
1
3
6
1
Undiscovered
Discovered
Top of queue
35
Finished
Queue: 2 3 5 4
9
Breadth First Search
1
2
0
2
4
s
5
8
7
1
3
6
1
Undiscovered
Discovered
Top of queue
36
Finished
Queue: 3 5 4
9
Breadth First Search
1
2
2
0
4
s
5
8
7
1
6
3
1
2
Undiscovered
Discovered
Top of queue
37
Finished
Queue: 3 5 4
9
Breadth First Search
1
2
2
0
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
38
Finished
Queue: 3 5 4 6
9
Breadth First Search
1
2
2
0
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
39
Finished
Queue: 5 4 6
9
Breadth First Search
1
2
2
0
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
40
Finished
Queue: 5 4 6
9
Breadth First Search
1
2
2
0
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
41
Finished
Queue: 4 6
9
Breadth First Search
1
2
2
0
3
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
42
Finished
Queue: 4 6
9
Breadth First Search
1
2
2
0
3
4
s
5
8
7
1
3
1
6
2
Undiscovered
Discovered
Top of queue
43
Finished
Queue: 4 6 8
9
Breadth First Search
1
2
2
0
3
4
s
7
5
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
44
8
Finished
Queue: 6 8
9
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
45
8
Finished
Queue: 6 8 7
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
46
8
Finished
Queue: 6 8 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
47
8
Finished
Queue: 8 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
48
8
Finished
Queue: 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
49
8
Finished
Queue: 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
50
8
Finished
Queue: 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
51
8
Finished
Queue: 7 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
52
8
Finished
Queue: 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
53
8
Finished
Queue: 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
54
8
Finished
Queue: 9
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Undiscovered
Discovered
Top of queue
55
8
Finished
Queue:
9
3
Breadth First Search
1
2
2
0
3
4
s
5
7
1
3
3
1
6
2
Level Graph
56
8
9
3
1
2
4
3
5
6
8

BFS : 1, 2, 3, 4, 5, 6, 7, 8
7
1
2
4
3
5
6
8

BFS : 1, 2, 3, 4, 5, 6, 7, 8
7
1
2
5
8

3
6
7
9
BFS : 1, 2, 3, 4, 5, 6, 7, 8, 9
4

Latihan: Gunakan algoritma BFS dan DFS untuk
menemukan pohon merentang (spanning tree) dari
graf G di bawah ini jika traversalnya dimulai dari
simpul e. Dalam menjawab soal ini, perlihatkan
traversal BFS/DFS sebagai pohon berakar dengan e
sebagai akarnya.
Binary Search Tree




Several algorithms on BST requires recursive
processing of just one of its subtrees, e.g.,
Searching
Insertion of a new key
Finding the smallest (or the largest) key
<k
k
>k
Binary Search Tree
A binary search tree
Not a binary search tree
Searching (Find)

Find X: return a pointer to the node that has key X,
or NULL if there is no such node
BinaryNode * BinarySearchTree::Find(const float &x, BinaryNode *t) const
{
if (t == NULL)
return NULL;
else if (x < t->element)
return Find(x, t->left);
else if (t->element < x)
return Find(x, t->right);
else
return t;
// match
}

Time complexity: O(height of the tree)
Algoritma BST

Algorithm BST(x, v)
// Searches for node with key equal to v
// in BST rooted at node x
if x = NIL return -1
else if v = K(x) return x
else if v < K(x) return BST(left(x), v)
else return BST(right(x), v)

Efficiency
worst case: C(n) = n
average case: C(n) ≈ 2ln n ≈ 1.39log2 n
if the BST was built from n random keys
and v is chosen randomly.
Aplikasi DFS dan BFS


Search Engine (Google, Yahoo!).
Komponen search engine:
1.
2.
3.


Web Spider : program penjelajah web (web surfer)
Index: database yang menyimpan kata-kata penting pada
setiap halaman web
Query: pencarian berdasarkan string yang dimasukkan oleh
pengguna (end-user)
Secara periodik (setiap jam atau setiap hari), spider
menjejalahi internet untuk mengunjungi halamanhalaman web, mengambil kata-kata penting di dalam
web, dan menyimpannya di dalam index.
Query dilakukan terhadap index, bukan terhadap
website yang aktual.
Search Engine Google
Hasil Pencarian Search Engine Google
Bagaimana Spider Menjelajahi Web?




Halaman web dimodelkan sebagai graf berarah
Simpul menyatakan halaman web (web page)
Sisi menyatakan link ke halaman web
Bagaimana teknik menjelajahi web? Secara DFS atau
BFS


Dimulai dari web page awal, lalu setiap link ditelusuri
secara DFS sampai setiap web page tidak mengandung
link.
Pada setiap halaman web yang ditemukan, informasi di
dalamnya dianalisis dan disimpan di dalam database
index.
Perbedaan BSF dan DSF
BSF



Mengunjungi vertex-vertex
grafik dengan berpindah ke
semua vertex tetangga dari
vertex yang terakhir dikunjungi
BFS menggunakan queue
Mirip dengan level ke level
dari pohon merentang
DSF
 Mengunjungi vertex-vertex
pada grafik dengan selalu
bergerak dari vertex yang
terakhir dikunjungi ke vertex
yang belum dikunjungi.
Lakukan backtrack apabila
tidak ada vertex tetangga yang
belum dikunjungi.
 Rekursif stack


Vertex di-push ke stack
ketika dicapai untuk
pertama kalinya
Vertex di-pop off dari stack
ketika vertex tersebut
merupakan vertex akhir
(tidak ada vertex tetangga
yang belum dikunjungi)
Questions?
감사합니 Grazias Kiitos
다Danke Gratias
‫ﺷﻜﺮﺍ‬
Terima Kasih 谢谢
Merci
धन्यवाद
Thank You
ありがとうございます
Download