380 likes | 533 Views
Førsteårsprojekt (F2010). Claus Brabrand [ brabrand@itu.dk ] IT University of Copenhagen. Graphs & Graph Algorithms. Claus Brabrand [ brabrand@itu.dk ] IT University of Copenhagen. Outline. Graphs Graph Representations Breadth First Search (BFS) Depth First Search (DFS)
E N D
Førsteårsprojekt(F2010) Claus Brabrand[ brabrand@itu.dk ] IT University of Copenhagen
Graphs &Graph Algorithms Claus Brabrand[ brabrand@itu.dk ] IT University of Copenhagen
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
Definition: GRAPH • A ”graph G = (V,E)” consists of: • V: a set of vertices(nodes)(knuder) • E: a set of edges(arcs)(kanter) • where EV V • There is an edge between ’v1’ and ’v2’ if • (v1, v2) E (abbreviated: ”v1 v2”) • Example: { 1, 2, 3, 4 } V = vertex { (1,2), (2,1), (2,3), (3,1), (4,2) } E = edge
Directed vs. Undirected • Directed graph:(orienteret graf) • Undirected graph:(ikke-orienteret) { 1, 2, 3, 4 } V = { (1,2), (2,1), (2,3), (3,1), (4,2) } E = { 1, 2, 3, 4 } V = { (1,2), (2,1), (1,3), (3,1), (2,3), (3,2), (2,4), (4,2) } E = v1 v2 v2 v1
Graph Examples • Roadmap: roads and intersectionsproject! • Powergrid: wires and connexions • Rivers: river and confluences • World Wide Web: pages and links • Facebook: people and friends-of • Data structures: objects and references • Class hierarchies: classes and inheritances • Bacon index: people and co-starring
Graph Terminology • A path(sti) is a list of adjacent edges: • p = [e0, e1, …, en] • A cycle (kreds) is a non-empty path from a vertex to itself: • p = [e0, e1, …, en] e1 e0 en v0 v1 … vn+1 = = = (v0,v1) (v1,v2) (vn,vn+1) v0 v1 … v0 = = (v0,_) (_,v0)
Graph Terminology (cont’d) • A directed acyclic graph (DAG) (orienteret acyklisk graf) is a connected graph w/o cycles: • A tree (træ) is a connected acyclicgraph every node has indegree 0 or 1 (i.e., a DAG w/o ”sharing”):
Graph Properties • A particular graph ”G= (V,E)” is said to be: • Reflexive: • Symmetric: • Transitive: v1V: v1v1 v1,v2V: v1v2 v2v1 v1,v2,v3V: v1v2 v2v3 v1v3
Which properties does the graph satisfy? • reflexive • symmetric • transitive • reflexive, symmetric,and transitive • none of the above answers are correct a b c d
Which properties does the graph satisfy? • reflexive • symmetric • transitive • reflexive, symmetric, andtransitive • none of the above answers are correct a b c d
What is this? The ”borders-with” relation (for the Europeanmainland)
Graph Visualization • The ”Graphviz” Tool: • [ http://www.graphviz.org ] graph nfa { overlap=false; splines=true; DK -- DE; DE -- NL; DE -- BE; DE -- LU; DE -- FR; DE -- CH; DE -- AT; DE -- CZ; DE -- PL; … } graphviz ’.dot’ file
Edge Information • Often, information associated with edges • e.g., Roadmaps: • e.g., Powergrid: • e.g., Bacon-index: • … 305 km Aarhus KBH 220 V Agave 70 Outlet Mr. & Mrs. Smith B.Pitt A.Jolie
Graph Visualization (cont’d) • The ”Graphviz” Tool: • [ http://www.graphviz.org ] graph nfa { n571 -- n9 [label="Kirkevej"]; n9 -- n184 [label="Kongeledet"]; n7 -- n200 [label="Norasvej"]; n46 -- n10 [label="Norasvej"]; n7 -- n160 [label="Skovagervej"]; n28 -- n71 [label="Kirkevej"]; … } graphviz ’.dot’ file
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
A) O(1) B) O(log(|E|)) C) O(|E|) D) O(|E|*log(|E|)) E) O(|E|2) F) Something else "Edge List" Representation • Performance: • boolean isEdge(Node n, Node m)? • void addEdge(Node n, Node m)? • void deleteEdge(Node n, Node m)? • List<Node> getEdges(Node n)? Just put all edges in ”one big” edge list: E = [ (1,2), (2,1), (2,3), (3,1), (4,2) ] O(|E|) O(1) O(|E|) O(|E|)
A) O(1) B) O(log(|V|)) C) O(|V|) D) O(|V|*log(|V|)) E) O(|V|2) F) Something else "Adjacency Matrix" Repr. • Performance: • boolean isEdge(Node n, Node m)? • void addEdge(Node n, Node m)? • void deleteEdge(Node n, Node m)? • List<Node> getEdges(Node n)? Make a matrix with entry M[i,j]=1 iff there's an edge from vertex #i to vertex #j O(1) O(1) O(1) O(|V|)
What about Space? • Edge List: • Adjacency Matrix: O(|E|) E = [ (1,2), (2,1), (2,3), (3,1), (4,2) ] O(|V|2) always! even for sparse graphs!
"Adjacency List" Repr. • Performance: • boolean isEdge(Node n, Node m)? • void addEdge(Node n, Node m)? • void deleteEdge(Node n, Node m)? • List<Node> getEdges(Node n)? Each node has its own edge list of… …and incoming edges: outgoing… outgoing: 1:[ [ (1,2) ], 2:[ (2,1), (2,3) ], 3:[ (3,1) ], 4:[ (4,2) ] ] incoming: 1: [ [ (2,1), (3,1) ], 2:[ (1,2), (4,2) ], 3: [ (2,3) ], 4: [ ] ] O( outdeg(n) ) O( 1 ) O( in(n)+out(n) ) O( in(n)+out(n) )
What about Space? (cont'd) • Edge List: • Adjacency Matrix: • Adjacency List: O(|E|) E = [ (1,2), (2,1), (2,3), (3,1), (4,2) ] O(|V|2) always! O(|V|+|E|) outgoing: 1:[ [ (1,2) ], 2:[ (2,1), (2,3) ], 3:[ (3,1) ], 4:[ (4,2) ] ] incoming: 1: [ [ (2,1), (3,1) ], 2:[ (1,2), (4,2) ], 3: [ (2,3) ], 4: [ ] ]
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
Breadth First Search (BFS) • Breadth First Search (BFS): 1) Make queue of nodes to be visited 2) Enqueue start node in queue 3) While queue not empty do: 4) Dequeue node v from queue 5) Mark v as visited (count++) 6) Enqueue all of v’s unvisited neighbours
BFS.java Set<Node> exploredNodes = new HashSet<Node>(); Queue<Node> queue = new LinkedList<Node>(); (1) queue.offer(start); (2) while (!queue.isEmpty()) { (3) Node v = queue.poll(); (4) System.out.print(v.index + " "); // print visited node exploredNodes.add(v); (5) for (Edge<Node> edge: graph.getEdges(v)) { (6) Node w = edge.getOtherEnd(v); // get v's neighbour w if (!exploredNodes.contains(w)) { // if w unvisited queue.offer(w); } } } enqueue dequeue 1) Make queue of nodes to be visited 2) Enqueue start node in queue 3) While queue not empty do: 4) Dequeue node v from queue 5) Mark v as visited (count++) 6) Enqueue all of v’s unvisited neighbours enqueue
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
Depth First Search (DFS) • Depth First Search (DFS): 1) Make stack of nodes to be visited 2) Push start node onto stack 3) While stack not empty do: 4) Pop node v from stack 5) Mark v as visited (count++) 6) Push all of v’s unvisited neighbours onto stack
Exercise: DFS.java push pop 1) Make stack of nodes to be visited 2) Push start node onto stack 3) While stack not empty do: 4) Pop node v from stack 5) Mark v as visited (count++) 6) Push all of v’s unvisited neighbours onto stack push
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
Topological Sorting (a DAG) • (Assumption: no cycles) • Uses: • Sequence of activities in a building project • Recalculation sequence in a spread-sheet • Observation: • In a finite acyclic graph there exists at least one node with indegree zero… “A topological ordering of a DAG is a linear ordering of its nodes in which each node comes before all nodes to which it has outbound edges.” -- Wikipedia
Topological Sorting (cont’d) • Topological Sorting: • Efficient implementation: • Maintain ”HashMap<Node,Integer>” of all indegrees • Maintain ”Stack<Node>” of nodes with indegree zero 1) Initialize empty topologically ordered node list 2) Repeat until no more nodes: 3) Pick a node v without incoming edges 4) Push v onto topologically ordered list 5) Remove v from graph; and 6) Remove all edges out of v * *) if no such node exists, the graph is cyclic Time: O( |V| + |E| )
Outline • Graphs • Graph Representations • Breadth First Search (BFS) • Depth First Search (DFS) • Topological Sorting • Exercises • Krak Data Representation • Project (part 1): ”Visualization”
Exercises • 1) Graph: • Make a graph interface and implementation • 2) Breadth First Search: • Run the code (from this lecture) on example graph • 3) Depth First Search: • Change the BFS to a DFS algorithm (and try it out) • 4) Draw graph (using GraphViz): • Add a "toDot()" method to your Graph (and try it out) • 5) Topological Sorting: • Implement "List<Node> topSort(Graph<...>)"
”KRAK” Data Representation Krak data: • NB: only for teachingand research at ITU ! • Size: ~ 150 MB (big) • Sealand: 209.402 roads • Lots of challenges: • Efficient visualization • Effective browsing • Efficient road searching • Calculate fastest routes • … ”KDV” (Kraks Danske Vejnet):
UTM Coordinates • UTM(Universal Transverse Mercator net): • Approximated (x,y)-coordinates for earth • 60x24 zones: • (west) 01, …, 60 (east) • (south) A, …, Z (north) • Denmark is in zones: • 32V + 32U + 33U • KRAK: • Coord’s converted to (”zone 32”, meters N of equator) • E.g., US military 1940s ”Rued Langgaards Vej”: (x1,y1) = (725696.40753, 6174169.66806) (x2,y2) = (725860.58568, 6174110.34971)
Edges (roads): Vertices (intersections): ”KRAK” Data Representation 208484, // arc node#// (not used) 132371, // node# 441762, // national node# 725696.40753, // UTM: # meters // west of zone 28 6174169.66806 // UTM: # meters // north of equ’tr 132371, // from node#132196, // to node#199.34533, // length, meters208484,208484,6, // road type'Rued Langgaards Vej’, // name0,0,0,0, // to/from house#s,,,,0,0, 2300,2300, // to/from zipcode101,6005,0,,0,0,10, // speed limit1.375, // drive time, min,,,10178744,09/04/02,4164866 ”kdv_unload.txt” ”kdv_node_unload.txt”
Node: Edge: ”graphlib” Representation ”krak-kode-faap-1.zip”: Contains code for reading the KRAK data format and for building a graph! package graphlib; public class Edge<N extends Node> { // fields: public N v1; public N v2; protected byte direction; public static final byte FORWARD = 1, BACKWARD = 2, BOTH = FORWARD | BACKWARD; // constructors: protected Edge() {…} public Edge(N n1, N n2, byte dir) {…} // methods: public N getStart() {…} public N getOtherEnd(N n) {…} public N getEnd(){…} } package graphlib; public class Node { public final int index; public Node(int index) { this.index = index; } public final int getIndex() { return index; } }
”graphlib” Representation NB!: all lists start at index 1 ( index 0 is bogus :-/ ) • Graph: NB!: ”node.index” are numbered & initialized 1..N+1 public class Graph<E extends Edge<N>, N extends Node> { // fields: public ArrayList<N> nodes; //list of all nodes int edgeCount = 0; public ArrayList<ArrayList<E>> edges; //nodes: list of edges ArrayList<ArrayList<E>> reverse_edges; //nodes: list of rev-edges //(excepting the BOTH edges) // constructor: public Graph(ArrayList<N> nodes) {…} // methods: public int getEdgeCount() {…} public void addEdges(Collection<E> c) {…} public void addEdge(E e) {…} public N getNode(int index) {…} public Iterator<E> outGoingEdges(Node n) {…} public Iterator<E> incomingEdges(Node n) {…} }