Τεχνολογίες Υλοποίησης Αλγορίθµων

Σχετικά έγγραφα
Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 4

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 5

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 8

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 3

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Τεχνολογίες Υλοποίησης Αλγορίθµων

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 7

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Οντοκεντρικός Προγραμματισμός

Διοικητική Λογιστική

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 6

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στους Αλγορίθμους Ενότητα 11η Άσκηση - Σταθμισμένος Χρονοπρογραμματισμός Διαστημάτων

Ψηφιακή Επεξεργασία Εικόνων

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 4: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΔΕΝΤΡΑ

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 10

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 2

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 3: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΓΡΑΦΗΜΑΤΑ

Πληροφοριακά Συστήματα Διοίκησης (ΜΒΑ) Ενότητα 1: Δικτυωτή Ανάλυση (Θεωρία Γράφων)

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Ψηφιακή Επεξεργασία Εικόνων

Δομές Δεδομένων Ενότητα 6

Τεχνολογίες Υλοποίησης Αλγορίθµων

Δομές Δεδομένων Ενότητα 3

Εφαρμογές πληροφορικής σε θέματα πολιτικού μηχανικού

Πληροφορική ΙΙ Θεματική Ενότητα 5

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Μηχανολογικό Σχέδιο Ι

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Εισαγωγή στους Υπολογιστές

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Ευφυής Προγραμματισμός

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Ηλεκτρονικοί Υπολογιστές

Βάσεις Περιβαλλοντικών Δεδομένων

Βέλτιστος Έλεγχος Συστημάτων

Κβαντική Επεξεργασία Πληροφορίας

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Διοικητική Λογιστική

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Αλγόριθμοι και πολυπλοκότητα Συγχωνευτική Ταξινόμηση

Ευφυής Προγραμματισμός

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Οντοκεντρικός Προγραμματισμός

Δομές Δεδομένων Ενότητα 2

Κβαντική Επεξεργασία Πληροφορίας

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Ιστορία της μετάφρασης

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Βάσεις Περιβαλλοντικών Δεδομένων

Θέματα Εφαρμοσμένης. Ενότητα 14.2: Η ψήφος στα πρόσωπα. Θεόδωρος Χατζηπαντελής Τμήμα Πολιτικών Επιστημών ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Δομές Δεδομένων Ενότητα 1

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

ΗΛΕΚΤΡΟΝΙΚΗ IΙ Ενότητα 6

Τεχνολογίες Υλοποίησης Αλγορίθµων

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Οντοκεντρικός Προγραμματισμός

ΗΛΕΚΤΡΟΝΙΚΗ IΙ Ενότητα 3

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Δομές Δεδομένων Ενότητα 4

Αλγόριθµοι και Πολυπλοκότητα

Αλγόριθµοι και Πολυπλοκότητα

Βάσεις Περιβαλλοντικών Δεδομένων

Βάσεις Περιβαλλοντικών Δεδομένων

Εισαγωγή στον δομημένο προγραμματισμό

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ. 7 η ενότητα: Αρχεία. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Γραμμική Άλγεβρα και Μαθηματικός Λογισμός για Οικονομικά και Επιχειρησιακά Προβλήματα

Η ΓΝΩΣΗ ΚΑΙ ΤΟ ΠΡΑΓΜΑΤΙΚΟ ΣΤΟΝ ΠΛΑΤΩΝΑ ΚΑΙ ΤΟΝ ΑΡΙΣΤΟΤΕΛΗ

Διδακτική Πληροφορικής

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ψηφιακή Επεξεργασία Σημάτων. Άσκηση 3η. Στυλιανού Ιωάννης. Τμήμα Επιστήμης Υπολογιστών

Transcript:

Τεχνολογίες Υλοποίησης Αλγορίθµων Χρήστος Ζαρολιάγκης Καθηγητής Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Ενότητα 5 1 / 52

Αδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ϱητώς. 2 / 52

Χρηµατοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδηµαϊκά Μαθήµατα στο Πανεπιστήµιο Πατρών» έχει χρηµατοδοτήσει µόνο τη αναδιαµόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράµµατος «Εκπαίδευση και ια Βίου Μάθηση» και συγχρηµατοδοτείται από την Ευρωπαϊκή Ενωση (Ευρωπαϊκό Κοινωνικό Ταµείο) και από εθνικούς πόρους. 3 / 52

Περιεχόµενα Γραφήµατα ϐασικές έννοιες Αναπαράσταση Γραφηµάτων Αναπαράσταση ικτύων Γραφήµατα στην LEDA Βασικοί Αλγόριθµοι Γραφηµάτων 4 / 52

Γραφήµατα ϐασικές έννοιες Γράφηµα G = (V, E): σύνολο κόµβων/κορυφών (nodes/vertices) V σύνολο πλευρών/ακµών (edges/arcs) E V V σχέσεις µεταξύ κόµβων Μια ακµή e = (i, j) E «συσχετίζει» ή «συνδέει» τις κορυφές i και j 1 2 1 3 2 4 5 3 4 5 5 / 52

Γραφήµατα ϐασικές έννοιες 1 3 2 1 2 4 5 3 4 5 Κατευθυνόµενες ακµές κατευθυνόµενο γράφηµα Μη-κατευθυνόµενες ακµές µη κατευθυνόµενο γράφηµα Κατευθυνόµενη ακµή e = (i, j) i: αρχική κορυφή (source/tail) j: τελική κορυφή (target/head) Ακµή e = (i, j) E Η i είναι γειτονική (adjacent) της j Η e προσπίπτει (incident) στις i και j 6 / 52

Γραφήµατα ϐασικές έννοιες 1 3 2 1 Συµβολισµός n = V, m = E 2 4 5 3 4 5 Μη κατευθυνόµενα γραφήµατα, βαθµός (degree) κορυφής i: d i = # προσπιπτουσών ακµών της κορυφής i Κατευθυνόµενα γραφήµατα βαθµός-εισόδου (in-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως τελική d in i βαθµός-εξόδου (out-degree) κορυφής i: = # προσπιπτουσών ακµών που έχουν την i ως αρχική d out i Θεώρηµα Euler (ι) n i=1 d i = 2m (ιι) n i=1 din i = n i=1 dout i = m 7 / 52

Γραφήµατα Αναπαράσταση Μητρώο Γειτνίασης (adjacency matrix) Λίστες Γειτνίασης (adjacency lists) Με χρήση πινάκων (Packed-Adjacency Lists) Με χρήση γραµµικών λιστών (Linked-Adjacency Lists) Εµµεση αναπαράσταση (LEDA) 8 / 52

