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 Sequence s of vertices & edges Each instance of Edge refers to end vertices uw u v w ab u v w a b
edges ab Adjacency-List Implementation Vertex maintains Sequence of Edge s Only change needed Methods which use incident edges faster Costs some space Improves few methods to O(1) vertices uv w uwu v w a 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 1 2 Adjacency Matrix Structure Edge-List structure still used as base u v w 012 u v w a b ba
edges vertices 1 2 Adjacency Matrix Structure Edge-List structure still used as base Vertex stores int Index found in matrix u v w 012 u v w a b ba
edges vertices 1 2 Adjacency Matrix Structure Edge-List structure still used as base Vertex stores int Index found in matrix Adjacency matrix in Graph class u v w 012 u v w a b ba
edges vertices Adjacency Matrix Structure u v w 012 u v w a b ba
edges vertices Adjacency Matrix Structure u v w 012 u v w a b ba
edges vertices 1 2 Adjacency Matrix Structure Undirected edges stored in both array locations u v w 012 u v w a b ba
edges vertices 1 2 Adjacency Matrix Structure Undirected edges stored in both array locations Directed edges only in array from source to target u v w 012 u v w a b ba
012 0 1 2 edges vertices Adjacency Matrix Structure Undirected edges stored in both array locations Directed edges only in array from source to target u v w 012 u v w a 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 extends Vertex { -or- class AMVertex extends ALVertex { 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 n2n2 incidentEdges (v) mdeg(v)n + deg(v) areAdjacent (v,w) mmin(deg(v), deg(w))1 insertVertex (o) 11n2n2 insertEdge (v,w,o) 111 removeVertex (v) mdeg(v)n2n2 removeEdge (e) 111 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