ΑΛΓΟΡΙΘΜΟΙ http://eclass.aueb.gr/courses/inf161/ Άνοιξη 2017 - I. ΜΗΛΗΣ AΛΓΟΡΙΘΜΟΙ ΓΡΑΦΩΝ Ι ΕΞΕΡΕΥΝΗΣΗ 1
Graphs Ανά ζεύγη (pairwise) σχέσεις μεταξύ των στοιχείων ενός συνόλου 2
Graphs Εφαρμογές Χάρτες, πόλεις, δρόμοι, Πτήσεις, τραίνα, Προγράμματα, εργασίες, μαθήματα, Σχέσεις, κοινωνιολογία, Αλληλεπιδράσεις πρωτεϊνών, βιολογία Δίκτυα, Internet WWW: web graph Kοινωνικά δίκτυα: Facebook, Twitter, 3
History Leonhard Euler Seven Bridges of Königsberg [1736] 2 2 1 4 1 4 3 3 4
Graphs G = (V, E) V = {1,2,,n}: σύνολο κόμβων /κορυφών (nodes/vertices), V = n E Í V V = {(u,v) u,v Î V}: σύνολο ακμών (edges/arcs), E = m Μη προσανατολισμένοι γράφοι (Undirected graphs=graphs) Προσανατολισμένοι γράφοι (Directed graphs=digraphs) (u,v) º(v,u) (u,v) ¹(v,u) π.χ. (A,B)=(B,A) π.χ (4,5) ¹ (5,4) 5
Graph representation Adjacency matrix Undirected Συμμετρικός πίνακας (άνω τριγωνικός) Directed Space: O(n 2 ) Υπάρχει η ακμή (u,v)? Πολυπλοκότητα? 6
Graph representation Adjacency list Undirected Space: n+2m =O(n+m) Directed Space: n+m= O(n+m) Πυκνός (dense) γράφος: m=ο(n 2 ) Υπάρχει η ακμή (u,v)? Πολυπλοκότητα? 7
Graphs Γ(u) = {v (u,v) Î E}: Γειτονιά (neighborhood) of u π.χ. Γ(a)={b,c,d} d(u) = Γ(u) : Βαθμός (degree) of u π.χ. d(a)=3 Γ + (u) = {v (u,v) Î E }: out-neighborhood of u d + (u) = Γ + (u) : out-degree of u π.χ. Γ + (a) ={ d,b}, d + (a) =2 Γ - (u) = {v (v,u) Î E }: in-neighborhood of u d - (u) = Γ - (u) : in-degree of u π.χ. Γ - (a) ={c, d}, d - (a) =2 8
Graphs Άσκηση Αποδείξτε ότι για κάθε γράφο: (α) d ( u) = 2 E å uîv (β) ο αριθμός των κόμβων με περιττό βαθμό είναι άρτιος (γ) αν o βαθμός κάθε κόμβου u είναι d(u)³2, τότε υπάρχει κύκλος 9
DFS undirected graphs DFS: Depth-First Search Explore all nodes reachable from node u: for all u Î V: visited(u)= false explore(u) previsit(u) //empty visited(u)=true for each v Î Γ(u): if not visited(v): explore(v) postvisit(u) //empty Complexity: 2 E = O(m) (γιατί?) explore(a) 10
DFS undirected graphs Explore all nodes of a graph G: DFS(G) for all u Î V: visited(u)= false for all u Î V: if not visited(u): explore(u) Complexity O(n+m) (γιατί?) 11
DFS undirected graphs Δύο κατηγορίες ακμών: Ακμές δέντρου (tree edges) Ακμές πίσω (back edges) DFS δέντρο/δάσος T=(V, A), A Í E Back edge = cycle 12
DFS undirected graphs explore(u) previsit(u) // empty visited(u)=true for each v Î Γ(u): if not visited(v): explore(v) postvisit(u) // empty DFS(G) for all u Î V: visited(u)= false for all u Î V: if not visited(u): explore(u) Complexity O(n+m) 13
DFS undirected graphs Eρωτήσεις Απλές εφαρμογές: Ποια είναι η σειρά επίσκεψης των κόμβων? Ποιος είναι ο πατέρας κάθε κόμβου στο DFS δέντρο? Είναι ο γράφος συνδεμένος? # συνεκτικών συνιστωσών (connected components)? Parameters clock: integer counter pre(u): visiting order of vertex u cc: # connected components ccnum(u): the connected component vertex u belongs to parent(u): the parent of vertex u in the DFS tree 14
DFS undirected graphs explore(u) previsit(u) // empty visited(u)=true for each v Î Γ(u): if not visited(v): explore(v) postvisit(u) // empty DFS(G) for all u Î V: visited(u)= false for all u Î V: if not visited(u): explore(u) Complexity O(n+m) 15
DFS undirected graphs explore(u) previsit(u) visited(u)=true for each v Î Γ(u): if not visited(v): explore(v), parent(v)=u postvisit(u) // empty previsit(u) ccnum(u)=cc pre(u)= clock clock=clock+1 DFS(G) clock=1, cc=0 for all u Î V: visited(u)= false, parent(u)=nil for all u Î V: if not visited(u): cc:=cc+1, explore(u) Complexity O(n+m) 16
DFS undirected graphs Example u A B C D E F G H I J K L pre(u) 1 2 6 7 3 12 9 8 4 5 10 11 ccnum(u) 1 1 2 2 1 3 2 2 1 1 2 2 parent(u) nil A nil C A nil H D E I G H 17
DFS undirected graphs: orderings explore(u) previsit(u) visited(u)=true for each v Î Γ(u): if not visited(v): explore(v) postvisit(u) Πρώτη ανακάλυψη του u previsit(u) pre(u)= clock clock=clock+1 postvisit(u) post(u)= clock clock:=clock+1 DFS(G) Οριστική εγκατάλειψη του u clock:=1; for all u Î V: visited(u)= false Complexity O(n+m) for all u Î V: if not visited(u): explore(u) 18
DFS undirected graphs: orderings previsit(α) pοstvisit(α) Για κάθε ζευγάρι κόμβων u και v τα διαστήματα [pre(u), post(u)] και [pre(v), post(v)] είναι είτε ΞΕΝΑ μεταξύ τους ή ΤΟ ΕΝΑ ΠΕΡΙΕΧΕΤΑΙ ΣΤΟ ΑΛΛΟ Αναδρομή = στοίβα = LIFO (Last In First Out) [pre(u), post(u)] = διάστημα που ο κόμβος u είναι στη στοίβα 19
DFS directed graphs explore(u) previsit(u) visited(u)=true for each v Î Γ + (u): if not visited(v): explore(v) postvisit(u) Complexity: E =m previsit(u) pre(u)= clock clock=clock+1 postvisit(u) post(u)= clock clock:=clock+1 DFS(G) clock:=1; for all u Î V: Complexity O(n+m) visited(u)= false for all u Î V: if not visited(u): explore(u) 20
DFS directed graphs: orderings Four types of (directed) edges: Tree edges: προς ένα παιδί στο δέντρο Forward edges: προς έναν απόγονο στο δέντρο (όχι παιδί) Back edges: προς έναν πρόγονο στο δέντρο (ΚΥΚΛΟΣ) Cross edges: προς έναν κόμβο ούτε πρόγονο ούτε απόγονο 21
DFS directed graphs: orderings Για κάθε ζευγάρι κόμβων u και v τα διαστήματα [pre(u), post(u)] και [pre(v), post(v)] είναι είτε ΞΕΝΑ μεταξύ τους ή ΤΟ ΕΝΑ ΠΕΡΙΕΧΕΤΑΙ ΣΤΟ ΆΛΛΟ 22
DFS directed graphs: orderings 4 περιπτώσεις για μια ακμή u v Î Ε: [ u [ v v ] u] [ v [ u u ] v] [ v v ] [ u u ] [ u u ] [ v v ] Tree or Forward edge Back edge Cross edge ΑΔΥΝΑΤΟ (γιατί?) H μόνη περίπτωση με post(u) < post(v) (ΚΥΚΛΟΣ) 23
DFS directed graphs: Cycle Υπάρχει κύκλος αν και μόνο αν στο DFS βρεθεί back ακμή Aν βρεθεί back ακμή (π.χ. CB), τότε υπάρχει κύκλος: ο κύκλος αποτελείται από την back ακμή (CB), και τη διαδρομή από τoν δεύτερο (B) στον πρώτο (C) κόμβο της ακμής στο DFS δέντρο, (CBGFH) Αν υπάρχει κύκλος (π.χ. BGGCB), τότε υπάρχει back ακμή: Κάποιος κόμβος του κύκλου θα ανακαλυφθεί πρώτος στο DFS, έστω ο Β. Όλοι οι άλλοι κόμβοι του κύκλου είναι απόγονοί του (G, F, C). Η ακμή από τον τελευταίο απόγονο στον αρχικό κόμβο είναι back, π.χ. (C,B). 1 2 3 4 5 24
Directed Acyclic Graphs (DAGs) DAG: Ένας προσανατολισμένος γράφος χωρίς κύκλους Εφαρμογές: Προτεραιότητες εργασιών, μαθημάτων,... Δεν μπορεί να αρχίσει μια εργασία αν δεν έχουν ολοκληρωθεί οι προηγούμενές της 25
Directed Acyclic Graphs (DAGs) DAG=Σχέση Μερικής Διάταξης Τοπολογική ταξινόμηση (topological sorting) = μια ολική διάταξη του DAG (ΟΧΙ ΜΟΝΑΔΙΚΗ) (ένας τρόπος εκτέλεσης των εργασιών) π.χ. v 1, v 2, v 3, v 4, v 5, v 6, v 7 = μια διάταξη κόμβων από αριστερά προς τα δεξιά τέτοια ώστε όλες οι ακμές πάνε από αριστερά προς τα δεξιά 26
Directed Acyclic Graphs (DAGs) Ερωτήσεις 1) Είναι ένας προσανατολισμένος γράφος άκυκλος? Είναι αν και μόνο αν το DFS δεν ανακαλύψει back ακμή 2) Να βρεθεί μια τοπολογική ταξινόμηση ενός DAG Mόνο για τις back ακμές (u,v) ισχύει ότι post(u) < post(v) Ένας DAG δεν έχει back ακμές Για όλες τις ακμές u v ενός DAG: post(u) > post(v) Αλγόριθμος τοπολογικής ταξινόμησης = φθίνουσα σειρά post (όλες οι ακμές πάνε προς την ίδια κατεύθυνση) 27
Directed Acyclic Graphs (DAGs) DFS(G) Σειρά επίσκεψης: A B E F G H C D Τοπολογική ταξινόμηση= φθίνουσα σειρά post: A C D B E H F G Λειτουργεί ο αλγόριθμος αν τo DFS ξεκινήσει από οποιοδήποτε κόμβο? 28
Directed Acyclic Graphs (DAGs) DFS(G) Σειρά επίσκεψης: A B E F G H C D Τοπολογική ταξινόμηση= φθίνουσα σειρά post: A C D B E H F G Λειτουργεί ο αλγόριθμος αν τo DFS ξεκινήσει από οποιοδήποτε κόμβο? Είναι ο αλγόριθμος σωστός αν υπάρχει κύκλος ( π.χ. (F,B) Î E )? 29
Directed Acyclic Graphs (DAGs) DAG = No cycles = No back edges = Topological sorting Κάθε DAG έχει μια τουλάχιστον τοπολογική ταξινόμηση Ποια DAGs έχουν ακριβώς μία? Κάθε DAG έχει τουλάχιστον έναν αρχικό κόμβο (d - (u) =0), και ένα τερματικό κόμβο (d + (u) =0) (γιατί?) 30
Aναδρομική DFS Xρησιμοποιεί μια στοίβα S (LIFO=DFS) DFS(G) for all uîv: visited(u)=false for all uîv: if not visited(u): explore(u) explore(u) visited(u)=true for each vîγ(u): if not visited(v): explore(v) 31
Mη-αναδρομική DFS Xρησιμοποιεί μια στοίβα S (LIFO=DFS) DFS(G) for all uîv: ins(u)=false for all uîv: if not ins(u): explore(u) explore(u) PUSH(u), ins(u)=true while NON EMPTY(S): POP(u) visited(u) ~ ins(u) for each vîγ(u): if not ins(v): PUSH(v), ins(v)=true Complexity O(m+n) 32
Mη-αναδρομική DFS: example Visiting order S A B C D Stack S àpush S ß POP A C D E B C D E C D E D E E - E Πρώτος κόμβος Αντίστροφα αλφαβητικά 33
Mη-αναδρομική DFS Xρησιμοποιεί μια στοίβα S (LIFO=DFS) DFS(G) for all uîv: ins(u)=false for all uîv: if not ins(u): explore(u) explore(u) PUSH(u), ins(u)=true while NON EMPTY(S): POP(u) for each vîγ(u): if not ins(v): PUSH(v),inS(v)=true 34
Breadth-First Search (BFS) Αντί για στοίβα (LIFO=DFS) χρησιμοποιεί μια ουρά Q (FIFO=BFS) BFS(G) for all uîv: inq(u)=false for all uîv: if not inq(u): exploreb(u) exploreβ(u) ENQUEUE(u), inq(u)=true while NON EMPTY(Q): DEQUEUE(u) Complexity O(m+n) for each vîγ(u): if not inq(v): ENQUEUE(v),inQ(v)=true 35
BFS - example Visiting order Queue Q DEQUEUE ß S S A C D E A C D E B C D E B D E B E B B - ß ENQUEUE Πρώτος κόμβος Αλφαβητικά 36
Breadth-First Search (BFS) Αντί για στοίβα (LIFO=DFS) χρησιμοποιεί μια ουρά Q (FIFO=BFS) BFS(G) for all uîv: inq(u)=false for all uîv: if not inq(u): exploreb(u) exploreβ(u) ENQUEUE(u), inq(u)=true while NON EMPTY(Q): DEQUEUE(u) for each vîγ(u): if not inq(v): ENQUEUE(v),inQ(v)=true 37
Breadth-First Search (BFS) Αντί για στοίβα (LIFO=DFS) χρησιμοποιεί μια ουρά Q (FIFO=BFS) BFS(G) clock=1 for all uîv: inq(u)=false, par(u)=nil for all uîv: if not inq(u): exploreb(u) exploreβ(u) ENQUEUE(u), inq(u)=true while NON EMPTY(Q): DEQUEUE(u) visit(u) for each vîγ(u): if not inq(v): visit(u) order(u)=clock clock=clock+1 ENQUEUE(v),inQ(v)=true, par(v)=u 38