csc 213 – large scale programming. today’s goals review first two implementation for graph adt ...

21
LECTURE 30: ADJACENCY- MATRIX BASED GRAPH CSC 213 – Large Scale Programming

Upload: william-farmer

Post on 22-Dec-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

LECTURE 30:ADJACENCY-MATRIXBASED GRAPH

CSC 213 – Large Scale Programming

Today’s Goals

Review first two implementation for Graph ADT What fields & data used in edge-list based

approach Operations adjacency-list improves & how

it does this Consider when Graph used in real-life

problems For these cases, what operations are

important? How can we speed them up to make work

go faster? Could new implementation use arrays O(1)

time? Consider changes needed to enable using

matrices

edges

vertices

Edge-List Implementation

Base for all Graph implementations Sequences of

vertices & edges Each instance of Edge refers to end vertices

u w

u v w

a b

u

v

wa b

edges

a b

Adjacency-List Implementation Vertex maintains Sequence of Edges Only change

needed

Methods which use incident edges faster Costs some space Improves few

methods to O(1)

vertices

u v w

u wu

v

wa b

Graph ADT

Accessor methods vertices(): iterable for

vertices edges(): iterable for

edges endVertices(e): array

with endpoints of edge e

opposite(v,e): e’s endpoint that is not v

areAdjacent(v,w): check if v and w are adjacent

replace(v,x): make x new element at vertex v

replace(e,x): make x new element at edge e

Update methods insertVertex(x):

create vertex storing element x

insertEdge(v,w,x): add edge (v,w) with element x

removeVertex(v): remove v (& incident edges)

removeEdge(e):remove e

Retrieval methods incidentEdges(v): get

edges incident to v

Graph ADT

Accessor methods vertices(): iterable for

vertices edges(): iterable for

edges endVertices(e): array

with endpoints of edge e

opposite(v,e): e’s endpoint that is not v

areAdjacent(v,w): check if v and w are adjacent

replace(v,x): make x new element at vertex v

replace(e,x): make x new element at edge e

Update methods insertVertex(x):

create vertex storing element x

insertEdge(v,w,x): add edge (v,w) with element x

removeVertex(v): remove v (& incident edges)

removeEdge(e): remove e

Retrieval methods incidentEdges(v): get

edges incident to v

Can This Be Made Faster?

Testing for adjacency is very common Often check how or if vertices are

connected Checking in O(1) time speeds up Graph

algorithms

Can This Be Made Faster?

Testing for adjacency is very common Often check how or if vertices are connected Checking in O(1) time speeds up Graph

algorithms Can trade off lots of space to make

faster Unique integer ID assigned to each Vertex Matrix is created as doubly-subscripted array

of Edge matrix[sourceID][targetID] refers to Edge or null

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Edge-List structurestill used as base

u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Edge-List structurestill used as base

Vertex stores int Index found in

matrix u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Edge-List structurestill used as base

Vertex stores int Index found in

matrix

Adjacency matrix in Graph class

u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Edge-List structurestill used as base

Vertex stores int Index found in

matrix

Adjacency matrix in Graph class null if

not adjacent

u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Edge-List structurestill used as base

Vertex stores int Index found in

matrix Adjacency matrix

in Graph class null if

not adjacent -or-

Edge incidentto both vertices

u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Undirected edgesstored in both array locations

u v w

0 1 2

u

v

wa b

ba

edges

vertices

0 1 2

0

1

2

Adjacency Matrix Structure

Undirected edgesstored in both array locations

Directed edgesonly in array from source to target

u v w

0 1 2

u

v

wa b

ba

0 1 2

0

1

2

edges

vertices

Adjacency Matrix Structure

Undirected edgesstored in both array locations

Directed edgesonly in array from source to target

u v w

0 1 2

u

v

wa b

ba

Vertex in the Matrix

Another Vertex implementation Only change is a field for this Vertex

Make subclass of existing Vertex class Have 2 classes, which should we use? Does

it matter?

class AMVertex<V> extends Vertex<V>{-or-

class AMVertex<V,E> extends ALVertex<V,E> {private int rank;

// Also need to define getRank, but not setRank}

Inserting/Removing Vertex

Reallocates & copy adjacency matrix Insertion grows array creating locations for

vertex But we have choices when Vertex

removed Resize adjacency-matrix to prevent

“bubbles” Only good when vertices are constant

Inserting/Removing Vertex

Reallocates & copy adjacency matrix Insertion grows array creating locations for

vertex But we have choices when Vertex

removed Resize adjacency-matrix to prevent

“bubbles” Only good when vertices are constant

What else could we do & when is it useful?

n vertices & m edges no self-loops

Edge-List

Adjacency-List

Adjacency-Matrix

Space n + m n + m n2

incidentEdges(v) m deg(v) n + deg(v)

areAdjacent(v,w) m min(deg(v), deg(w)) 1

insertVertex(o) 1 1 n2

insertEdge(v,w,o) 1 1 1

removeVertex(v) m deg(v) n2

removeEdge(e) 1 1 1

Asymptotic Performance

For Next Lecture

Finish up your coding of program #2; due today Can use virtual extension, if you still have it

Midterm #2 in class week from today Test will include all material through today Lab on graphs & implementations, so get

chance to use