Analysis of Algorithms

Download Report

Transcript Analysis of Algorithms

CSC401 – Analysis of Algorithms
Lecture Notes 13
Graphs: Concepts,
Representation, and Traversal
Objectives:
Introduce graphs
Present data structures for graphs
Discuss the graph connectivity
Present the depth-first search algorithm
Present the breath-first search algorithm
1
Graph
A graph is a pair (V, E), where
– V is a set of nodes, called vertices
– E is a collection of pairs of vertices, called edges
– Vertices and edges are positions and store elements
Example:
– A vertex represents an airport and stores the three-letter
airport code
– An edge represents a flight route between two airports
and stores the mileage of the route
SFO
PVD
ORD
LGA
HNL
LAX
DFW
MIA
2
Edge Types
Directed edge
– ordered pair of vertices (u,v)
– first vertex u is the origin
– second vertex v is the
destination
– e.g., a flight
ORD
flight
AA 1206
PVD
Undirected edge
– unordered pair of vertices (u,v)
– e.g., a flight route
Directed graph
– all the edges are directed
– e.g., route network
ORD
849
miles
PVD
Undirected graph
– all the edges are undirected
– e.g., flight network
3
Applications
Electronic circuits
cslab1a
cslab1b
– Printed circuit board
– Integrated circuit
math.brown.edu
Transportation networks
cs.brown.edu
– Highway network
– Flight network
Computer networks
brown.edu
qwest.net
att.net
– Local area network
– Internet
– Web
Databases
cox.net
John
Paul
– Entity-relationship diagram
David
4
Terminology
End vertices (or endpoints)
of an edge
– U and V are the endpoints of a
Edges incident on a vertex
– a, d, and b are incident on V
Adjacent vertices
– U and V are adjacent
Degree of a vertex
– X has degree 5
Parallel edges
– h and i are parallel edges
Self-loop
– j is a self-loop
a
U
V
b
d
h
X
c
e
W
j
Z
i
g
f
Y
5
Terminology (cont.)
Path
– sequence of alternating
vertices and edges
– begins with a vertex
– ends with a vertex
– each edge is preceded and
followed by its endpoints
Simple path
– path such that all its vertices
and edges are distinct
Examples
– P1=(V,b,X,h,Z) is a simple
path
– P2=(U,c,W,e,X,g,Y,f,W,d,V) is
a path that is not simple
a
U
c
V
b
d
P2
P1
X
e
W
h
Z
g
f
Y
6
Terminology (cont.)
Cycle
– circular sequence of alternating
vertices and edges
a
– each edge is preceded and
followed by its endpoints
Simple cycle
U
– cycle such that all its vertices
c
and edges are distinct
Examples
– C1=(V,b,X,g,Y,f,W,c,U,a,) is a
simple cycle
– C2=(U,c,W,e,X,g,Y,f,W,d,V,a,)
is a cycle that is not simple
V
b
d
C2
X
e
C1
g
W
f
h
Z
Y
7
Property 1
Properties
Sv deg(v) = 2m
Proof: each edge is
counted twice
Property 2
In an undirected graph
with no self-loops and
no multiple edges
m  n (n - 1)/2
Proof: each vertex has
degree at most (n - 1)
What is the bound for a
directed graph?
Notation
n
m
deg(v)
number of
vertices
number of edges
degree of vertex
v
Example
– n=4
– m=6
– deg(v) = 3
8
Main Methods of the Graph ADT
Vertices and edges
– are positions
– store elements
Accessor methods
–
–
–
–
–
–
–
–
aVertex()
incidentEdges(v)
endVertices(e)
isDirected(e)
origin(e)
destination(e)
opposite(v, e)
areAdjacent(v, w)
Update methods
–
–
–
–
–
insertVertex(o)
insertEdge(v, w, o)
insertDirectedEdge(v, w, o)
removeVertex(v)
removeEdge(e)
Generic methods
–
–
–
–
numVertices()
numEdges()
vertices()
edges()
9
Edge List Structure
Vertex object
– element
– reference to position in
vertex sequence
u
a
Edge object
– element
– origin vertex object
– destination vertex
object
– reference to position in
edge sequence
v
u
c
b
d
w
z
w
v
z
Vertex sequence
– sequence of vertex
objects
a
b
c
d
Edge sequence
– sequence of edge
objects
10
Adjacency List Structure
Edge list structure
Incidence sequence
for each vertex
– sequence of
references to edge
objects of incident
edges
a
v
b
u
u
w
v
w
Augmented edge
objects
– references to
associated positions
in incidence
sequences of end
vertices
a
b
11
Adjacency Matrix Structure
Edge list structure
Augmented vertex
objects
a
– Reference to edge
object for adjacent
vertices
– Null for non
nonadjacent vertices
The “old fashioned”
version just has 0 for
no edge and 1 for
edge
b
u
– Integer key (index)
associated with vertex
2D-array adjacency
array
v
0
u
w
1
0
0
2
1

