T16 17-Graph

Download Report

Transcript T16 17-Graph

Algoritma dan Struktur Data
GRAPH
Teknik Informatika
Universitas Muhammadiyah Malang
2011
Tujuan Instruksional
• Mampu memahami konsep struktur data
graph
• Mampu memahami representasi graph
• Mampu memahami teknik penelusuran pada
graph
• Mampu mengimplementasikan graph kedalam
pemrograman.
Topik
•
•
•
•
•
•
Definisi Graph
Contoh graph
Jenis graph
Representasi graph
Graph traversal
Implementasi graph
Definisi
• Graph adalah struktur data yang memiliki
relasi many to many, yaitu tiap element dapat
memiliki 0 atau lebih dari 1 cabang.
• Graph terbentuk dari 2 bagian, yaitu node dan
edge.
• Node : digunakan untuk menyimpan data
• Edge : cabang, untuk menghubungkan node
satu dengan node lain.
Contoh Graph
• Jaringan pertemanan pada Facebook.
Nina
Firda
Riza
Toni
Joko
Ale
Graph dengan 6 node dan 7 edge yang merepresentasikan
jaringan pertemanan pada Facebook
Penjabaran
• Jika => G = (N,E)
• Dimana : G adalah Graph, N adalah Node, dan E
adalah Edge.
• Sehingga dari contoh graph facebook tersebut dapat
dijabarkan :
N = {Nina, Toni, Ale, Riza, Joko, Firda}
E = {{Nina,Toni},{Toni,Riza},{Nina, Riza}, {Toni,Ale},
{Ale,Joko},{Riza,Joko},{Firda,Joko}}
*N: para anggota Facebook
E : pertemanan antara member satu dengan yang lain.
Jenis Graph
• Graph dibedakan menjadi beberapa jenis,
antara lain :
1. Undirected Graph
2. Directed Graph (Digraph)
3. Weigth Graph
Undirected Graph
•
•
•
•
Biasa disingkat : undi-graph.
Yaitu graph yang tidak memiliki arah.
Setiap sisi berlaku dua arah.
Misalkan : {x,y}
Arah bisa dari x ke y, atau y ke x.
• Secara grafis sisi pada undigraph tidak
memiliki mata panah dan secara notasional
menggunakan kurung kurawal.
U
V
{U,V} atau {V,U}
Gambar Undi-Graph
Notasional
G = {V, E}
V = {A, B, C, D, E, F, G, H, I,J, K, L, M}
E = { {A,B},{A,C}, {A,D}, {A,F}, {B,C}, {B,H},
{C,E}, {C,G}, {C,H}, {C,I}, {D,E},
{D,F}, {D,G}, {D,K}, {D,L}, {E,F}, {G,I},
{G,K}, {H,I}, {I,J}, {I,M}, {J,K},
{J,M}, {L,K}, {L,M}}.
Contoh Undi-Graph
2
3
1
4
5
6
7
Directed Graph
• Biasa disingkat : Di-graph.
• Yaitu graph yang memiliki arah.
• Setiap edge Digraph memiliki anak panah
yang mengarah ke node tertentu.
• Secara notasi sisi digraph ditulis sebagai vektor (u, v).
u = origin (vertex asal)
v = terminus (vertex tujuan)
u
v
Gambar Digraph
Notasional
G = {V, E}
V = {A, B, C, D, E, F, G, H, I,J, K, L, M}
E = {(A,B),(A,C), (A,D), (A,F), (B,C), (B,H),
(C,E), (C,G), (C,H), (C,I), (D,E),
(D,F), (D,G), (D,K), (D,L), (E,F), (G,I),
(G,K), (H,I), (I,J), (I,M), (J,K), (J,M),
(L,K), (L,M)}.
Contoh Digraph
2
3
1
4
5
6
7
Weigth Graph
• Graph yang memiliki bobot, yaitu pada tiap
edge-nya memiliki nilai.
Contoh Weigth Graph
A
2
E
2
D
2
4
5
B
4
F
C
Loop
• Digraph dapat memiliki edge dari dan menuju ke
node itu sendiri (Self-edge). Hal ini dikenal dengan
istilah loop.
1
3
2
4
6
Self-edge/loop
LEGAL
5
7
Contoh Penerapan Graph
Peta Penelusuran Kota
(Berdasarkan Jarak)
2
4
3
8
8
1
6
10
2
4
4
4
5
3
9
5
6
6
5
7
7
• Node = Tempat Wisata
• edge = jalur
• Weight = jarak
11
Peta kota
2
3
8
1
10
4
5
9
6
7
• Some streets are one way.
11
Graph Property
Property
•
•
•
•
•
Jumlah Edge
Degree
Jumlah Vertex Degree
In-Degree
Out-Degree
Jumlah Edge
• Jumlah pasangan edge yang mungkin (banyak
maksimal edge) dapat dilihat dari jumlah node
(n).
• Dibedakan menjadi 2 : untuk undi-graph dan
di-graph.
• Undi-graph : (lebih kecil sama dengan ) <= n(n-1)/2
• Di-graph : (lebih kecil sama dengan ) <= n(n-1)
• Dimana, n adalah jumlah node.
Contoh
• Undi-graph
jumlah maks edge : 3
n=3
• Di-graph
jumlah maks edge : 6
dengan loop : 9
n=3
Degree
• Degree : jumlah cabang atau jumlah edge
yang dimiliki node.
• Contoh undi-graph :
degree(2) = 2,
2
degree(5) = 3,
degree(3) = ???
degree(7) = ???
3
1
4
5
6
7
Contoh (Di-graph)
2
3
8
1
10
4
5
9
6
7
• Degree (4) =???
• Degree (7) = ???
11
Jumlah Degree
• Jumlah degree adalah jumlah total
cabang/degree yang ada pada graph.
• Rumus = 2e (dimana e adalah jumlah edge)
8
10
9
11
• Hanya berlaku untuk undi-graph!
In-Degree
Jumlah edge yang masuk atau mengarah ke Node.
2
3
1
4
5
6
7
indegree(2) = 1, indegree(7) = 2, indegree(1)=???
Out-Degree
Jumlah edge yang keluar dari Node.
2
3
1
4
5
6
7
outdegree(2) = 1, outdegree(7) = 0, outdegree(1) = ???
Representasi Graph
Representasi Graph
• Representasi graph dibedakan menjadi 2 :
1. Adjacency Matrix
dapat direpresentasikan dengan matriks
(array 2 Dimensi).
2. Adjacency Lists
dapat direpresentasikan dengan array (bukan
berupa matriks) maupun linked list.
Adjacency Matrix
• Representasi Graph berupa Matrik ordo nxn. dimana
n = node.
• Baris berisi Node asal, sedangkan kolom berisi Node
tujuan.
• Jika graph tidak berbobot,maka nilai matriks diisi
dengan 1 atau 0. nilai 1 jika ada edge, dan 0 jika tidak
ada edge antar node.
A(i,j) = 1, jika antara node i dan node j terdapat
edge/terhubung.
• Jika graph berbobot, maka nilai matriks diisi dengan
bobot dari edge. A(i,j) = nilai bobot.
Adjacency Matrix
2
3
1
4
5
1
2
3
4
5
1
0
1
0
1
0
2
1
0
0
0
1
3
0
0
0
0
1
4
1
0
0
0
1
5
0
1
1
1
0
Undi-graph
2
3
1
4
5
1
2
3
4
5
1
0
1
0
1
0
2
1
0
0
0
1
3
0
0
0
0
1
4
1
0
0
0
1
5
0
1
1
1
0
•Diagonal entries are zero.
•Adjacency matrix of an undirected graph is
symmetric.
A(i,j) = A(j,i) for all i and j.
Di-graph
2
3
1
4
5
1
2
3
4
5
1
0
0
0
1
0
2
1
0
0
0
1
3
0
0
0
0
0
4
0
0
0
0
1
5
0
1
1
0
0
• Dimungkinkan tidak simetris jika terdapat
loop.
Adjacency List
• Direpresentasikan dengan linked list atau
array.
– Array list : array dua dimensi namun tidak berordo nxn.
– Linked list : array of single linked list
Array Lists
2
3
1
aList[1] = (2,4)
aList[2] = (1,5)
4
5
aList[3] = (5)
aList[4] = (5,1)
aList[5] = (2,4,3)
Adjacency Lists (Linked List)
2
3
1
4
5
aList [1]
2
4
[2]
1
5
[3]
5
[4]
5
1
[5]
2
4
3
Latihan
1. Gambarkan graph dari
representasi Matrik berikut:
2. Representasikan dengan adjacency
list & adjacency matrix
A
2
E
2
D
2
4
5
B
4
1
F
C
3.
Representasikan dengan
adjacency list & adjacency matrix
Nina
Firda
Riza
Toni
Joko
Ale
Penelusuran Graph
Metode Penelusuran
• Graph Traversal : Mengunjungi tiap
simpul/node secara sistematik.
• Metode :
– DFS (Depth First Search) : Pencarian Mendalam
– BFS (Breadth First Search) : Pencarian Melebar
Algoritma BFS
• BFS diawali dengan vertex yang diberikan,
yang mana di level 0. Dalam stage pertama,
kita kunjungi semua vertex di level 1. Stage
kedua, kita kunjungi semua vertex di level 2.
Disini vertex baru, yang mana adjacent ke
vertex level 1, dan seterusnya. Penelusuran
BFS berakhir ketika setiap vertex selesai
ditemui.
Breadth First Search (BFS)
Urutan verteks hasil penelusuran :
Breadth First Search (BFS)
….
….
Algoritma BFS
• Traversal dimulai dari simpul v.
• Algoritma:
1. Kunjungi simpul v,
2. Kunjungi semua simpul yang bertetangga
dengan simpul v terlebih dahulu.
3. Kunjungi simpul yang belum dikunjungi dan
bertetangga dengan simpul-simpul yang tadi
dikunjungi, demikian seterusnya.
Depth First Search (DFS)
• Pada setiap pencabangan, penelusuran
verteks-verteks yang belum dikunjungi
dilakukan secara lengkap pada pencabangan
pertama, kemudian selengkapnya pada
pencabangan kedua, dan seterusnya secara
rekursif.
Depth First Search (DFS)
Urutan verteks hasil penelusuran :
Depth First Search (DFS)
….
….
Algoritma DFS
• Traversal dimulai dari simpul v.
• Algoritma:
1.
2.
3.
4.
Kunjungi simpul v,
Kunjungi simpul w yang bertetangga dengan simpul v.
Ulangi DFS mulai dari simpul w.
Ketika mencapai simpul u sedemikian sehingga semua
simpul yang bertetangga dengannya telah dikunjungi,
pencarian dirunut-balik (backtrack) ke simpul terakhir
yang dikunjungi sebelumnya dan mempunyai simpul w
yang belum dikunjungi.
5. Pencarian berakhir bila tidak ada lagi simpul yang belum
dikunjungi yang dapat dicapai dari simpul yang telah
dikunjungi.
Latihan
• Telusuri graph disamping dengan mengunakan
BFS dan DFS. Secara berturut-urut root
dimulai dari 1,2,3 dan 4.
• Bandingkan hasilnya!
Latihan
2. Telusuri dengan BFS dan DFS!
root : node 1
2
3
8
1
4
5
9
6
7
Latihan
3. Telusuri dengan BFS dan DFS!
root : node 1
2
3
8
1
10
4
5
9
6
7
11
Implementasi Program
Operasi-operasi
Menggunakan adjacency matriks, operasioperasinya sebagai berikut :
1.
2.
3.
4.
5.
6.
7.
Deklarasi
Inisialisasi
Penambahan node
Penambahan edge
Menandai Node
Traversal
Display node
Contoh Program
• Deklarasi
public class AdjacencyMatriksGraph {
private final int MAX_VERTS = 20;
private Vertex vertexList[];
private int adjMat[][];
private int nVerts;
private StackX theStack;
private Queue theQueue;
Contoh Program
• Inisialisasi
public AdjacencyMatriksGraph() // constructor
{
vertexList = new Vertex[MAX_VERTS];
// adjacency matrix
adjMat = new int[MAX_VERTS][MAX_VERTS];
nVerts = 0;
for(int j=0; j<MAX_VERTS; j++) // set adjacency
for(int k=0; k<MAX_VERTS; k++) // matrix to 0
adjMat[j][k] = 0;
theStack = new StackX();
theQueue = new Queue();
}
Contoh Program
• Tambah Node
public void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
Contoh Program
• Tambah Edge
public void addEdge(int start, int end)
{
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
Contoh Program
• Menandai Node
public int getAdjUnvisitedVertex(int v)
{
for(int j=0; j<nVerts; j++)
if(adjMat[v][j]==1 && vertexList[j].wasVisited==false)
return j;
return -1;
}
• DFS
public void dfs() // depth-first search
{ // begin at vertex 0
vertexList[0].wasVisited = true; // mark it
displayVertex(0); // display it
theStack.push(0); // push it
while( !theStack.isEmpty() ) // until stack empty,
{
int v = getAdjUnvisitedVertex( theStack.peek() );
if(v == -1) // if no such vertex,
theStack.pop();
else // if it exists,
{
vertexList[v].wasVisited = true;
displayVertex(v); // display it
theStack.push(v); // push it
}
} // end while
for(int j=0; j<nVerts; j++) // reset flags
vertexList[j].wasVisited = false;
}
• BFS
public void bfs() // breadth-first search
{ // begin at vertex 0
vertexList[0].wasVisited = true; // mark it
displayVertex(0); // display it
theQueue.insert(0); // insert at tail
int v2;
while( !theQueue.isEmpty() )
{
int v1 = theQueue.remove();
// until it has no unvisited neighbors
while( (v2=getAdjUnvisitedVertex(v1)) != -1 )
{ // get one,
vertexList[v2].wasVisited = true; // mark it
displayVertex(v2); // display it
theQueue.insert(v2); // insert it
} // end while
} // end while(queue not empty)
// queue is empty, so we're done
for(int j=0; j<nVerts; j++) // reset flags
vertexList[j].wasVisited = false;
}
Contoh Program
• Display Node
public void displayVertex(int v)
{
System.out.print(vertexList[v].label);
}
Pustaka
• Sartaj Sahni , “Data Structures & Algorithms”,
Presentation L20-24.
• Mitchell Waite, “Data Structures & Algorithms in
Java”, SAMS, 2001