m7_graph

75
GRAPH Teknik Informatika Universitas Muhammadiyah Malang 2014 Algoritma dan Struktur Data

Upload: ade

Post on 30-Jan-2016

215 views

Category:

Documents


0 download

DESCRIPTION

aaa

TRANSCRIPT

Page 1: m7_graph

GRAPH

Teknik InformatikaUniversitas Muhammadiyah Malang

2014

Algoritma dan Struktur Data

Page 2: m7_graph

Tujuan Instruksional

• Mampu memahami konsep struktur data graph

• Mampu memahami representasi graph• Mampu memahami teknik penelusuran pada

graph• Mampu mengimplementasikan graph

kedalam pemrograman.

Page 3: m7_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.

Page 4: m7_graph

Contoh Graph

• Jaringan pertemanan pada Facebook.

Toni

Nina

Ale

Firda

Joko

Riza

Graph dengan 6 node dan 7 edge yang merepresentasikan jaringan pertemanan pada Facebook

Page 5: m7_graph

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 FacebookE : pertemanan antara member satu dengan yang lain.

Page 6: m7_graph

Jenis Graph

• Graph dibedakan menjadi beberapa jenis, antara lain :

1.Undirected Graph2.Directed Graph (Digraph)3.Weigth Graph

Page 7: m7_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}

Page 8: m7_graph

Gambar Undi-Graph

Page 9: m7_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}}.

Page 10: m7_graph

Contoh Undi-Graph

Page 11: m7_graph

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

Page 12: m7_graph

Gambar Digraph

Page 13: m7_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)}.

Page 14: m7_graph

Contoh Digraph

Page 15: m7_graph

Weigth Graph

• Graph yang memiliki bobot, yaitu pada tiap edge-nya memiliki nilai.

Page 16: m7_graph

Contoh Weigth Graph

B

A

C

E

F

D

2

2

2

4

4

5

Page 17: m7_graph

Loop

• Digraph dapat memiliki edge dari dan menuju ke node itu sendiri (Self-edge). Hal ini dikenal dengan istilah loop.

53

7

1

4

2

6

Self-edge/loopLEGAL

Page 18: m7_graph

Contoh Penerapan Graph

Page 19: m7_graph

Peta Penelusuran Kota(Berdasarkan Jarak)

• Node = Tempat Wisata• edge = jalur• Weight = jarak

Page 20: m7_graph

Peta kota

• Some streets are one way.

Page 21: m7_graph

Graph Property

Page 22: m7_graph

Property

• Jumlah Edge• Degree• Jumlah Vertex Degree• In-Degree• Out-Degree

Page 23: m7_graph

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.

Page 24: m7_graph

Contoh

• Undi-graphjumlah maks edge : 3

• Di-graphjumlah maks edge : 6dengan loop : 9

Page 25: m7_graph

Degree

• Degree : jumlah cabang atau jumlah edge yang dimiliki node.

• Contoh undi-graph : degree(2) = 2, degree(5) = 3, degree(3) = ???degree(7) = ???

Page 26: m7_graph

Contoh (Di-graph)

• Degree (4) =???• Degree (7) = ???

Page 27: m7_graph

Jumlah Degree

• Jumlah degree adalah jumlah total cabang/degree yang ada pada graph.

• Rumus = 2e (dimana e adalah jumlah edge)

• Hanya berlaku untuk undi-graph!Jumlah Vertex Degree = 6

Page 28: m7_graph

In-Degree

Jumlah edge yang masuk atau mengarah ke Node.

indegree(2) = 1, indegree(7) = 2, indegree(1)=???

Page 29: m7_graph

Out-Degree

Jumlah edge yang keluar dari Node.

outdegree(2) = 1, outdegree(7) = 0, outdegree(1) = ???

Page 30: m7_graph

Representasi Graph

Page 31: m7_graph

Representasi Graph

• Representasi graph dibedakan menjadi 2 :1.Adjacency Matrix

dapat direpresentasikan dengan matriks (array 2 Dimensi).

2.Adjacency Listsdapat direpresentasikan dengan array (bukan berupa matriks) maupun linked list.

Page 32: m7_graph

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.

Page 33: m7_graph

Adjacency Matrix

1 2 3 4 5

1

2

3

4

5

0 1 0 1 0

1 0 0 0 1

0 0 0 0 1