w
2


1
a
2
v


b
12
Asymptotic Performance
n vertices, m edges
no parallel edges
no self-loops
Bounds are “big-Oh”
Edge
List
Adjacency
List
Adjacenc
y Matrix
Space
n+m
n+m
n2
incidentEdges(v)
areAdjacent (v, w)
insertVertex(o)
m
m
1
deg(v)
min(deg(v), deg(w))
1
n
1
n2
insertEdge(v, w, o)
1
1
1
removeVertex(v)
removeEdge(e)
m
1
deg(v)
1
n2
1
13
Trees and Forests
A (free) tree is an
undirected graph T such
that
– T is connected
– T has no cycles
This definition of tree is
different from the one of a
rooted tree
A forest is an undirected
graph without cycles
The connected
components of a forest
are trees
Tree
Forest
14
Spanning Trees and Forests
A spanning tree of a
connected graph is a
spanning subgraph that is
a tree
A spanning tree is not
unique unless the graph is
a tree
Spanning trees have
applications to the design
of communication
networks
A spanning forest of a
graph is a spanning
subgraph that is a forest
Graph
Spanning tree
15
Depth-First Search
Depth-first search
(DFS) is a general
technique for
traversing a graph
A DFS traversal of a
graph G
– Visits all the vertices and
edges of G
– Determines whether G is
connected
– Computes the connected
components of G
– Computes a spanning
forest of G
DFS on a graph with n
vertices and m edges
takes O(n + m ) time
DFS can be further
extended to solve other
graph problems
– Find and report a path
between two given
vertices
– Find a cycle in the graph
Depth-first search is to
graphs what Euler tour
is to binary trees
16
DFS Algorithm
The algorithm uses a
mechanism for setting
and getting “labels” of
vertices and edges
Algorithm DFS(G)
Input graph G
Output labeling of the edges of G
as discovery edges and
back edges
for all u  G.vertices()
setLabel(u, UNEXPLORED)
for all e  G.edges()
setLabel(e, UNEXPLORED)
for all v  G.vertices()
if getLabel(v) = UNEXPLORED
DFS(G, v)
Algorithm DFS(G, v)
Input graph G and a start vertex v of G
Output labeling of the edges of G
in the connected component of v
as discovery edges and back edges
setLabel(v, VISITED)
for all e  G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w  opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
DFS(G, w)
else
setLabel(e, BACK)
17
A
Example
A
A
A
unexplored vertex
visited vertex
unexplored edge
discovery edge
back edge
B
D
E
A
C
B
D
E
A
C
B
D
E
A
B
D
E
C
B
D
C
A
B
C
C
A
D
E
B
D
C
E
E
18
DFS and Maze Traversal
The DFS algorithm is
similar to a classic
strategy for exploring
a maze
– We mark each
intersection, corner
and dead end (vertex)
visited
– We mark each
corridor (edge )
traversed
– We keep track of the
path back to the
entrance (start
vertex) by means of a
rope (recursion stack)
19
Properties of DFS
Property 1
DFS(G, v) visits all the
vertices and edges in
the connected
component of v
A
Property 2
The discovery edges
labeled by DFS(G, v)
form a spanning tree
of the connected
component of v
B
D
E
C
20
Analysis of DFS
Setting/getting a vertex/edge label takes O(1)
time
Each vertex is labeled twice
– once as UNEXPLORED
– once as VISITED
Each edge is labeled twice
– once as UNEXPLORED
– once as DISCOVERY or BACK
Method incidentEdges is called once for each
vertex
DFS runs in O(n + m) time provided the graph is
represented by the adjacency list structure
– Recall that
Sv deg(v) = 2m
21
We can specialize the
DFS algorithm to find a
path between two
Algorithm pathDFS(G, v, z)
given vertices u and z
setLabel(v, VISITED)
using the template
S.push(v)
method pattern
if v = z
We call DFS(G, u) with u
return S.elements()
for all e  G.incidentEdges(v)
as the start vertex
if getLabel(e) = UNEXPLORED
We use a stack S to
w  opposite(v,e)
keep track of the path
if getLabel(w) = UNEXPLORED
between the start
setLabel(e, DISCOVERY)
vertex and the current
S.push(e)
vertex
pathDFS(G, w, z)
S.pop(e)
As soon as destination
else
vertex z is
setLabel(e, BACK)
encountered, we
S.pop(v)
return the path as the
22
contents of the stack
Path Finding
Cycle Finding
We can specialize the
Algorithm cycleDFS(G, v, z)
DFS algorithm to find a setLabel(v, VISITED)
simple cycle using the
S.push(v)
template method
for all e  G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
pattern
w  opposite(v,e)
We use a stack S to
S.push(e)
keep track of the path
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
between the start
pathDFS(G, w, z)
vertex and the current
S.pop(e)
vertex
else
As soon as a back edge
T  new empty stack
repeat
(v, w) is encountered,
o  S.pop()
we return the cycle as
T.push(o)
the portion of the stack
until o = w
from the top to vertex
return T.elements()
w
S.pop(v)
23
Breadth-First Search
Breadth-first search
(BFS) is a general
technique for traversing
a graph
A BFS traversal of a
graph G
– Visits all the vertices and
edges of G
– Determines whether G is
connected
– Computes the connected
components of G
– Computes a spanning
forest of G
BFS on a graph with n
vertices and m edges
takes O(n + m ) time
BFS can be further
extended to solve
other graph problems
– Find and report a path
with the minimum
number of edges
between two given
vertices
– Find a simple cycle, if
there is one
24
BFS Algorithm
The algorithm uses a
mechanism for
setting and getting
“labels” of vertices
and edges
Algorithm BFS(G)
Input graph G
Output labeling of the edges
and partition of the
vertices of G
for all u  G.vertices()
setLabel(u, UNEXPLORED)
for all e  G.edges()
setLabel(e, UNEXPLORED)
for all v  G.vertices()
if getLabel(v) = UNEXPLORED
BFS(G, v)
Algorithm BFS(G, s)
L0  new empty sequence
L0.insertLast(s)
setLabel(s, VISITED)
i0
while Li.isEmpty()
Li +1  new empty sequence
for all v  Li.elements()
for all e  G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w  opposite(v,e)
if getLabel(w) =
UNEXPLORED
setLabel(e, DISCOVERY)
setLabel(w, VISITED)
Li +1.insertLast(w)
else
setLabel(e, CROSS)
25
i  i +1
Example
unexplored vertex
visited vertex
unexplored edge
discovery edge
cross edge
A
A
L0
L1
L0
L1
B
L0
L1
C
E
L1
D
A
L1
B
C
C
D
F
D
F
A
B
L2
E
A
B
L0
D
F
E
F
L0
C
E
A
B
A
C
E
D
F
26
L0
Example (cont.)
L1
L0
L1
A
B
C
L2
B
C
L2
A
D
E
F
E
L0
L1
L1
A
B
B
L2
L0
C
E
D
F
L1
F
A
C
L2
L0
D
E
F
A
B
L2
D
C
E
D
F
27
Properties
Notation
– Gs: connected component of s
A
Property 1
BFS(G, s) visits all the vertices and
edges of Gs
B
Property 2
The discovery edges labeled by
BFS(G, s) form a spanning tree Ts
of Gs
Property 3
E
L0
For each vertex v in Li
L1
– The path of Ts from s to v has i
edges
– Every path from s to v in Gs has at
least i edges
C
F
A
B
L2
D
C
E
D
F
28
Analysis
Setting/getting a vertex/edge label takes O(1)
time
Each vertex is labeled twice
– once as UNEXPLORED
– once as VISITED
Each edge is labeled twice
– once as UNEXPLORED
– once as DISCOVERY or CROSS
Each vertex is inserted once into a sequence Li
Method incidentEdges is called once for each
vertex
BFS runs in O(n + m) time provided the graph is
represented by the adjacency list structure
– Recall that
Sv deg(v) = 2m
29
Applications
Using the template method pattern, we
can specialize the BFS traversal of a
graph G to solve the following problems
in O(n + m) time
– Compute the connected components of G
– Compute a spanning forest of G
– Find a simple cycle in G, or report that G is
a forest
– Given two vertices of G, find a path in G
between them with the minimum number of
edges, or report that no such path exists
30
DFS vs. BFS
A
B
C
Applications
Spanning forest,
connected components,
paths, cycles
D
DFS BFS

Shortest paths
E
F
Biconnected components



DFS
L0
L1
B
L2
DFS: Back edge (v,w)
A
C
E
BFS
D
F
– w is an ancestor of v in the
tree of discovery edges
BFS: Cross edge (v,w)
– w is in the same level as v or
in the next level in the tree of
discovery edges
31