Γραφήµατα Αναπαράσταση Μητρώου Γειτνίασης 2 1 1 3 2 4 5 3 4 5 Μητρώο A διαστάσεων n n: { 1 αν (i, j) E A(i, j) = 0 αλλιώς 1 2 3 4 5 1 0 1 0 0 0 2 3 4 5 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 2 3 4 5 1 0 1 0 0 0 2 3 4 5 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 Χώρος: O(n 2 ) bytes ή bits Χρόνος προσδιορισµού ϐαθµού κορυφής: Θ(n) Χρόνος εισαγωγής/διαγραφής ακµής: O(1) 9 / 52

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[1] h[2] h[3] h[4] h[5] h[6] 1 2 1 l 2 1 4 5 3 5 4 3 3 2 4 5 3 4 5 l h[1] h[2] h[3] h[4] h[5] h[6] 2 3 4 5 3 4 Μονοδιάστατοι πίνακες h[0..n + 1] και l[0..m], όπου M = m 1 (M = 2m 1) αν G είναι κατευθυνόµενο (µη κατευθυνόµενο) Οργάνωση πίνακα l[0..m]: οι πρώτες d1 out (d 1 ) ϑέσεις περιέχουν όλες τις κορυφές που είναι γειτονικές στην κορυφή 1, οι επόµενες d2 out (d 2 ) ϑέσεις περιέχουν όλες τις κορυφές που είναι γειτονικές στην κορυφή 2, κοκ Οργάνωση πίνακα h[0..n + 1]: οι γειτονικές κορυφές της κορυφής i ϐρίσκονται στις ϑέσεις l[h[i]], l[h[i] + 1],..., l[h[i + 1] 1], όπου h[i] < h[i + 1] 10 / 52

Γραφήµατα Αναπαράσταση µε χρήση πινάκων h[1] h[2] h[3] h[4] h[5] h[6] 1 2 1 l 2 1 4 5 3 5 4 3 3 2 4 5 3 4 5 l h[1] h[2] h[3] h[4] h[5] h[6] 2 3 4 5 3 4 Χώρος: (n + 1) log(2m + 1) + 2m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O(1) Χρόνος εισαγωγής/διαγραφής ακµής: O(n + m) 11 / 52

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών Κάθε σύνολο γειτονικών κορυφών γραµµική λίστα Κορυφή i αποθηκεύεται στη ϑέση h[i] ενός πίνακα h h[i] γραµµική λίστα κορυφής i 12 / 52

Γραφήµατα Αναπαράσταση µε χρήση γραµµικών λιστών 1 2 3 4 5 1 2 3 4 5 2 3 4 5 3 1 1 2 5 4 0 0 0 0 0 0 0 0 0 0 1 2 4 3 4 2 4 4 3 3 3 5 5 5 Χώρος: (n + 1)sizeof(pointer) + 2m log n = O((n + m) log n) bits = O(n + m) bytes Χρόνος προσδιορισµού ϐαθµού κορυφής: O(d out i ) Χρόνος εισαγωγής/διαγραφής ακµής: O(1) / O(d out i ) 13 / 52

Αναπαράσταση ικτύων ίκτυο: γράφηµα του οποίου οι κορυφές/ακµές συσχετίζονται µε κάποια τιµή Μητρώο Γειτνίασης: επιπρόσθετο µητρώο W έτσι ώστε { weight(i, j) αν (i, j) E W(i, j) = NoEdge αλλιώς όπου NoEdge ισούται µε κάποια προεπιλεγµένη τιµή (π.χ. 0 ή ) Λίστες Γειτνίασης - χρήση πινάκων: κάθε στοιχείο του πίνακα l περιέχει ένα Ϲεύγος (κορυφή, τιµή) Λίστες Γειτνίασης - χρήση γραµµικών λιστών: κάθε στοιχείο µιας λίστας περιέχει ένα επιπρόσθετο πεδίο το οποίο αποθηκεύει την τιµή της ακµής 14 / 52

Γραφήµατα στην LEDA Κατευθυνόµενα γραφήµατα: graph, GRAPH<vtype,etype> Μη κατευθυνόµενα γραφήµατα: ugraph, UGRAPH<vtype,etype> Υλοποίηση των τύπων γραφηµάτων στην LEDA: αναπαράσταση λιστών γειτνίασης µε χρήση γραµµικών λιστών (χρησιµοποιούνται διπλά διασυνδεδεµένες λίστες κορυφών και ακµών) Απαιτήσεις χώρου για τον τύπο graph: O(1) + 44m + 52n bytes Απαιτήσεις χώρου για τον τύπο GRAPH<T1,T2>: O(1) + 44m + 52n + sizeof(t1)n + sizeof(t2)m bytes 15 / 52

Γραφήµατα στην LEDA Ορισµός γραφηµάτων, κορυφών και ακµών graph G; node v,w; edge e,f; // G is initialized to the empty graph // initial values are unspecified for // nodes and edges, however... node u=nil; // we can initialize a node or edge to the // special value nil. // nil is not a node or edge of any graph. 16 / 52

Γραφήµατα στην LEDA Επαναλήπτες Γραφηµάτων forall_nodes(v,g) { } forall_edges(e,g) { } // iterates over all edges e out of v, // i.e., source(e)=v forall_out_edges(e,v) { } forall_adj_edges(e,v) { } // iterates over all nodes of G // iterates over all edges of G // iterates over all edges e incident to v, // i.e., target(e)=v forall_in_edges(e,v) { } // iterates over all edges e incident to and from v forall_inout_edges(e,v) { } επίσης κλάσεις τύπου Iterator, µε χρήση του γνωστού σχεδιαστικού προτύπου Iterator δείτε το εγχειρίδιο της LEDA 17 / 52

Γραφήµατα στην LEDA Χρήση Επαναληπτών int m = 0; forall_edges(e,g) m++; // counts the number of edges in G // this number is also available as // G.number_of_edges() 18 / 52

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών και Ακµών (Node and Edge arrays) Επιτρέπουν την συσχέτιση πληροφορίας (π.χ. κόστος, id) µε κορυφές και ακµές // Name is indexed by the nodes of G; each entry // of Name is initialized to the empty string. node_array<string> Name(G); // Length is indexed by the edges of G; each entry // of Length is initialized with the value 1. edge_array<int> Length(G,1); //... Name[v] = "Patra"; Length[e] = 37; 19 / 52

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παράδειγµα: ανάθεση αριθµών από 0 µέχρι n 1 στις κορυφές του G node_array<int> Number(G); int count = 0; forall_nodes(v,g) Number[v] = count++; 20 / 52

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Παραµετρικά Γραφήµατα Εναλλακτική µέθοδος στους πίνακες κορυφών και ακµών GRAPH<string,int> H; H[v] = "Patra"; H[e] = 37; // v must be a node of H // e must be an edge of H 21 / 52

Γραφήµατα στην LEDA Συσχετισµός Πληροφορίας µε Κορυφές/Ακµές Πίνακες Κορυφών/Ακµών και Παραµετρικά Γραφήµατα Οι πίνακες κορυφών και ακµών χρησιµοποιούνται µόνο για στατικά γραφήµατα, δηλ. µία νέα κορυφή (ακµή) δεν ϑα έχει ένα αντίστοιχο στοιχείο στον πίνακα κορυφών (ακµών) Τα παραµετρικά γραφήµατα είναι πλήρως δυναµικά Ενας οποιοσδήποτε αριθµός πινάκων κορυφών και ακµών µπορούν να ορισθούν για ένα γράφηµα 22 / 52

Γραφήµατα στην LEDA ηµιουργία Γράφηµα µε δύο κορυφές και καθόλου ακµές graph G; G.new_node(); G.new_node(); node v; forall_nodes(v,g) //... do something 23 / 52

Γραφήµατα στην LEDA ηµιουργία ηµιουργία ακµής απαιτεί προσδιορισµό αρχικής και τελικής κορυφής node w = G.first_node(); G.new_edge(w, G.succ_node(w)); Παρατήρηση: Η LEDA διατάσσει εσωτερικά τις κορυφές (ακµές) ενός γραφήµατος G σύµφωνα µε την σειρά που αυτές προστέθηκαν στο G. 24 / 52

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών Η µέθοδος G.new_node() όχι µόνο προσθέτει µια νέα κορυφή στο G, αλλά και την επιστρέφει // creation of our example digraph graph G; 2 node v1 = G.new_node(); node v2 = G.new_node(); node v3 = G.new_node(); node v4 = G.new_node(); node v5 = G.new_node(); G.new_edge(v1,v2); G.new_edge(v2,v3); G.new_edge(v3,v4); G.new_edge(v4,v3); G.new_edge(v3,v5); G.new_edge(v5,v4); Αποθήκευση γραφήµατος σε αρχείο G.write("graph.gw"); 1 3 4 5 2 1 3 4 5 25 / 52

Γραφήµατα στην LEDA ηµιουργία Ενας καλύτερος τρόπος δηµιουργίας ακµών Αν το G είναι παραµετρικό, τότε µπορούµε να συσχετίσουµε πληροφορία µε τις κορυφές και τις ακµές κατά τη διάρκεια της δηµιουργίας του 1 3 2 1 // creation of our example digraph // with info on nodes and edges 2 4 5 3 4 5 GRAPH<int,int> G; node v1 = G.new_node(1); node v2 = G.new_node(2); node v3 = G.new_node(3); node v4 = G.new_node(4); node v5 = G.new_node(5); G.new_edge(v1,v2,10); G.new_edge(v2,v3,15); G.new_edge(v3,v4,25); G.new_edge(v4,v3,7); G.new_edge(v3,v5,0); G.new_edge(v5,v4,37); 26 / 52

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου ηµιουργία ενός ισοµορφικού αντιγράφου H ενός γραφήµατος G, έτσι ώστε κάθε κορυφή και ακµή του H να γνωρίζει την αυθεντική της στο G 27 / 52

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου v copy_in_h[v] w G H[w] H Χρήση παραµετρικού γραφήµατος για το H και πίνακα κορυφών για το G v G : H[copy_in_H[v]]=v w H : copy_in_h[h[w]]=w 28 / 52

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου #include <iostream> #include <LEDA/graph.h> void CopyGraph(GRAPH<node,edge>& H, const graph& G) { node v; edge e; H.clear(); // reset H to the empty graph node_array<node> copy_in_h(g); // associates nodes of G with // their copies in H forall_nodes(v,g) copy_in_h[v] = H.new_node(v); forall_edges(e,g) H.new_edge(copy_in_H[source(e)],copy_in_H[target(e)],e); } 29 / 52

Γραφήµατα στην LEDA δηµιουργία ισοµορφικού αντίγραφου int main() { graph G; G.read("graph.gw"); GRAPH<node,edge> H; } CopyGraph(H,G); cout << endl; cout << "n_g = " << G.number_of_nodes() << endl; cout << "n_h = " << H.number_of_nodes() << endl; cout << "m_g = " << G.number_of_edges() << endl; cout << "m_g = " << H.number_of_edges() << endl; return 0; 30 / 52

Γραφήµατα στην LEDA Πίνακες Κορυφών/Ακµών Υλοποιούνται µε τους συνήθεις πίνακες χρόνος αρχικοποίησης # κορυφών/ακµών Κορυφές/Ακµές ενός γραφήµατος αριθµούνται σύµφωνα µε τη σειρά δηµιουργίας τους, αρχίζοντας από το 0 [αριθµός = index] Η αρίθµηση µιας κορυφής (ακµής) v (e) είναι διαθέσιµη ως index(v) (index(e)) Προσπέλαση στοιχείου A[v] = Προσπέλαση της δοµής αναπαράστασης της κορυφής v για τον προσδιορισµό του index(v) Προσπέλαση του στοιχείου A[index(v)] 31 / 52

Γραφήµατα στην LEDA Node/Edge maps Παρόµοια µε node/edge arrays Υλοποιούνται µε χρήση κατακερµατισµού Αρχικοποίηση σε O(1) χρόνο 32 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος s 8 7 6 2 3 4 10 1 3 4 8 6 5 5 10 9 7 9 2 1 33 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος void dfs(node s, node_array<bool>& reached, list<node>& L) { L.append(s); reached[s] = true; node v; forall_adj_nodes(v,s) if (!reached[v] ) dfs(v,reached,l); } list<node> DFS(const graph&, node v, node_array<bool>& reached) { list<node> L; dfs(v,reached,l); return L; } 34 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος Κατηγοριοποίηση ακµών ιατήρηση δύο αριθµών για κάθε κορυφή v: dfsnum[v]: χρόνος (πρώτης) ανακάλυψης compnum[v]: χρόνος εγκατάλειψης e = (v, w): καλείται ακµή δένδρου αν η dfs(w,...) καλείται όταν η e εξετάζεται στην dfs(v,...) Μια ακµή (v, w) είναι ακµή δένδρου ή εµπρός ακµή ανν dfsnum[v] < dfsnum[w] και compnum[v] > compnum[w] πίσω ακµή ανν dfsnum[v] > dfsnum[w] και compnum[v] < compnum[w] διασυνδετική ακµή ανν dfsnum[v] > dfsnum[w] και compnum[v] > compnum[w] 35 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος list<edge> DFS_NUM(const graph& G, node_array<int>& dfsnum, node_array<int>& compnum) { list<edge> T; dfsnum_counter = compnum_counter = 0; dfsnum.init(g,-1); // declares all nodes unreached node v; forall_nodes(v,g) if (dfsnum[v] == -1) dfs(v,dfsnum,compnum,t); } return T; 36 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Βάθος static int dfsnum_counter; static int compnum_counter; static void dfs(node v, node_array<int>& dfsnum, node_array<int>& compnum, list<edge>& T) { dfsnum[v] = ++dfsnum_counter; edge e; forall_adj_edges(e,v) { node w = target(e); if (dfsnum[w] == -1) { T.append(e); dfs(w,dfsnum,compnum,t); } } } compnum[v] = ++compnum_counter; 37 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Πλάτος s 1 2 3 2 5 7 0 1 1 5 4 4 10 9 3 6 8 1 2 3 38 / 52

Γραφήµατα στην LEDA Αναζήτηση Πρώτα κατά Πλάτος void BFS(const graph&, node s, node_array<int>& dist) { queue<node> Q; node v,w; forall_nodes(w,g) dist[w] = -1; } dist[s] = 0; Q.append(s); while (!Q.empty() ) { v = Q.pop; forall_adj_nodes(w,v) if (dist[w] < 0) { Q.append(w); dist[w] = dist[v]+1; } } 39 / 52

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ελεχγος εαν ένα δεδοµένο κατευθυνόµενο γράφηµα G = (V, E) είναι άκυκλο Αν ναι, υπολογισµός της τοπολογικής διάταξης ή ταξινόµησης: εύρεση αρίθµησης l : V IN τέτοια ώστε (x, y) E, l(x) < l(y) 40 / 52

Γραφήµατα στην LEDA Τοπολογική ιάταξη Αλγόριθµος: επαναληπτική διαδικασία Σε κάθε επανάληψη, επιλογή κορυφής v µε µηδενικό ϐαθµό-εισόδου Ανάθεση στην v της επόµενης τιµής στην αρίθµηση, και διαγραφή της µαζί µε τις εξερχόµενες ακµές της Αν σε κάποια επανάληψη δεν υπάρχουν κορυφές µηδενικού ϐαθµού-εισόδου, τότε η επαναληπτική διαδικασία τερµατίζει αλλιώς, συνεχίζει Αν στον τερµατισµό το G είναι το κενό γράφηµα, τότε είναι άκυκλο αλλιώς, περιέχει κύκλο Χρόνος εκτέλεσης: O(n + m) - γιατί ; 41 / 52

Γραφήµατα στην LEDA Τοπολογική ιάταξη Ζητείται συνάρτηση bool TOPSORT(const graph& G, node_array<int>& ord); η οποία επιστρέφει true αν το G είναι άκυκλο, αλλιώς false. Στην πρώτη περίπτωση επιστρέφει επίσης την τοπολογική διάταξη των κορυφών του G στον πίνακα ord Πώς υλοποιείται ο αλγόριθµος χωρίς διαγραφή του γραφήµατος ; 42 / 52

Γραφήµατα στην LEDA Τοπολογική ιάταξη bool TOPSORT(const graph& G,node_array<int>& ord) { // initialization node_array<int> INDEG(G); queue<node> ZEROINDEG; node v,w; forall_nodes(v,g) if ( (INDEG[v] = G.indeg(v)) == 0 ) ZEROINDEG.append(v); // removing nodes of indegree zero int count = 0; ord.init(g); while (!ZEROINDEG.empty()) { v = ZEROINDEG.pop(); ord[v] = ++count; forall_out_edges(e,v) { node w = G.target(e); if ( --INDEG[w] == 0 ) ZEROINDEG.append(w); } } return (count == G.number_of_nodes()); } 43 / 52

Γραφήµατα στην LEDA Γεννήτριες Γραφηµάτων ηµιουργία γραφηµάτων µε ακολουθίες λειτουργιών new_node και new_edge είναι αρκετά κουραστική (και ϐαρετή) Η LEDA παρέχει µια αρκετά µεγάλη συλλογή από γεννήτριες γραφηµάτων ηµιουργία πλήρους γραφήµατος G µε n κορυφές: v, w G, η ακµή (v, w) ανήκει στο G complete_graph(graph& G, int n); ηµιουγία τυχαίου γραφήµατος µε n κορυφές και m ακµές random_graph(graph& G, int n, int m); διάφορες άλλες γεννήτριες οι οποίες κατασκευάζουν ειδικά γραφήµατα, π.χ. επίπεδα (planar), πλέγµατα (grids), διµερή (bipartite), κλπ 44 / 52

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων Η κλήση random_graph(graph& G, int n, int m, bool no_anti_parallel_edges, bool loopfree, bool no_parallel_edges); δηµιουργεί ένα τυχαίο γράφηµα G µε n κορυφές και m ακµές σύµφωνα µε το µοντέλο G n,m Μια τυχαία ακµή επιλέγεται από ένα σύνολο C που ορίζεται ως εξής Το C αρχικοποιείται µε το σύνολο όλων των n 2 Ϲευγών των κορυφών, αν loopfree = false, ή µε το σύνολο όλων των n(n 1) Ϲευγών διαφορετικών κορυφών, αν loopfree = true Η επιλογή ενός Ϲεύγους (v, w) από το C συνεπάγεται τη διαγραφή του από το C αν no_parallel_edges = true, και το αντίθετο Ϲεύγος (w, v) διαγράφεται από το C αν no_anti_parallel_edges = true 45 / 52

Γραφήµατα στην LEDA δηµιουργία τυχαίων γραφηµάτων Ειδικές περιπτώσεις της random_graph // The following pairs of calls are equivalent random_graph(g,n,m); random_graph(g,n,m,false,false,false); random_simple_graph(g,n,m); random_graph(g,n,m,false,false,true); random_simple_loopfree_graph(g,n,m); random_graph(g,n,m,false,true,true); random_simple_undirected_graph(g,n,m); random_graph(g,n,m,true,true,true); 46 / 52

Γραφήµατα στην LEDA δηµιουργία γραφηµάτων Η συνάρτηση void test_graph(graph& G) δηµιουργεί διαλογικά ένα γράφηµα που ορίζεται από τον χρήστη 47 / 52

Τέλος Ενότητας 48 / 52

Σηµείωµα Ιστορικού Εκδόσεων Εργου Το παρόν έργο αποτελεί την έκδοση 1.0. 49 / 52

Σηµείωµα Ιστορικού Εκδόσεων Εργου Copyright Πανεπιστήµιο Πατρών, Χρήστος Ζαρολιάγκης, 2014. «Τεχνολογίες Υλοποίησης Αλγορίθµων». Εκδοση: 1.0. Πάτρα 2014. ιαθέσιµο από τη δικτυακή διεύθυνση: https://eclass.upatras.gr/courses/ceid1084 50 / 52

Σηµείωµα Ιστορικού Εκδόσεων Εργου Το παρόν υλικό διατίθεται µε τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εµπορική Χρήση, Οχι Παράγωγα Εργα 4.0 [1] ή µεταγενέστερη, ιεθνής Εκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. ϕωτογραφίες, διαγράµµατα κ.λ.π., τα οποία εµπεριέχονται σε αυτό. [1] http://creativecommons.org/licenses/by-nc-nd/4.0 Ως Μη Εµπορική ορίζεται η χρήση: που δεν περιλαµβάνει άµεσο ή έµµεσο οικονοµικό όφελος από την χρήση του έργου, για το διανοµέα του έργου και αδειοδόχο που δεν περιλαµβάνει οικονοµική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανοµέα του έργου και αδειοδόχο έµµεσο οικονοµικό όφελος (π.χ. διαφηµίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος µπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιµοποιεί το έργο για εµπορική χρήση, εφόσον αυτό του Ϲητηθεί. 51 / 52

ιατήρηση Σηµειωµάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού ϑα πρέπει να συµπεριλαµβάνει : το Σηµείωµα Αναφοράς το Σηµείωµα Αδειοδότησης τη δήλωση ιατήρησης Σηµειωµάτων το Σηµείωµα Χρήσης Εργων Τρίτων (εφόσον υπάρχει) µαζί µε τους συνοδευόµενους υπερσυνδέσµους 52 / 52