1 0 0 0 1

0 1 1 1 0

Page 34: m7_graph

Undi-graph

•Diagonal entries are zero.

•Adjacency matrix of an undirected graph is symmetric.

A(i,j) = A(j,i) for all i and j.

Page 35: m7_graph

Di-graph

• Dimungkinkan tidak simetris jika terdapat loop.

Page 36: m7_graph

Adjacency List

• Direpresentasikan dengan linked list atau array.– Array list : array dua dimensi namun tidak ber-

ordo nxn.– Linked list : array of single linked list

Page 37: m7_graph

Array Lists

aList[1] = (2,4)

aList[2] = (1,5)

aList[3] = (5)

aList[4] = (1,5)

aList[5] = (2,3,4)

Page 38: m7_graph

Adjacency Lists (Linked List)

aList [1]

[5]

[2]

[3]

[4]

2 4

1 5

5

5 1

2 4 3

Page 39: m7_graph

Latihan

1. Gambarkan graph dari representasi Matrik berikut:

Page 40: m7_graph
Page 41: m7_graph
Page 42: m7_graph

2. Representasikan dengan adjacency list & adjacency matrix

B

A

C

E

F

D

2

2

2

4

4

5

1

Page 43: m7_graph

3. Representasikan dengan adjacency list & adjacency matrix

Toni

Nina

Ale

Firda

Joko

Riza

Page 44: m7_graph

Penelusuran Graph

Page 45: m7_graph

Metode Penelusuran

• Graph Traversal : Mengunjungi tiap simpul/node secara sistematik.

• Metode :– DFS (Depth First Search) : Pencarian Mendalam – BFS (Breadth First Search) : Pencarian Melebar

Page 46: m7_graph

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.

Page 47: m7_graph

Breadth First Search (BFS)

Urutan verteks hasil penelusuran :

Page 48: m7_graph

Breadth First Search (BFS)

….

….

Page 49: m7_graph

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.

Page 50: m7_graph

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.

Page 51: m7_graph

Depth First Search (DFS)

Urutan verteks hasil penelusuran :

Page 52: m7_graph

Depth First Search (DFS)

….

….

Page 53: m7_graph

Algoritma DFS• Traversal dimulai dari simpul v.• Algoritma:

1. Kunjungi simpul v,2. Kunjungi simpul w yang bertetangga dengan simpul v.3. Ulangi DFS mulai dari simpul w.4. 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.

Page 54: m7_graph

Latihan• Telusuri graph disamping dengan

mengunakan BFS dan DFS. Secara berturut-urut root dimulai dari 1,2,3 dan 4.

• Bandingkan hasilnya!

Page 55: m7_graph

Latihan2. Telusuri dengan BFS dan DFS!

root : node 1

Page 56: m7_graph

Latihan

3. Telusuri dengan BFS dan DFS!root : node 1

Page 57: m7_graph

Implementasi Program

Page 58: m7_graph

Operasi-operasi

Menggunakan adjacency matriks, operasi-operasinya sebagai berikut :

1. Deklarasi+Inisialisasi2. Penambahan node3. Penambahan edge4. Visitasi Node5. Traversal6. Display node

Page 59: m7_graph

Deklarasi+Inisialisasi

• Langkah-langkah untuk memulai deklarasi sekaligus inisilisasi sbb :

1.Membuat class utama (main class)2.Membuat class vertex3.Membuat class Stack4.Membuat class Queue5.Deklarasi variabel

Page 60: m7_graph

Contoh Program• Class stackclass StackX{ private final int SIZE = 20; private int[] st; private int top; public StackX() // constructor { st = new int[SIZE]; // make array top = -1; } public void push(int j) // put item on stack { st[++top] = j; } public int pop() // take item off stack { return st[top--]; } public int peek() // peek at top of stack { return st[top]; } public boolean isEmpty() // true if nothing on stack- { return (top == -1); }}

Page 61: m7_graph

Contoh Program• Class Queueclass Queue { private final int SIZE = 20; private int[] queArray; private int front; private int rear; public Queue() { queArray = new int[SIZE]; front = 0; rear = -1; } public void insert(int j) { if(rear == SIZE-1) rear = -1; queArray[++rear] = j; } public int remove() { int temp = queArray[front++]; if(front == SIZE) front = 0; return temp; } public boolean isEmpty() { return ( rear+1==front || (front+SIZE-1==rear) ); }}

Page 62: m7_graph

Contoh Program

• Class vertex digunakan untuk menyimpan node/vertex.

• Terdiri dari 2 variabel yaitu label (untuk menyimpan data pada node) dan wasVisited (untuk menandai sebuah node sudah/telah dikunjugi).class Vertex{ public char label; // label (e.g. 'A') public boolean wasVisited; public Vertex(char lab) // constructor { label = lab; wasVisited = false; }}

Page 63: m7_graph

Contoh Program

• Deklarasi class utama (main class). Misalkan nama class adalah AdjacencyMatriksGraph, maka program-nya dapat dilihat seperti dibawah ini :

• Didalam class inilah perintah operasi yang lain ditulis.

public class AdjacencyMatriksGraph {

}

Page 64: m7_graph

Contoh Program

• Deklarasi variabel terdiri dari :1. Deklarasi variabel stack2. Deklarasi variabel queue3. Deklarasi variabel vertex4. Deklarasi variabel matriks (berupa array 2D)5. Deklarasi variabel MAX_VERTEX (untuk

menyimpan maksimum jumlah node)6. Deklarasi variabel nVerts (untuk menyimpan

jumlah node yang telah di-create)

Page 65: m7_graph

Contoh Program

• Variabel-variabel tersebut dideklarasikan didalam class AdjacencyMatriksGraph.

public class AdjacencyMatriksGraph { private final int MAX_VERTS = 20; private Vertex vertexList[]; private int adjMat[][]; private int nVerts; private StackX theStack; private Queue theQueue;

Page 66: m7_graph

Contoh Program

• Constructor pada main class digunakan untuk proses 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(); }

Page 67: m7_graph

Tambah Node

• Proses tambah node dilakukan dengan cara membuat new object dari class vertex.

• Ketika terjadi penambahan node baru nilai variabel nVerts ditambah 1 (increment 1).

• Contoh program berupa method addVertex sbb: public void addVertex(char lab) { vertexList[nVerts++] = new Vertex(lab); }

Page 68: m7_graph

Tambah Edge• Proses penambahan Edge dilakukan dengan cara

mengakses variabel matriks. Kemudian ditentukan titik asal dan tujuan yang berupa index. Index ini mewakili tiap node yang telah di-create.

• Untuk undi-graph, pengaksesan dengan index[start][end] atau [end][start] bernilai sama. Sedangkan untuk graph yang tidak berbobot diberikan nilai 1 jika ada edge.

• Contoh program :public void addEdge(int start, int end) { adjMat[start][end] = 1; adjMat[end][start] = 1; }

Page 69: m7_graph

Visitasi Node

• Visitasi Node adalah proses mengunjungi node. • Pada program node yang dikunjungi ditandai dengan

perubahan nilai false menjadi true untuk variabel wasVisited yang diakses melalui object vertex.

• Node yang telah dikunjungi tidak akan dikunjungi lagi.

• Contoh program :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; }

Page 70: m7_graph

Display Node

• Display Node adalah proses menampilkan data Node yang dikunjungi.

• Contoh program :public void displayVertex(int v) { System.out.print(vertexList[v].label); }

Page 71: m7_graph

Traversal

• Traversal adalah proses penelusuran Node.• Dibedakan menjadi 2 :

– DFS– BFS

Page 72: m7_graph

• Contoh program : DFS Traversalpublic 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; }

Page 73: m7_graph

• Contoh program : BFS Traversalpublic 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; }

Page 74: m7_graph

• Main Method : public static void main(String[] args) { AdjacencyMatriksGraph theGraph = new

AdjacencyMatriksGraph(); theGraph.addVertex('4');//0 theGraph.addVertex('3');//1 theGraph.addVertex('1');//2 theGraph.addVertex('2');//3

theGraph.addEdge(0,1); theGraph.addEdge(1,2); theGraph.addEdge(1,3);

System.out.print("Visits bfs: "); theGraph.bfs(); // breadth-first search System.out.println(); System.out.print("Visits dfs: "); theGraph.dfs(); // depth-first search System.out.println(); } // end main()}

Page 75: m7_graph

Pustaka

• Sartaj Sahni , “Data Structures & Algorithms”, Presentation L20-24.

• Mitchell Waite, “Data Structures & Algorithms in Java”, SAMS, 2001