ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ. Τμήμα Μηχανικών Η/Υ Τηλεπικοινωνιών και Δικτύων ΔΙΠΛΩΜΑΤΙ ΚΗ ΕΡΓΑΣΙΑ

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ. Τμήμα Μηχανικών Η/Υ Τηλεπικοινωνιών και Δικτύων ΔΙΠΛΩΜΑΤΙ ΚΗ ΕΡΓΑΣΙΑ"

Transcript

1 ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ Τμήμα Μηχανικών Η/Υ Τηλεπικοινωνιών και Δικτύων ΔΙΠΛΩΜΑΤΙ ΚΗ ΕΡΓΑΣΙΑ ΤΙΤΛΟΣ: ΥΛΟΠΟΙΗΣΗ ΚΑΙ Ε ΚΤΙΜΗΣΗ ΑΛΓΟΡΙΘΜΩΝ ΣΤΟ ΠΕΡΙΒΑΛΛΟΝ LEDA ΣΑ ΚΕΛΛΑΡΙΟΣ ΧΡΗΣΤΟΣ ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ: ΠΑΝΑΓΙΩΤΗΣ ΜΠΟΖΑΝΗΣ Α ΚΑΔΗΜΑΙ ΚΟ ΕΤΟΣ:

2 1

3 2 ΠΕΡΙΛΗΨΗ Αντικείμενο της εργασίας είναι αφενός η υλοποίηση γνωστών αλγορίθμων, με τη γλώσσα προγραμματισμού C++ κάνοντας χρήση της βιβλιοθήκης LEDA, αφετέρου η εκτίμηση αυτών συγκρίνοντας τους με τις ήδη υπάρχουσες, έτοιμες συναρτήσεις του πακέτου LEDA με απώτερο σκοπό την ανάδειξη της αποτελεσματικότητά του. Συγκεκριμένα, υλοποιούνται πλήθος γνωστών αλγορίθμων και κατόπιν γίνονται χρονικές συγκρίσεις με τις αντίστοιχες συναρτήσεις της LEDA για διάφορα μεγέθη εισόδου. Οι εκτιμήσεις αυτές δε, αναδεικνύουν την καλύτερη ποιότητα - αποτελεσματικότητα των συναρτήσεων του πακέτου LEDA σε σχέση με άλλες υλοποιήσεις πολλών χρηστών, των ίδιων αλγορίθμων.

4 3 ΠΕΡΙΕΧΟΜΕΝΑ ΕΙΣΑΓΩΓΗ... 4 ΚΕΦΑΛΑΙΟ 1. ΓΕΝΙΚΗ ΕΠΙΣΚΟΠΗΣΗ ΤΗΣ LEDA ΤΙ ΕΙΝΑΙ Η LEDA ΤΕΧΝΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ...Error! Bookmark not defined ΛΕΙΤΟΥΡΓΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΤΗΣ LEDA ΠΑΡΑΔΕΙΓΜΑΤΑ ΣΥΝΑΡΤΗΣΕΩΝ - ΚΛΑΣΕΩΝ ΤΗΣ LEDA... 7 ΚΕΦΑΛΑΙΟ 2. ΑΝΑΛΥΣΗ ΚΑΙ ΣΥΓΚΡΙΣΗ ΑΛΓΟΡΙΘΜΩΝ ΑΛΓΟΡΙΘΜΟΣ MERGESORT ΑΛΓΟΡΙΘΜΟΣ KNAPSACK ΑΛΓΟΡΙΘΜΟΣ TASKSCHEDULING ΑΛΓΟΡΙΘΜΟΣ DFS_MATRIX ΑΛΓΟΡΙΘΜΟΣ DFS_LIST ΑΛΓΟΡΙΘΜΟΣ BFS_MATRIX ΑΛΓΟΡΙΘΜΟΣ TOPOLSORTLIST ΑΛΓΟΡΙΘΜΟΣ TRANSCLOSURE ΑΛΓΟΡΙΘΜΟΣ WARSHALL ΑΛΓΟΡΙΘΜΟΣ GABOW ΑΛΓΟΡΙΘΜΟΣ TARJAN ΑΛΓΟΡΙΘΜΟΣ PRIM ΑΛΓΟΡΙΘΜΟΣ DIJSTRA ΑΛΓΟΡΙΘΜΟΣ BELLMAN_FORD ΑΛΓΟΡΙΘΜΟΣ FLOYD ΑΛΓΟΡΙΘΜΟΣ GOLDBERG - TARJAN ΑΛΓΟΡΙΘΜΟΣ LARGESTCOMMONSUB SEQ ΑΛΓ ΟΡΙΘΜΟΣ HUFFMAN ΑΛΓΟΡΙΘΜΟΣ BOYER MOORE...71 ΚΕΦΑΛΑΙΟ 3. ΣΥΜΠΕΡΑΣΜΑΤΑ...75 ΒΙΒΛΙΟΓΡΑΦΙΑ... 77

5 4 ΕΙΣΑΓΩΓΗ Στόχος της εργασίας είναι η υλοποίηση και εκτίμηση γνωστών αλγορίθμων, στο περιβάλλον LEDA. Τα αποτελέσματα δε των εκτιμήσεων αυτών, μπορούν να χρησιμοποιηθούν αφενός στην καταγραφή συμπεριφοράς κάθε αλγορίθμου ξεχωριστά, αφετέρου στην παραγωγή κρίσιμων πορισμάτων όσον αφορά την αποτελεσματικότητα της βιβλιοθήκης LEDA. Η μεθοδολογία που ακολουθείται για κάθε αλγόριθμο είναι η εξής: Αρχικά, γίνεται η ανάλυση λειτουργίας του αλγορίθμου, δηλαδή εξηγείται τι ακριβώς κάνει ο αλγόριθμος ή ποιο πρόβλημα λύνει. Για μεγαλύτερη κατανόηση, δίνεται και ένα παράδειγμα - στιγμιότυπο τρεξίματος του αλγορίθμου. Έπειτα, παρουσιάζεται μια υλοποίηση του αλγορίθμου σε γλώσσα προγραμματισμού C++, με χρήση της βιβλιοθήκης LEDA. Τέλος, γίνεται η εκτίμηση του αλγορίθμου, παραθέτοντας διάγραμμα στο οποίο απεικονίζονται οι χρόνοι των διαφόρων υλοποιήσεων, αν τυχόν υπάρχουν. Ακολουθεί η επεξήγηση του διαγράμματος ώστε να γίνει σαφές γιατί η εκάστοτε υλοποίηση παρουσιάζει τα αντίστοιχα αποτελέσματα. Στο ΚΕΦΑΛΑΙΟ 1, γίνεται μία γενική επισκόπηση της βιβλιοθήκης LEDA, παρουσιάζοντας τι ακριβώς είναι, που χρησιμοποιείται, οι τεχνικές - λειτουργικές προδιαγραφές και τα πλεονεκτήματά της. Τέλος, δίνονται παραδείγματα δομών και συναρτήσεων αυτών, ώστε ο αναγνώστης να πάρει μια γεύση από το περιβάλλον της LEDA. Στο ΚΕΦΑΛΑΙΟ 2, ακολουθεί το βασικό μέρος της εργασίας, ήτοι η παρουσίαση κάθε αλγορίθμου με τη μεθοδολογία που αναφέρθηκε παραπάνω. Στο ΚΕΦΑΛΑΙΟ 3, δίνονται τα τελικά συμπεράσματα της όλης διαδικασίας, τα οποία είναι αποτέλεσμα των υλοποιήσεων και των συγκρίσεων που έγιναν σ αυτές. Δίνονται πλεονεκτήματα ή μειονεκτήματα δομών και αναφέρεται κατά πόσο εύκολη είναι η υλοποίηση αλγορίθμων σε περιβάλλον LEDA.

6 5 ΚΕΦΑΛΑΙΟ 1. ΓΕΝΙ ΚΗ ΕΠΙΣ ΚΟΠΗΣΗ ΤΗΣ LEDA 1.1. ΤΙ ΕΙΝΑΙ Η LEDA Η LEDA είναι βιβλιοθήκη της γλώσσας προγραμματισμού C++ για αποτελεσματικούς τύπους δεδομένων και αλγορίθμους. Προσφέρει αλγόριθμους έχοντας μεγάλο βάθος γνώσεως στα πεδία των προβλημάτων γραφημάτων και δικτύων, γεωμετρικών υπολογισμών, συνδυαστικών προβλημάτων και άλλα. Είναι υλοποιημένη ακολουθώντας την αντικειμενοστρεφή προσέγγιση. Χρησιμοποιείται σε πεδία εφαρμογών όπως τηλεπικοινωνίες, GIS, VLSI σχεδιασμό, χρονοπρογραμματισμό, υπολογιστική βιολογία και σε οποιοδήποτε πεδίο σχετικό με σχεδιασμό υπολογιστικών προβλημάτων. Προσφέρει πλήθος αλγορίθμων δίνοντας τη δυνατότητα διαχείρισης με μεγάλη ευκολία αντικειμένων όπως γραφήματα, σειρές, λεξικά, δέντρα, ροές, συντομότερα μονοπάτια και πολλά άλλα. Έτσι, είναι εύκολο να εφαρμοστεί σε όλα τα software projects που χρησιμοποιούν αντικειμενοστρεφή προγραμματισμό. Μάλιστα, διατίθεται για διαφορετικά λειτουργικά συστήματα ΤΕΧΝΙ ΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ Η LEDA παρέχει δομές δεδομένων και αλγόριθμους που επιτρέπουν είτε στους χρήστες είτε σε δεδομένα να τα χρησιμοποιούν δυναμικά, αλλάζοντάς τους παραμέτρους. Προσφέρει επαναληπτικές διαδικασίες τόσο για δομές δεδομένων όσο και για τύπους αριθμητικών δεδομένων. Η εγκυρότητα των αποτελεσμάτων είναι πάντοτε εξασφαλισμένη. Μάλιστα, αρκετοί αλγόριθμοι αποδεικνύουν την εγκυρότητα αυτή με απλές και κατανοητές ρουτίνες που στηρίζονται σε βασικά θεωρήματα μαθηματικών. Το error handling επιτυγχάνεται από C++ exceptions ή μέσω standard error output. Τέλος, η LEDA παρέχει τη δικιά της διαχείριση μνήμης (υπάρχει επιλογή ενεργοποίησης η όχι), η οποία αυξάνει την χρονική και χωρική (μνήμη) αποτελεσματικότητα των τύπων δεδομένων.

7 ΛΕΙΤΟΥΡΓΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ Η LEDA περιέχει τύπους περιεχομένων δεδομένων όπως λίστες, πίνακες, χάρτες, λεξικά, ουρές προτεραιοτήτων αλλά και βασικούς τύπους δεδομένων όπως αλγόριθμους αναζήτησης ή ταξινόμησης και φυσικά γεωμετρικούς. Προσφέρει μια μεγάλη ποικιλία αλγορίθμων γραφημάτων και δικτύων όπως αναζήτηση κατά βάθος, αναζήτηση κατά πλάτος, συντομότερα μονοπάτια, ελάχιστα επικαλύπτοντα δέντρα, στοίχιση απλή ή βεβαρημένη, ροές και άλλους πολλούς. Επιπλέον, περιέχει εξειδικευμένα μοντέλα καλύπτοντας πεδία όπως η κρυπτογραφία, συμπίεση, ισομορφισμό γραφημάτων - υπογραφημάτων και στοίχιση συμβολοσειρών. Φυσικά όλες οι κλάσεις και αλγόριθμοι της LEDA είναι τεκμηριωμένοι με λεπτομέρεια, οι οποίες τεκμηριώσεις είναι online προσβάσιμες στο επίσημο site της LEDA ΠΛΕΟΝΕ ΚΤΗΜΑΤΑ ΤΗΣ LEDA Ευκολία στη χρήση Η LEDA είναι εύκολη στη χρήση ακόμα και σε καθημερινή διαδικασία ανάπτυξης. Έχει ενορατικό class interface διευκολύνοντας τον χρήστη. Ονόματα κλάσεων, συναρτήσεων και αλγορίθμων είναι καλά τεκμηριωμένα. Επίσης, η πολυπλοκότητα χρόνου και χώρου είναι σαφές ορισμένη Αποτελεσματικότητα Παρέχει μεγάλο εύρος από αποτελεσματικούς αλγορίθμους, πολλούς από τους οποίους έχει αποδειχθεί να συγκλίνουν ασυμπτωτικά. Δίνει τα πιο αξιόπιστα αποτελέσματα σε σχέση με άλλες παρόμοιες βιβλιοθήκες. Η ενασχόλησή της με εξειδικευμένες αλγοριθμικές μεθοδολογίες και σωστά υλοποιημένους αλγορίθμους και δομές δεδομένων δημιουργεί πρόσθετη αξία και καινοτομίες Αξιοπιστία Οι υλοποιημένοι αλγόριθμοι της LEDA είναι αξιόπιστοι καθώς τα φέρνουν εις πέρας παράγοντας σωστά αποτελέσματα ακόμα και με «κακές» εισόδους. Παρέχοντας διαφορετικό αριθμών πυρήνων, αποτρέπονται προβλήματα που δημιουργούνται από πεπερασμένης ακρίβειας υπολογισμούς. Η LEDA δοκιμάζεται επιτυχώς κατά τη διάρκεια μιας

8 7 αξιόπιστης αντικειμενοστραφούς ανάπτυξης καθώς και από το μεγάλο πλήθος χρηστών της. Τα αποτελέσματα των αλγορίθμων είναι πάντοτε εγγυημένα σωστά. Επιπροσθέτως, η LEDA εκτελεί και run-time error έλεγχο Κλιμάκωση Η LEDA σα βιβλιοθήκη είναι εύκολα επεκτάσιμη και «τρέχει» σε διάφορα λειτουργικά συστήματα όπως Windows, Unix ή Linux με τους περισσότερους compilers της C++ διαθέσιμους. Είναι ανεξάρτητη από βιβλιοθήκες λογισμικού όπως η MFC ή STL και υπερτερεί αυτών σεβόμενο τη συνέχεια του προϊόντος ΠΑΡΑΔΕΙΓΜΑΤΑ ΣΥΝΑΡΤΗΣΕΩΝ - ΚΛΑΣΕΩΝ ΤΗΣ LEDA Παρακάτω αναφέρονται επιγραμματικά οι κυριότεροι τύποι δεδομένων της βιβλιοθήκης καθώς και μερικές σημαντικές συναρτήσεις αυτών. One Dimensional Arrays Stacks Queues 1. array<e> A(int a, int b) : Δημιουργεί πίνακα A στοιχείων τύπου Ε, με όρια του πίνακα [a,...,b]. 2. E& A[int x] : Επιστρέφει το A(x). 3. void A.copy(int x, int y) : Θέτει A(x)=A(y). 4. void A.swap(int i, int j) : Ανταλλάζει τις τιμές των A(i) και A(j). 5. void A.sort() : Εκτελεί τη γραμμική διάταξη των στοιχείων του A. 1. stack<e> S : Δημιουργία στοίβας S στοιχείων τύπου Ελ 2. top() : Επιστρέφει το κορυφαίο στοιχείο της στοίβας. 3. push(e x) : Εισάγει το x στην κορυφή της στοίβας. 1. queue<e> Q : αρχικοποιεί μία κενή ουρά. 2. pop() : διαγράφει και επιστρέφει το κορυφαίο στοιχείο. 3. append(x) : εισάγει το x στο τέλος.

9 8 Bounded Stacks, Bounded Queues 1. b_stack<e> S(n) :αρχικοποιεί μία κενή στοίβα, μεγέθους μέχρι n στοιχείων. 2. b_queue<e> Q(n): αρχικοποιεί μία κενή ουρά, μεγέθους μέχρι n στοιχείων. Linear Lists 1. list<e> L:αρχικοποιεί μία κενή λίστα. 2. head()/front() : το πρώτο στοιχείο τύπου Ε. 3. succ()/pred() : το επόμενο/προηγούμενο list_item. 4. L.sort() : ταξινομεί την λίστα βάσει Ε. 5. forall_items(/f, L) : iterator των list_item Singly Linked Lists Sets 1. slist<e> L : αρχικοποιεί μία κενή μονή λίστα. 2. push(x)/append(x) : εισάγει στην αρχή/τέλος το στοιχείο x. 3. cyclic_succ() : το κυκλικά επόμενο slist_item. 1. set<e>s: αρχικοποιεί ένα κενό σύνολο. 2. insert(x): εισάγει το x στο σύνολο. 3. member(x): επιστρέφει εάν το x είναι ή όχι μέλος του συνόλου. 4. forall(x, S) : iterator των περιεχομένων του S.

10 9 Dynamic Trees 1. dynamic_trees D: αρχικοποιεί ένα κενό δυναμικό βεβαρημένων ακμών δένδρο με ρίζα: οι κορυφές και οι ακμές μπορούν να έχουν και επιπλέον πληροφορία. 2. D.root(vertex v): επιστρέφει την ρίζα του δένδρου όπου ανήκει η v. 3. D.cost(vertex v) : επιστρέφει το βάρος της ακμής v προς πατέρα της v. Graphs 1. graph G : δήλωση ενός γραφήματος 2. indeg(node v): επιστρέφει τον αριθμό των ακμών που καταλήγουν στη v. 3. target(edge e): επιστρέφει την κορυφή στην οποία καταλήγει η ακμή e. 4. number_of_nodes(): επιστρέφει τον αριθμό των κορυφών του γραφήματος. 5. adj_nodes(node v): επιστρέφει λίστα των κορυφών που συνδέονται μέσω ακμής με την κορυφή v. 6. is_directed(): επιστρέφει TRUE αν το γράφημα είναι κατευθυνόμενο. 7. new_edge(node v, node w): δημιουργεί μια νέα ακμή μεταξύ των κορυφών v, w. 8. forall_nodes(v, G): iterator των κορυφών του γραφήματος. 9. forall_edges(e, G): iterator των ακμών του γραφήματος. Και άλλα πολλά..

11 10 ΚΕΦΑΛΑΙΟ 2. ΑΝΑΛΥΣΗ ΚΑΙ ΣΥΓ ΚΡΙΣΗ ΑΛΓΟΡΙΘΜΩΝ 2.1. ΑΛΓΟΡΙΘΜΟΣ MERGESORT Ανάλυση λειτουργίας αλγορίθμου Ο αλγόριθμος mergesort (ταξινόμηση συγχωνεύσεως), παίρνει ως είσοδο στοιχεία ενός ολικά διατεταγμένου συνόλου και επιστρέφει ως έξοδο το σύνολο διατεταγμένο. Ακολουθεί τη γνωστή μέθοδο «διαίρει και βασίλευε» ως εξής: Στην αρχή χωρίζει την ακολουθία σε δύο ίσα τμήματα (διαίρει), έπειτα τα ταξινομεί ανεξάρτητα (βασίλευε) και τέλος τα συγχωνεύει (συνδύασε). Η διαδικασία έχει αναδρομικό χαρακτήρα. Ως προς εξήγηση αυτού, αν για παράδειγμα η είσοδος του αλγορίθμου είναι ένας πίνακας 8 ακεραίων (βλ. Σχήμα 2.1.1), στην αρχή ο πίνακας θα χωριστεί στη μέση, σε δύο ίσα τμήματα 4 ακεραίων τα οποία θα ταξινομηθούν αναδρομικά (πρώτα το ένα και μετά το άλλο). Όταν τελειώσουν οι αναδρομικές κλήσεις, τα ταξινομημένα τμήματα συγχωνεύονται. Σχήμα : Στιγμιότυπο του mergesort.

12 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\array.h> using namespace leda; using std::cout; using std::cin; using std::endl; int right,left; void mergesort(array<int>& A, int left, int right, array<int>& B); int m a i n () { return 0; void mergesort(array<int>& A, int left, int right, array<int>& B) { int middle=(right+left)/2; //diairei i f (left<middle) mergesort(a,left,middle,b); i f ((middle+1) <right) mergesort(a,middle+1,right,b); //vasileue kai sindiaze f o r (int i=left;i<middle+1;i++) { B[i]=A[i]; int i=left; f o r (int r=middle;r<right;r++) { B [right+middle-r]=a[r+1]; int r=right; f o r (int k=left;k<=right;k++) //sigxwneusi diatetagmenwn upopinakwn i f (B[r]<B[i]) A [ k ] = B [r ]; else A[k]=B [i + + ] ;

13 Εκτίμηση αλγορίθμου Διάγραμμα 1 Σχήμα : Σύγκριση υλοποιημένου κώδικα MERGESORT vs κώδικα LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας του διαγράμματος δείχνει το εκάστοτε μέγεθος εισόδου του αλγορίθμου το οποίο είναι το μέγεθος των πινάκων που παίρνει ως όρισμα ο αλγόριθμος. Ο κάθετος δείχνει το χρόνο τρεξίματος του αλγορίθμου σε δευτερόλεπτα για το αντίστοιχο μέγεθος εισόδου στον αλγόριθμο. Είναι εμφανές η ανωτερότητα της υλοποίησης της LEDA (βλ. Κόκκινη γραμμή) έναντι της απλής υλοποίησης (βλ. Μπλε γραμμή). Η διαφορά χρόνου μεταξύ δύο συνεχόμενων διαφορετικών τιμών εισόδου, είναι πολύ μεγαλύτερη στην απλή υλοποίηση από αυτήν της LEDA δείχνοντας την ικανότητα αντοχής της σε μεγάλο μέγεθος εισόδου χωρίς ωστόσο τη μεγάλη αύξηση στο χρόνο τρεξίματος. Η διαφορά αυτή οφείλεται στην καλύτερη διαχείριση μνήμης της LEDA καθώς και στην απλούστερη υλοποίησή της η οποία δεν περιλαμβάνει αναδρομικές κλήσεις.

14 ΑΛΓΟΡΙΘΜΟΣ KNAPSACK Ανάλυση αλγορίθμου 0 αλγόριθμος KnapSack καλείται να λύσει το πρόβλημα του σακιδίου το οποίο είναι το εξής: Δοθέντος ενός συνόλου S = {ai,a2,...,an n αντικειμένων, με κάθε αντικείμενο a, να έχει ένα βάρος w, και μία αξία v,, καθώς και μίας τιμής W, ζητείται η εύρεση ενός υποσυνόλου S του S, μέγιστης συνολικής αξίας Ivj με aj να ανήκει στο S, και με συνολικό βάρος Iwj, a, ανήκει στο S, να μην ξεπερνά την τιμή W. Για παράδειγμα, έστω 4 αντικείμενα a1, a2, a3 και a4 με βάρη και αξίες w 1=2, w2=3, w3=4, w4=5, v1=4, v2=3, v3=2 και v4=1. Αν η τιμή W ισούται με 7 τότε η μέγιστη συνολική αξία 7 επιλέγοντας ως S = {a1,a2.

15 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\array.h> <C:LEDA\core\array2.h> using namespace leda; using std::cout; using std::cin; using std::endl; class item { p ublic: int w,v; ; int knapsack(const array<item> S,int W,array2<int>& A); int m a i n () { return 0; int knapsack(const array<item> S,int W,array2<int>& A) { array2<int> V(0,S.size()-1,0,W) ; int withk, withoutk; f o r (int j=0;j<=w;j++) { V(0, j)=0; f o r (int k=1;k<s.size();k++){ f o r (int w=0;w<=w;w++){ withoutk=v(k-1,w); //lisi dixws to k-sto antikeimeno i f (w>=s[k].w) withk=v(k-1,w-s[k].w)+s[k].v; //lisi me to k- sto else withk=-maxint; //meion apeiro V(k,w)=max(withk,withoutk); //apofasi ti simferei A(k,w)=(withk<withoutk? 0:1); //voithitikos pinakas gia tin //anaparagwgi tis lisews return V(S.size()-1,W);

16 Εκτίμηση αλγορίθμου Διάγραμμα 2 Σχήμα 2.2.1: Εκτίμηση υλοποιημένου κώδικα knapsack σε περιβάλλον LEDA Ι. Επεξήγηση διαγράμματος Ο οριζόντιος άξονας δείχνει το μέγεθος εισόδου στον αλγόριθμο, ήτοι ο αριθμός n στοιχείων που περνιούνται ως πίνακας n ακεραίων στη συνάρτηση KnapSack. Όπως φαίνεται και στο σχήμα παραπάνω, μετά από κάποιο ορισμένο μέγεθος εισόδου παρατηρείται μία σταθερή μεν αλλά έντονη δε αύξηση στο χρόνο τρεξίματος του αλγορίθμου κάτι που εξηγείται από τις πολλές συγκρίσεις και ενθέσεις με στοιχεία πινάκων.

17 ΑΛΓΟΡΙΘΜΟΣ TASKSCHEDULING Ανάλυση αλγορίθμου Ο αλγόριθμος καλείται να λύσει το πρόβλημα του προγραμματισμού εργασιών που ορίζεται ως εξής: Δοθέντος ενός συνόλου T= n-i n εργασιών τέτοιες ώστε κάθε tj E T να χαρακτηρίζεται από το χρόνο ενάρξεώς της Sj και τον χρόνο περατώσεώς της fj>sj. Ένας μοναδικός πόρος r χρησιμοποιείται για να εκτελεστούν οι εργασίες και ανά πάσα χρονική στιγμή μπορεί να εκτελείται μία μόνο εργασία, μέχρι περατώσεώς της. Ζητείται λοιπόν, να βρεθεί το μέγιστο σύνολο εργασιών T υποσύνολο του T που δύναται να εξυπηρετηθεί από τον πόρο r. Για παράδειγμα, στο σχήμα 2.3.1, έστω 5 εργασίες με τους αντίστοιχους χρόνους ενάρξεως και περατώσεώς τους: t0(2,4), t1 (2,8), t2(3,9), t3(6,10) και t4(10,11). Η βέλτιστη χρονοδρομολόγηση που θα επιλέξει ο αλγόριθμος είναι να εκτελέσει πρώτα την t0, έπειτα θ απορριφθούν οι t1 και t2 διότι κατά το χρόνο ενάρξεώς τους ο πόρος είναι απασχολημένος, και έπειτα ακολουθεί η εκτέλεση των εργασιών t3 και t4. Σχήμα : Παράδειγμα τρεξίματος TaskScheduling

18 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\array.h> <C:LEDA\core\list.h> <C:LEDA\core\string.h> class T { public: //string name; int start; int end; ; void taskscheduling(const array<t> task,list<t>& A); int m a i n () { return 0; void taskscheduling(const array<t> task,list<t>& A) { A.push(task [0]); tis listas me tin prwti ergasia int last=0; //int k; teleutaia ergasia pou dromologeithike f o r (int k=1;k<task.size();k++) { i f (task[k].start>=task[last].end){ //den A.push(task[k]); last=k; //arxikopoiisi //i iparxei sigrousi

19 Εκτίμηση αλγορίθμου Διάγραμμα PSLYDO PSEYDO Sigl/ Linked LIST C Σχήμα : Σύγκριση υλοποιημένου κώδικα σε περιβάλλον LEDA χρησιμοποιώντας διαφορετική δομή λίστας κάθε φορά Ι. Επεξήγηση διαγράμματος Ο οριζόντιος άξονας του παραπάνω σχήματος δείχνει τον αριθμό n των εργασιών ήτοι και το μέγεθος n του πίνακα είσοδο στον αλγόριθμο, ενώ ο κάθετος δείχνει τον αντίστοιχο χρόνο τρεξίματος του. Η πρώτη υλοποίηση γίνεται με χρήση Linear List (βλ. Μπλε γραμμή) ενώ η δεύτερη χρήση απλά συνδεδεμένης λίστας Singly Linked List (βλ. Κόκκινη γραμμή). Όπως φαίνεται και στο διάγραμμα, η χρήση της Singly Linked List αποδίδει ελαφρώς καλύτερα από αυτή της Linear List, κάτι που εξηγείται στη μικρότερη μνήμη που χρησιμοποιεί η πρώτη. Όσο όμως το μέγεθος εισόδου αυξάνει οι δύο υλοποιήσεις συγκλίνουν στους ίδιους χρόνους τρεξίματος.

20 ΑΛΓΟΡΙΘΜΟΣ DFS MATRIX Ανάλυση αλγορίθμου Ο αλγόριθμος dfs Matrix εκτελεί διαπέραση ή διάβαση ενός γραφήματος και συγκεκριμένα εκτελεί αναζήτηση σε βάθος, εξού και το dfs (depth first searh). Χρησιμοποιεί πίνακα γειτνιάσεως ώστε να κρατάει τις ακμές του γραφήματος για κάθε κορυφή κι ένα πίνακα pre που δηλώνει τη σειρά προδιατάξεως μια κορυφής. Ξεκινώντας ο αλγόριθμος, επισκέπτεται αναδρομικά την πρώτη, κατά αύξουσα ονομασία, ανεξερεύνητη γειτονική κορυφή, συνδυάζοντας τις πληροφορίες διασυνδέσεως του πίνακα γειτνιάσεως και του πίνακα προδιατάξεως pre. Για παράδειγμα, με είσοδο στον αλγόριθμο το γράφημα του σχήματος 2.4.1, ο αλγόριθμος θα εξετάσει αρχικά την κορυφή 0 αυξάνοντας τον αριθμό προδιατάξεως του, έπειτα την ανεξερεύνητη κορυφή 1 μέσω του πίνακα γειτνιάσεως, κάνοντας τον αριθμό προδιατάξεως της κορυφής 1 κατά 1 μεγαλύτερο και ούτω καθεξής μέχρι να εξερευνηθούν όλες οι κορυφές του γραφήματος. Σχήμα 2.4.1

21 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\array.h> < C :LEDA\graph\node_matrix.h> <C:LEDA\graph\graph.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int order; void dfsmatrix(const graph& G,node v,node_array<int>& pre,node_matrix<int>& A); int m a i n () { return 0; void dfsmatrix(const graph& G,node v,node_array<int>& pre,node_matrix<int>& A) { pre[v]=order++; //voithitikos pinakas prodiataksews node w; forall_nodes(w,g) { i f (A(v,w)==1) //iparxei akmi i f (pre[w]==0) //i w den exei anakaliftei akomi dfsmatrix(g,w,pre,a); return;

22 Εκτίμηση αλγορίθμου Διάγραμμα 4 Σχήμα Σ ύγκριση υλοποιημένου κώδικα vs έτοιμου κώδικα LEDA Ι. Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Είναι πραγματικά τεράστια η διαφορά αποτελεσματικότητας των δύο αλγορίθμων. Ο dfs Matrix δείχνει να μην αντέχει καν την αύξηση του μεγέθους εισόδου καταγράφοντας υπερβολικούς χρόνους τρεξίματος, ενώ αντίθετα η έτοιμη συνάρτηση της LEDA DFS(graph G, node s, bool reached), δείχνει να μην πτοείται καθόλου από το μέγεθος και πολυπλοκότητα του γραφήματος, τρέχοντας πάντα σε σχεδόν μηδενικό χρόνο. Η εξήγηση έγκειται στο ότι ο dfs Matrix εκτελεί πολλές συγκρίσεις σε στοιχεία πινάκων καθώς επίσης και αναδρομικές κλήσεις, ενώ η συνάρτηση της LEDA χρησιμοποιώντας καταλληλότερες δομές και διαχειριζόμενη καλύτερα τη μνήμη, επιφέρει εκπληκτικά αποτελέσματα.

23 ΑΛΓΟΡΙΘΜΟΣ DFS LIST Ανάλυση αλγορίθμου Παρόμοια με τον dfsmatrix, ο αλγόριθμος εκτελεί αναζήτηση σε βάθος ενός δοθέντος γραφήματος, είσοδο στον αλγόριθμο. Χρησιμοποιεί όμως λίστα γειτνιάσεως αντί για πίνακα, ώστε να κρατάει τις ακμές του γραφήματος για κάθε κορυφή και τον πίνακα pre που κρατάει τη σειρά προδιατάξεως κάθε κορυφής. Ο αλγόριθμος ελέγχει απ ευθείας εάν οι γειτονικές κορυφές της εκάστοτε εξεταζόμενης κορυφής v έχουν ανακαλυφθεί, και μόνο αυτές, σαρώνοντας την αντίστοιχη λίστα γειτνιάσεως της ν. Στο σχήμα εξερευνώντας αρχικά την κορυφή 0, ελέγχει τη λίστα γειτνιάσεως της η οποία περιλαμβάνει τις κορυφές {1, 4, 5, 9 και διαλέγοντας την κορυφή 1, εξετάζει αν έχει εξερευνηθεί, αν όχι καλεί αναδρομικά τον αλγόριθμο για την κορυφή 1. Σχήμα 2.5.1

24 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int order; void dfslist(const graph& G,node v,node_array<int>& pre,node_array<list<node>>& L); int m a i n () { return 0; void dfslist(const graph& G,node v,node_array<int>& pre,node_array<list<node>>& L) { pre[v]=order++; //voithitikos pinakas prodiataksews node x; forall (x, L [v] ) i f (pre[x]==0) { //i korifi den exei anakalifthei akoma dfslist(g,x,pre,l);

25 Εκτίμηση αλγορίθμου Διάγραμμα 5 Σχήμα : Σύγκριση dfsmatrix vs dfslist vs LEDA dfs I. Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Η μπλέ γραμμή δείχνει τους χρόνους τρεξίματος του αλγορίθμου dfsmatrix έναντι της πράσινης γραμμής του αλγορίθμου dfslist και της κόκκινης, της έτοιμης συνάρτησης της βιβλιοθήκης LEDA. Ο λόγος για τον οποίο και ο αλγόριθμος dfslist ακολουθεί τη γραμμή μηδενικού χρόνου της συνάρτησης της LEDA, είναι γιατί χρησιμοποιεί λίστα αντί του πίνακα όπως ο dfsmatrix. Αυτό είναι που του δίνει σημαντικό προβάδισμα στη λιγότερη χρησιμοποίηση μνήμης καθώς και ταχύτερες πράξεις σύγκρισης.

26 ΑΛΓΟΡΙΘΜΟΣ BFS_MATRIX Ανάλυση αλγορίθμου 0 αλγόριθμος bfsmatrix εκτελεί αναζήτηση κατά πλάτος, εξού και το BFS (breadth first search), σ ένα δοθέν γράφημα. Χρησιμοποιεί μια FIFO ουρά, από την οποία οι κορυφές εισάγονται και εξάγονται κατά σειρά αύξουσας (ελάχιστης) αποστάσεως από την κορυφή αφετηρία. 0 πίνακας γειτνιάσεως υπάρχει για να κρατάει τις ακμές για κάθε κορυφή του γραφήματος. Για παράδειγμα, στο σχήμα αφού εξετάσει την κορυφή αφετηρία 0, ανακαλύπτει μία μία τις γειτονικές ανεξερεύνητες πάντα κορυφές εισάγοντάς τις, κάθε φορά στην ουρά, δηλαδή τις κορυφές {1, 4, 5, 9. Αφού τελειώσει με αυτές, εξάγει την πρώτη από την ουρά, δηλαδή την κορυφή 1 και κάνει το ίδιο με αυτήν, έπειτα με την κορυφή 4 και ούτω καθεξής. Σχήμα 2.6.1

27 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_matrix.h> < C :LEDA\graph\ graph.h> < C :LEDA\ core\queue.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int order; void bfsmatrix(const graph& G,node v,node_array<int>& pre,node_matrix<int>& A,queue<node>& Q) ; int m a i n () { return 0; void bfsmatrix(const graph& G,node v,node_array<int>& pre,node_matrix<int>& A,queue<node>& Q) { Q.append(v); pre[v]=order++; w h i l e (!Q.empty()) { node w = Q.pop (); node u; forall_nodes(u,g) i f ((A(w,u)==1) && (pre[u]==-1)) { Q.append(u); pre[u]=order++;

28 Εκτίμηση αλγορίθμου Διάγραμμα 6 Σχήμα : Σύγκριση bfsmatrix vs bfsmatrix (b_queue) vs LEDA bfs Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Η μπλε γραμμή δείχνει το χρόνο τρεξίματος του υλοποιημένου αλγορίθμου bfsmatrix με απλή ουρά (queue), η πράσινή δείχνει το χρόνο του bfsmatrix με bounded queue (δεσμεύεται από την αρχή ο απαιτούμενος χώρος) και η κόκκινη γραμμή το χρόνο της έτοιμης συνάρτησης της LEDA. Όπως φαίνεται και στο διάγραμμα, η υλοποίησης της LEDA υπερτερεί όλων λόγω της καλύτερης διαχείρισης μνήμης απ αυτή των άλλων δύο, δείχνοντας να μην πτοείται από την πολυπλοκότητα του γραφήματος εισόδου, όπως επίσης υπερτερεί και η υλοποίηση του αλγορίθμου bfsmatrix με bounded queue έναντι της υλοποίησης με απλή ουρά. Η δομή bounded queue η οποία υλοποιείται με κυκλικούς πίνακες, προσφέρει ταχύτερες πράξεις απ αυτές της απλής δομής queue (υλοποίηση με απλά συνδεδεμένες λίστες), αλλά χρησιμοποιείται μόνο όταν είναι γνωστός ο μέγιστος αριθμός στοιχείων που μπορεί να πάρει.

29 ΑΛΓΟΡΙΘΜΟΣ TOPOLSORTLIST Ανάλυση αλγορίθμου Ο αλγόριθμος εκτελεί τοπολογική διάταξη (topological sort), στις κορυφές άκυκλου κατευθυνόμενου γραφήματος. Αιτείται δηλαδή, η διάταξη των κορυφών του άκυκλου κατευθυνόμενου γραφήματος, κατά τέτοιο τρόπο ώστε κάθε κορυφή v να προηγείται όλων των κορυφών w με (v,w) να ανήκει στο E. Κατά τη διαδικασία, επιλέγεται μία οποιαδήποτε πηγή s (κορυφή χωρίς εισερχόμενες ακμές), αναφέρεται ως επόμενη στη διάταξη κορυφή και εφαρμόζεται αναδρομικά η διαδικασία στο προκύπτον γράφημα. Συγκεκριμένα, ο αλγόριθμος χρησιμοποιεί λίστες γειτνιάσεως και με τη χρήση του βοηθητικού πίνακα aux, για τη δυναμική καταγραφή εισόδου των κορυφών καθώς και της ουράς FIFO, είναι δυνατή η τοπολογική διάταξη των κορυφών. την αρχή μπαίνουν όλες οι κορυφές πηγές στην ουρά. Έπειτα, επιλέγεται κάθε φορά η πρώτη απ αυτές, καταγράφεται ως i-οστή κορυφή και μειώνεται ο αριθμός εισόδου των κορυφών που ανήκουν στη λίστα γειτνιάσεώς της. Όσες αυτών ισούνται με 0, εισέρχονται στην ουρά. Για παράδειγμα, στο σχήμα που ακολουθεί, οι κορυφές 0 και 5 θα μπουν στην αρχή στην ουρά. Έπειτα, θα επιλεγεί πρώτα η κορυφή πηγή 0, μειώνοντας τον αριθμό εισερχόμενων ακμών των κορυφών 1 και 2, σε 0 προσθέτοντας τες στην ουρά, έπειτα θα επιλεγεί η επόμενη της ουράς, η κορυφή 5 και ούτω καθεξής. Σχήμα : Στιγμιότυπο τοπολογικής διατάξεως κορυφών ΚΑΓ

30 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\core\ list.h> < C :LEDA\core\queue.h> < C :LEDA\graph\ graph.h> < C :LEDA\graph\node_array.h> < C :LEDA\ core\b_queue.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int seira; void topolsortlist(const graph& G,node_array<int>& sort,node_array<int>& aux,node_array<list<node>>& List,node_array<int>& order); int m a i n () { return 0; void topolsortlist(const graph& G,node_array<int>& sort,node_array<int>& aux,node_array<list<node>>& List,node_array<int>& order) { seira=0; //o aux xrhsimopoieitai gia ton entopismo pigwn sort.init(g,-1);// o pinakas diataksews sort node v,x,i; forall_nodes(v,g) forall(x,list[v]){ aux[x]++; //vrethike mia akomi prospiptousa akmh pros tin x b_queue<node> Q(G.number_of_nodes()) ;// oura me tis piges forall_nodes(v,g){ //int k=aux[v]; i f (aux[v]==0) { Q.append(v); //i v einai phgh forall(x,q) { order[x]=seira++; //i v apotelei tin i-osti korifi forall(i,list[x]) w h i l e (aux[i]>=0) i f (--aux[i]==0) //afeiresh tis (v,w) apo tis prospiptoyses Q.append(i); //kai tuxon prosthiki ths w sto synolo twn phgwn

31 Εκτίμηση αλγορίθμου Διάγραμμα 7 PSLYDO LLDA b queue Σχήμα Σύγκριση topolsortlist vs topolsortlist (b_queue) vs LEDA TOPSORT Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του άκυκλου κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Η κόκκινη γραμμή δείχνει το μηδενικό πάντοτε χρόνο της έτοιμης συνάρτησης της LEDA ενώ η μπλε και η πράσινη δείχνουν τις υλοποιήσεις του αλγόριθμου topolsortlist, με χρήση απλής ουράς queue και bounded queue αντίστοιχα. Το διάγραμμα για ακόμη μια φορά αναδεικνύει την αποτελεσματικότητα της έτοιμης συνάρτησης της LEDA, η οποία εκτελείται σε μηδενικό χρόνο για τα διάφορα μεγέθη εισόδου, έναντι της υλοποίησης του αλγόριθμου topolsortlist, ο οποίος ανεξαρτήτου επιλογής δομής ουράς, αφενός καταγράφει μεγάλους χρόνους τρεξίματος, αφετέρου αδυνατεί να παράγει αποτέλεσμα σε μεγάλα μεγέθη εισόδου, δείγμα της κακής διαχείρισης μνήμης.

32 ΑΛΓΟΡΙΘΜΟΣ TRANSCLOSURE Ανάλυση αλγορίθμου Ο αλγόριθμος βρίσκει τη μεταβατική κλειστότητα ενός γραφήματος, ήτοι όλες τις δυνατές διασυνδέσεις, άμεσες ή έμμεσες μέσω μονοπατιών, μεταξύ των κορυφών του γραφήματος. Χρησιμοποιεί λίστα γειτνιάσεως για να κρατά τις ακμές για κάθε κορυφή του γραφήματος και τον πίνακα TrClosure ο οποίος έχει αρχικά 1 στις θέσεις όπου υπάρχουν ακμές. Για κάθε ζεύγος κορυφών w και v που μεταξύ τους υπάρχει ακμή, ελέγχεται αν υπάρχει ακμή μεταξύ της w και με κάθε κορυφή x που ανήκει στη λίστα γειτνιάσεως της κορυφής ν. Αν όχι, τότε προστίθεται μία ακμή (w,x) και καλείται ξανά η διαδικασία για τις κορυφές (w,x). Για παράδειγμα, στο σχήμα 2.8.1, για το ζεύγος κορυφών (0,1) θα ελεγχθεί αν υπάρχει 1 μεταξύ της κορυφής 0 και των κορυφών 0 και 2, δηλαδή τις κορυφές που ανήκουν στη λίστα γειτνιάσεως της 1. Επειδή δεν υπάρχει ακμή (0,2) Α[0][2]=0 θα γίνει Α[0][2]=1 και θα τρέξει η ίδια διαδικασία για το ζεύγος κορυφών 0 και 2. Σχήμα 2.8.1

33 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> < C :LEDA\graph\node_matrix.h> using namespace leda; using std::cout; using std::cin; using std::endl; static void dfslisttc(const graph& G,graph& t,node w,node v,node_matrix<int>& TrClosure,node_array<list<node>>& List_g,node_array<list<node>>& List_ t); void transclosure(const graph& G,graph& t,node_matrix<int>& TrClosure,node_array<list<node>>& List_g,node_array<list<node>>& List_t); int main () { return 0; void transclosure(const graph& G,graph& t,node_matrix<int>& TrClosure,node_array<list<node>>& List_g,node_array<list<node>>& List_t) { node v; forall_nodes(v,g) dfslisttc(g,t,v,v,trclosure,list_g,list_t); static void dfslisttc(const graph& G,graph& t,node w,node v,node_matrix<int>& TrClosure,node_array<list<node>>& List_g,node_array<list<node>>& List_t) { List_ t[ w].append(v); node x; forall(x, List_g[v]) { i f (TrClosure(w,x)==0) { TrClosure(w,x)=1; dfslisttc(g,t,w,x,trclosure,list_g,list_t) ;

34 Εκτίμηση αλγορίθμου Διάγραμμα 8 Σχήμα : Σύγκριση υλοποιημένου TransClosure vs έτοιμης συνάρτησης LEDA Ι. Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Όπως φαίνεται από το διάγραμμα 8, οι δύο διαφορετικές υλοποιήσεις τρέχουν σε παραπλήσιους χρόνους για τα αντίστοιχα μεγέθη εισόδου, κάτι που σημαίνει ότι λύνουν το πρόβλημα της μεταβατικής κλειστότητας με παρόμοιο τρόπο. Συμπεραίνεται λοιπόν, ότι οι πράξεις πινάκων, πόσο μάλλον πολυδιάστατων, κοστίζουν σε χρόνο και μνήμη αν παρατηρήσει κανείς τους μεγάλους χρόνους που καταγράφουν οι δύο αλγόριθμοι σε σχετικά μικρά μεγέθη εισόδου.

35 ΑΛΓΟΡΙΘΜΟΣ WARSHALL Ανάλυση αλγορίθμου O αλγόριθμος warshalltc, βρίσκει και αυτός τη μεταβατική κλειστότητα ενός κατευθυνόμενου γραφήματος, με τη χρήση όμως του δυναμικού προγραμματισμού. Σύμφωνα μ αυτόν, κατασκευάζεται μια σειρά γραφημάτων Gi, G2,..., Gv, τέτοια ώστε το Gi, 1<i<V να περιέχει πρώτον, όλες τις ακμές του G i.1, και δεύτερον, κάθε ακμή της μορφής (vk, Vj), εφόσον οι ακμές (vk, vi), και (vi, vj), ανήκουν αμφότερες στο G i-1. Το τελευταίο γράφημα Gv, αποτελεί τη μεταβατική κλειστότητα του G. Συγκεκριμενα, κάθε φορά επιλέγεται μία κορυφή v, και εντοπίζεται κάθε μονοπάτι της μορφής (x-v-u), όπου (x-v) υπάρχον ακμή και (v-u) ήδη υπάρχον μονοπάτι. Αν δεν υπάρχει ακμή (x-u) τότε αυτή προστίθεται. Για παράδειγμα στο σχήμα 2.9.1, θα επιλεγεί πρώτα η κορυφή 0 και θα βρεθούν τα μονοπάτια (3-0-x) και (1-0-x). Κρίσιμα είναι τα (3-0-1), ( ) και ( ). Επειδή δεν υπάρχει ακμή (3-1) προστίθεται. Ο αλγόριθμος μετά συνεχίζει με τον ίδιο τρόπο και για τις άλλες κορυφές. Σχήμα : Στιγμιότυπο μεταβατικής κλειστότητας κατά Warshall

36 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> < C :LEDA\graph\node_matrix.h> using namespace leda; using std::cout; using std::cin; using std::endl; void warshalltc(const graph& G,node_matrix<int>& TrClosure,node_matrix<int>& A); int m a i n () { return 0; void warshalltc(const graph& G,nc matrix<int>& TrClosure,node_matrix<int>& A) { node v,w,i; forall_nodes(v,g) { //arxikopoiisi tou pinaka kleistotitas forall_nodes(w,g) TrClosure(v,w)= A (v, w) ; forall_nodes(v,g) TrClosure(v,v)=1; forall_nodes(i,g) { //upologismos tou i-stou grafimatos forall_nodes(v,g) //upologismos metavasews mesw i f (TrClosure(v,i)==1) //tis korifis i forall_nodes(w,g) i f (TrClosure(i,w) : = 1) TrClosure(v w) =1;

37 Εκτίμηση αλγορίθμου Διάγραμμα 9 Σχήμα : Σύγκριση υλοποιημένου warshalltc vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Στο διάγραμμα φαίνεται με μπλε γραμμή ο χρόνος του warshall ενώ με πράσινη και κόκκινη, οι χρόνοι του transclosure και της έτοιμης συνάρτησης της LEDA αντίστοιχα. Φαίνεται ότι η υλοποίηση του warshall προς στιγμή παράγει καλύτερα αποτελέσματα, κάτι που οφείλεται στη μέθοδο δυναμικού προγραμματισμού που χρησιμοποιεί και άρα στην καλύτερη διαχείριση μνήμης, στο τέλος όμως και οι τρεις αλγόριθμοι συγκλίνουν στον ίδιο χρόνο τρεξίματος, μιας και όπως αναφέρθηκε παραπάνω οι πράξεις πολυδιάστατων πινάκων κοστίζουν σε χρόνο και μνήμη.

38 ΑΛΓΟΡΙΘΜΟΣ GABOW Ανάλυση αλγορίθμου Ο αλγόριθμος εντοπίζει ισχυρά συνεκτικές συνιστώσες στο δοθέν γράφημα είσοδο. Για την επίτευξη του σκοπού αυτού, χρησιμοποιεί δύο στοίβες ως εξής: Η πρώτη στοίβα αποθηκεύει το τρέχον μονοπάτι. Η δεύτερη στοίβα σκοπό έχει να εντοπίσει ποιές κορυφές είναι σημεία εισόδου σε ισχυρά συνεκτικές συνιστώσες. Ακολουθώντας την εξερεύνηση αναζήτησης σε βάθος, όταν εντοπίζεται μία κορυφή ν, εισάγεται και στις δύο στοίβες. Εάν βρεθεί μία οπισθοακμή - άρα βρισκόμαστε εντός συνιστώσας - με διαδοχικά pop στη δεύτερη στοίβα, παραμένει μόνο η κορυφή απόληξη της οπισθοακμής. το τέλος της επεξεργασίας της ν, ελέγχεται μήπως είναι κορυφή της δεύτερης στοίβας. Αν ναι, η ν είναι σημείο εισόδου και οι κορυφές στην πρώτη στοίβα, από την κεφαλή μέχρι τη ν, αποτελούν ισχυρά συνεκτική συνιστώσα. Για παράδειγμα στο σχήμα , εκτελώντας ΑσΒ, εισάγονται και στις δύο στοίβες οι κορυφές {0, 1, 2, η κορυφές 1 και 2 κατόπιν αφαιρούνται από τη δεύτερη στοίβα λόγος της οπισθοακμής (2,0). Αφού παρόμοια εισαχθούν οι κορυφές {3, 4, 5 και στις δύο στοίβες και αφαιρεθεί η 3 λόγω οπισθοακμής (3,4), η κορυφή 4 κατά το τέλος της επεξεργασίας της αποτελεί την κεφαλή της δεύτερης ουράς, άρα και σημείο εισόδου. Έτσι με διαδοχικά pop, αφαιρούνται από την πρώτη στοίβα οι κορυφές {3, 4 οι οποίες αποτελούν και την πρώτη ισχυρά συνεκτική συνιστώσα του γραφήματος. Ο αλγόριθμος συνεχίζει ανάλογα. A A / V V E Λ Α Λ /ν ΐ. Τ Ί Π ν Τ Γ Ί Η v /V V V E Λ Λ Λ Λ ίηπ 1ΡΡΡΡΡΠ ιπαγτγ'~ i m n m m n Σχήμα : Παράδειγμα ευρέσεως ισχυρά συνεκτικών συνιστωσών βάσει Gabow

39 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\ core\stack.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> < C :LEDA\graph\node_matrix.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int order,strcompnum; void gabowsc(const graph& G,node w,node_array<int>& pre,node_array<int>& sc,stack<node>& S,stack<node>& ps,node_array<list<node>> List); int m a i n () { return 0; void gabowsc(const graph& G,node w,node_array<int>& pre,node_array<int>& sc,stack<node>& S,stack<node>& ps,node_array<list<node>> List) { pre[w]=order++; //arithmos prodiataksis S.push(w); //enthesi stis stoives p S.push(w); node x; forall(x,list [w] ) i f (pre[x]==-1) //aneksereunitos apogonos gabowsc(g,x,pre,sc,s,ps,list); else i f (sc[x]==-1) //aprosdioristos arithmos sunistwsas w h i l e (pre[ps.top()]>pre [x]) p S.pop (); i f (ps.top()!=w) //den apotelei "korifi eisodou" return; else ps.pop(); //apotelei "korifi eisodou" se sunistwsa node t; do //anakthsh korifwn sunistwsas sc[(t=s.pop())]=strcompnum; w h i l e (t!=w); strcompnum++; //enhmerwsh trexontos arithmou sunistwsas

40 Εκτίμηση αλγορίθμου Διάγραμμα 10 Σχήμα : Σύγκριση υλοποιημένου Gabow με χρήση απλής stack και με bounded stack vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Είναι προφανή η ανωτερότητα της έτοιμης συνάρτησης της LEDA, STRONG_COMPONENTS (graph G, int compnum) κόκκινη γραμμή, έναντι των υλοποιήσεων του Gabow με απλή stack (μπλε γραμμή) και με bounded stack (πράσινη γραμμή). Οι πολύ καλύτεροι χρόνοι που καταγράφει η συνάρτηση της LEDA οφείλεται στην καλύτερη υλοποίηση που έχει, χρησιμοποιώντας μάλιστα λίστες. Μάλιστα φαίνεται στο διάγραμμα, ότι η υλοποίηση του Gabow με bounded stack υπερέχει για μικρότερα μεγέθη εισόδου αυτή της απλής stack, ξεφεύγει όμως και αυξάνει σχεδόν εκθετικά το χρόνο τρεξίματος, καθώς αυξάνει το μέγεθος εισόδου. Αυτό είναι λογικό, αφού γίνεται κακή διαχείριση της μνήμης, μιας και για την bounded stack δεσμεύεται εξ αρχής η απαιτούμενη μνήμη. Επίσης ένας άλλος λόγος είναι η διαφορά υλοποίησης μεταξύ αυτών, αφού η bounded stack υλοποιείται με C++ vectors ενώ η απλή stack με απλά συνδεδεμένες λίστες.

41 ΑΛΓΟΡΙΘΜΟΣ TARJAN Ανάλυση αλγορίθμου Ο αλγόριθμος εντοπίζει ισχυρά συνεκτικές συνιστώσες ενός γραφήματος G, με μια απλή σάρωση και τη χρήση μιας στοίβας. Απαιτεί μία απλή σάρωση του γραφήματος, εκμεταλλευόμενος το γεγονός πως η κατά σειρά μεταδιατάξεως επεξεργασία των κορυφών του γραφήματος,σε συνδυασμό με τις τυχόν οπισθοακμές που θα συναντηθούν, ανακαλύπτει τις συνιστώσες κατά αντίστροφη τοπολογική διάταξη. Πιο συγκεκριμένα, βάση ΑσΒ, κάθε φορά που συναντάται μια ανεξέταστη κορυφή v εισάγεται στη στοίβα. Όταν περατωθεί η επεξεργασία της, τελειώσουν δηλαδή όλες οι αναδρομικές κλήσεις που αυτή προκαλεί, ελέγχεται αν είναι σημείο εισόδου (pre[v]=low[v]). Αν ναι, τότε οι κορυφές που περιέχονται στη στοίβα, από την αρχή της μέχρι τη ν, αποτελούν μια ισχυρή συνιστώσα. Για παράδειγμα, στο σχήμα , σαρώνοντας με ΑσΒ, εισάγονται στη στοίβα διαδοχικά οι κορυφές {0, 1, 2, 5, 4, 3. Τελειώνοντας με την κορυφή 3, αφού δεν αποτελεί σημείο εισόδου (pre[3] 9 low[3]), επιστρέφει στην 4 η οποία είναι σημείο εισόδου (pre[4]=low[4]), οπότε και εξάγονται από τη στοίβα οι κορυφές {3, 4 ως η πρώτη ανακαλυφθείσα ισχυρά συνιστώσα. Ο αλγόριθμος συνεχίζει ανάλογα και με τις άλλες κορυφές. Σχήμα : Παράδειγμα ευρέσεως ισχυρά συνεκτικών συνιστωσών κατά Tarjan

42 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\ core\stack.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> < C :LEDA\graph\node_matrix.h> using namespace leda; using std::cout; using std::cin; using std::endl; static int order,strcompnum; void tarjansc(const graph& G,node w,node_array<int>& pre,node_array<int>& low,stack<node>& S,node_array<list<node>>& List,node_array<int>& sc); int m a i n () { return 0; void tarjansc(const graph& G,node w,node_array<int>& pre,node_array<int>& low,stack<node>& S,node_array<list<node>>& List,node_array<int>& sc) { int minimum; pre[w]=order++; low[w]=pre[w]; prokiptei minimum=low[ w]; S.push(w); node x; forall(x,list [w] ) i f (pre[x]==-1) //arithmos prodiataksews ths w //o mikroteros arithmos prodiatakews pou //apo opisthoakmi pros progono //topothetisi sti voithitiki stoiva //den exei anakalifthei tarjansc(g,x,pre,low,s,list,sc); i f (low[x]<minimum) //vrethike opisthoakmi tou apogonou x ths w minimum=low[x]; //pros progono ths i f (minimum<low[w]) { //enhmerwsh tou elaxistou arithmou prodiataksews low[w]=minimum; //apogonou ths w pros apogono ths return; node v; do { // einai arxh sunistwsas i opoia anaktatai me diadoxika pop sc[v=s.p o p ()]=strcompnum; low[v]=g.number_of_nodes(); //telos ths epeksergasias ths w h i l e (v!=w); strcompnum++; //auksisi tou arithmou sunistwswn

43 Εκτίμηση αλγορίθμου Διάγραμμα 11 Σχήμα : Σύγκριση υλοποιημένου Tarzan με χρήση απλής stack και με bounded stack vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Παρότι στο διάγραμμα φαίνεται οι χρόνοι των διαφορετικών υλοποιήσεων να διαφέρουν κατά πολύ, αυτό δεν ισχύει. Η διαφορά χρόνων που καταγράφουν οι δύο διαφορετικές υλοποιήσεις του Tarzan και η έτοιμη συνάρτηση της LEDA, είναι της τάξης εκατοστών του δευτερολέπτου, που σε συνδυασμό με τους μηδενικούς χρόνους τρεξίματός τους, αποφαίνεται ότι και όλες οι υλοποιήσεις λειτουργούν αποτελεσματικά χάρη στη σωστή χρήση των δομών που χρησιμοποιούν (στοίβα για τον Tarzan και λίστες για τη LEDA).

44 ΑΛΓΟΡΙΘΜΟΣ PRIM Ανάλυση αλγορίθμου 0 αλγόριθμος PRIM, εντοπίζει ελάχιστο επικαλύπτον δέντρο σ ένα βεβαρημένο συνεκτικό γράφημα. Ξεκινώντας από το στοιχειώδες δένδρο της μίας κορυφής, κάθε φορά επιλέγει να συμπεριλάβει στο υπό διαμόρφωση ΕΕΔ Τ, την ακμή (v, w) με το μικρότερο βάρος, με v ν ανήκει στο Τ και w ν ανήκει στο V-T. Τια κάθε κορυφή του V-T, διατηρείται μόνο η ελαφρύτερη από τις συνοριακές ακμές που την ενώνουν με κορυφές του Τ, εάν βέβαια υπάρχουν. Γ ια παράδειγμα, στο σχήμα , ξεκινώντας από την κορυφή 0, το σύνολο V-T, ή αλλιώς σύνολο παρυφής, αποτελείται από τις κορυφές 1 και 2. Θα επιλεγεί η ακμή (0, 2) ως η ελαφρύτερη αυξάνοντας το ΕΕΔ κατά μία κορυφή. Το σύνολο παρυφής έπειτα θα είναι όπως φαίνεται από το σχήμα , οι κορυφές 1 και 5 και θα επιλέγει η 1 ως η ελαφρύτερη ακμή μεταξύ των κορυφών του συνόλου V-T και Τ. 0 αλγόριθμος συνεχίζει ανάλογα. Σχήμα Σχήμα

45 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\list.h> <C:LEDA\core\array.h> < C :LEDA\graph\node_array.h> using namespace leda; using std::cout; using std::cin; using std::endl; const int TRUE = 1; const int FALSE = 0; void Prim(UGRAPH<char,int> MyGraph); bool Reachable(UGRAPH<char,int> MyGraph,node LookForNode,node ParentNode,node CurrentNode); int m a i n () { return 0; bool Reachable(UGRAPH<char,int> MyGraph,node LookForNode,node ParentNode, node CurrentNode) { node AdjacentNode; //---- See of found original source if (LookForNode == CurrentNode) r eturn(true); //---- Otheriwse look through all successors else forall_adj_nodes(adjacentnode,currentnode) { if (AdjacentNode!= ParentNode && Reachable(MyGraph,LookForNode, CurrentNode,AdjacentNode) ) r eturn(true); return(false); // PRIM void Prim(UGRAPH<char,int> MyGraph) { edge Edge; //---- Lista na krataei tis akmes list<edge> SortedEdges; //---- Arxikopoiisi xwris korifes sto dentro node_array<bool> InTree(MyGraph,FALSE); list_item ListItem; bool FoundOne;

46 45 //---- Arxikopoiisi prwtis koryfis sto dentro InTree[MyGraph.first_node()] = TRUE; //---- Taxinomisi twn akmwn tou grafhmatos MyGraph.sort_edges(); //---- Apokripsi olwn twn akmwn forall_edges(edge,mygraph) { MyGraph.hide_edge(Edge) ; //--- Lista olwn twn krifwn akmwn SortedEdges = MyGraph.hidden_edges(); //---- Loop oso to dentro den exei oloklirwthei while (MyGraph.number_of_edges() < MyGraph.number_of_nodes() - 1) { FoundOne = FALSE; forall_items(listitem,sortededges) { Edge = SortedEdges.contents(ListItem); if ((InTree[MyGraph.source(Edge)] &&!InTree[MyGraph.target(Edge)]) (!InTree[MyGraph.source(Edge)] && InTree[MyGraph.target(Edge)])) { //---- Diegrapse to item apo ti lista SortedEdges.del_item(ListItem) ; //---- Epanefere tin akmi sto grafima MyGraph.restore_edge(Edge); InTree[MyGraph.source(Edge)] = TRUE; InTree[MyGraph.target(Edge)] = TRUE; FoundOne = TRUE; break; //---- An den iparxei katallhlh akmh diekopse if (!FoundOne) break; //---- An to grafhma den einai epikalupton tipwse minima lathous if (MyGraph.number_of_edges() < MyGraph.number_of_nodes() - 1) cout << "No spanning tree" << endl; //---- Diaforetika tupwse to dentro else MyGraph.print();

47 Εκτίμηση αλγορίθμου Διάγραμμα 12 Σχήμα : Σύγκριση υλοποιημένου PRIM vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Η μπλε γραμμή δείχνει το χρόνο του υλοποιημένου PRIM ενώ η κόκκινη της έτοιμης συνάρτησης της LEDA για την εύρεση ελάχιστων επικαλύπτων δέντρα, MIN_SPANNING_TREE(graph G, edge_array<int> cost). Το πρώτο σημαντικό πόρισμα του διαγράμματος είναι η μεγαλύτερη αντοχή της LEDA έναντι της απλής υλοποίησης, σε μεγαλύτερα μεγέθη εισόδου, δείγμα της καλύτερης διαχείρισης μνήμης που διαθέτει. Το δεύτερο πόρισμα είναι οι κατά πολύ καλύτεροι χρόνοι που καταγράφει η συνάρτηση MIN_SPANNING_TREE, αποτέλεσμα της καλύτερης υλοποίησης, με καταλληλότερες δομές.

48 ΑΛΓΟΡΙΘΜΟΣ DIJSTRA Ανάλυση αλγορίθμου Ο αλγόριθμος λύνει το πρόβλημα Συντομότερων Μονοπατιών Μοναδικής Πηγής (ΣΜΜΠ), μόνο όμως για βεβαρημένα γραφήματα θετικού κόστους. Σ ε γενικές γραμμές, ο αλγόριθμος χωρίζει τις κορυφές σε δύο σύνολα: το πρώτο S, στο οποίο ανήκουν οι κορυφές για τις οποίες έχει βρεθεί το συντομότερο μονοπάτι από την πηγή και το δεύτερο, V-S (σύνολο παρυφής), στο οποίο ανήκουν οι κορυφές για τις οποίες είναι γνωστή μια προσέγγιση της τελικής λύσεως. Οι προσεγγίσεις αυτές βελτιώνονται και βελτιστοποιούνται, κατά τι διάρκεια μιας βεβαρημένης αναζήτησης κατά πλάτος. Στο σχήμα , παρουσιάζονται 3 βήματα του αλγορίθμου σ ένα βεβαρημένο γράφημα. την αρχή όλες οι κορυφές εκτός της αρχικήςπηγή, 0, έχουν άπειρη απόσταση από την πηγή. Το σύνολο κορυφής αποτελείται από τις κορυφές {2, 4 με άπειρες αποστάσεις. Επιλέγεται η 4 ως εγγύτερη, χαλαρώνοντας την απόστασή της σε 3 από : Το νέο σύνολο παρυφής αποτελείται τώρα από τις κορυφές {2, 1, 3 από τις οποίες επιλέγεται η 1 ως εγγύτερη από την πηγή με απόσταση 4. Ο αλγόριθμος συνεχίζει ανάλογα μέχρι να βρεθούν όλα τα συντομότερα μονοπάτια από την πηγή 0.

49 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\graph\ graph.h> < C :LEDA\core\_p_queue.h> < C :LEDA\graph\graph_alg.h> < C :LEDA\core\impl\f_heap.h> < C :LEDA\core\impl\k_heap.h> < C :LEDA\core\impl\bin_heap.h> < C :LEDA\core\impl\m_heap.h> < C :LEDA\core\impl\p_heap.h> < C :LEDA\core\impl\r_heap.h> < C :LEDA\core\impl\list_pq.h> using namespace leda; using std::cout; using std::cin; using std::endl; template<class pq_impl> void dijkstra(graph& G, node s, edge_array<int>& cost, node_array<int>& dist, node_array<edge>& pred, p_queue<int,node,pq_impl>& PQ) parametroi { typedef typename p_queue<int,node node_array<pq_item> I(G) ; node v; // prosthetes // PQ ylopoiisi... pq_impl>::item pq_item; forall_nodes(v, G) { pred[v] = nil; dist[v] = MAXINT; dist[s] = 0; I[s] = PQ.insert(0,s); while (! PQ.empty()) { pq_item it = PQ.find_min(); min label node u = PQ.inf(it); int du = dist[u]; edge e; forall_adj_edges(e,u) { v = G.target(e); int c = du + cost[e]; if (c < dist[v]) { if (dist[v] == MAXINT) I[v] = PQ.insert(c,v); else P Q.decrease_p(I[v],c); dist [v] = c; // Fash arxikopoiisis //Xtisimo twn priority queues // Kirio loop.. // Euresi tis korifis me to // Enhmerwsh twn labels // Meiwsh toy kleidiou

50 49 pred[v] = e; PQ.del_item(it); // Diagrafh tis korifis apo PQ

51 Εκτίμηση αλγορίθμου Διάγραμμα 13 Σχήμα : Σύγκριση υλοποιημένου Dijstra με διαφορετικές δομές vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του βεβαρημένου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Το διάγραμμα παρουσιάζει αποτελέσματα πολλών υλοποιήσεων του αλγορίθμου Dijstra, με διαφορετική δομή ουράς προτεραιότητας κάθε φορά, καθώς και της έτοιμης συνάρτησης της LEDA. Κατά αύξουσα αποτελεσματικότητα υλοποιήσεων, τ αποτελέσματα είναι: list_pq, k_heap, f_heap, p_heap, bin_heap, r_heap, m_heap και τελευταία και καλύτερη η έτοιμη συνάρτηση της LEDA.

52 ΑΛΓΟΡΙΘΜΟΣ BELLLMAN - FORD Ανάλυση αλγορίθμου Ο αλγόριθμος λύνει το πρόβλημα Σ υντομότερων Μονοπατιών Μοναδικής Πηγής ( Σ ΜΜΠ), για βεβαρημένο γράφημα, ακόμα και όταν αυτό περιέχει αρνητικά βάρη. Στηρίζεται στην αρχή των χαλαρώσεων ακμών εκτελώντας V-1, διαφορετικά στάδια. Σ ε κάθε ένα από αυτά, δοκιμάζονται για χαλάρωση όλες οι ακμές του γραφήματος και αν ακόμα και στο τέλος υπάρχει ακμή που επιδέχεται χαλάρωση, τότε το γράφημα διαθέτει αρνητικό κύκλο. Διαφορετικά, έχουν εντοπιστεί τα συντομότερα μονοπάτια. Στο σχήμα , φαίνονται το αρχικό γράφημα με τις άπειρες αποστάσεις των κορυφών από την πηγή 0, και μετά, τα V-1 γραφήματα - στάδια χαλαρώσεως. Σχήμα : Στιγμιότυπα ΣΜΜΠ κατά Bellman - Ford.

53 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\graph\ graph.h> < C :LEDA\graph\graph_alg.h> < C :LEDA\graph\edge_array.h> < C :LEDA\graph\node_array.h> < C :LEDA\ core\b_queue.h> using namespace leda; using std::cout; using std::cin; using std::endl; inline void Update_pred(const graph& G,node v,const node_array<bool>& in_r, node_array<bool>& reached_from_node_in_u,node_array<edge>& pred) { reached_from_node_in_u[v]=true; edge e; forall_adj_edges(e,v) {node w=g.target(e); i f (!reached_from_node_in_u[w]) {i f (in_r[w]) pred[w]=e; Update_pred(G,w,in_R,reached_from_node_in_U,pred) ; bool Bellman_Ford_B_T(const graph& G,node s,const edge_array<int>& cost,node_array<int>& dist,node_array<edge>& pred); int m a i n () { return 0; bool Bellman_Ford_B_T(const graph& G,node s,const edge_array<int>& cost,node_array<int>& dist,node_array<edge>& pred) { int n=g.number_of_nodes() ; int phase_count=0; b_queue<node> Q(n+1); node_array<bool> in_q(g,false); node u,v; edge e; forall_nodes(v,g) pred[v]=nil; dist[s]=0; Q.append(s); in_q[s]=t rue; Q.append((node)nil); w h i l e (phase_count<n)

54 53 {u=q.pop () ; i f (u==nil) {phase_count++; i f (Q.empty()) return true; Q.append((node)nil); continue; else in_q[u]=false; int du=dist[u]; forall_adj_edges(e,u) {v=g.opposite(u,e); //Gia na douleuei kai gia mh kateuthinomena int d=du+cost [e]; i f ((pred[v]==nil && v!=s) d<dist[v]) {dist[v]=d; pred[v]=e; i f (!in_q[v]) { Q.append(v); in_q[v]=t rue; i f (pred[s]!=nil) return false; node_array<bool> in_r(g,false); forall_edges(e,g) if (e!=pred[g.target(e)]) ((graph*)&g)->hide_edge(e); DFS( G, s,in_r); ((graph*)&g)->restore_all_edges() ; node_array<bool> reached_from_node_in_u(g,false); forall_nodes(v,g) i f (in_q[v] &&!reached_from_node_in_u[v]) Update_pred(G,v,in_R,reached_from_node_in_U,pred) ; return false;

55 Εκτίμηση αλγορίθμου Διάγραμμα 14 Σχήμα : Σύγκριση υλοποιημένου Bellman Ford vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του βεβαρημένου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Ο λόγος που η έτοιμη συνάρτηση της LEDA (κόκκινη γραμμή), καταγράφει καλύτερους χρόνους απ τον υλοποιημένο αλγόριθμο του Bellman Ford (μπλε γραμμή), είναι η απλούστερη υλοποίηση της πρώτης έναντι της δεύτερης. Ο υλοποιημένος αλγόριθμος Bellman Ford περιλαμβάνει πολλές πράξεις, καθώς και αναδρομικές κλήσεις αυξάνοντας έτσι τη μνήμη που χρησιμοποιεί.

56 ΑΛΓΟΡΙΘΜΟΣ FLOYD Ανάλυση αλγορίθμου Ο αλγόριθμος επιλύει το πρόβλημα των συντομότερων μονοπατιών όλων των ζευγών ( ΣΜΟΖ) ενός γραφήματος, στηριζόμενος στην τεχνική του δυναμικού προγραμματισμού. Αφού διαταχθούν οι κορυφές με μια τυχαία σειρά διατάξεως, εκτελούνται V βήματα υπολογισμού. Κατά το L-ιοστό βήμα, κατασκευάζονται τα συντομότερα μονοπάτια π y, κόστους d y, μεταξύ όλων των ζευγών κορυφών i,j, τα οποία αποτελούνται αποκλειστικά από κορυφές που ανήκουν στο σύνολο των L πρώτων κορυφών, εφαρμόζοντας τη χαλάρωση μονοπατιού d. j =miii,d.a-v-. + d ^. Στο παρακάτω σχήμα , φαίνονται τα V διαδοχικά βήματα του αλγορίθμου.

57 Σχήμα : Παράδειγμα υπολογισμού ΣΜΟΠ κατά Floyd 56

58 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_matrix.h> < C :LEDA\graph\ graph.h> < C :LEDA\numbers\integer.h> using namespace leda; using std::cout; using std::cin; using std::endl; void FloydAPSP(const graph& G,node_matrix<int>& d,node_matrix<node>& path,node_matrix<int>& A); int m a i n () { return 0; void FloydAPSP(const graph& G,node_matrix<int>& d,node_matrix<node>& path,node_matrix<int>& A) { node i,j,l; forall_nodes(i,g) forall_nodes(j,g) { d[i][j]=maxint; path[i][j]=g.last_node(); forall_nodes(i,g) forall_nodes(j,g) if ((d[i] [j]=a[i] [j])<maxint) path[i][j]=j; forall_nodes(l,g) forall_nodes(i,g) i f (d[i][l]<maxint) forall_nodes(j, G) i f (d[i][j]>d[i][l]+d[l][i]) { p a t h [ i ] [j]=path[i] [l]; d [i] [j]=d[i] [l]+d[l] [j] ;

59 Εκτίμηση αλγορίθμου Διάγραμμα 15 Σχήμα : Σύγκριση υλοποιημένου FLOYD vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του βεβαρημένου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Η παραπάνω υλοποίηση του FLOYD (μπλε γραμμή), δεν αποδίδει καθόλου, καταγράφοντας μεγάλους χρόνους σε μικρά μεγέθη εισόδου, χωρίς μάλιστα ν αντέχει σε μεγαλύτερα όπως αντέχει η έτοιμη συνάρτηση της LEDA (κόκκινη γραμμή), ALL_PAIRS_SHORTEST_PATHS_T. Είναι λογικό να μην αποδίδει ο απλός FLOYD, δεδομένου ότι παίρνει ως ορίσματα - παραμέτρους, δισδιάστατους πίνακες που αφενός καταναλώνουν αρκετή μνήμη κάνοντας μη εφικτή την εκτέλεση σε μεγαλύτερα μεγέθη εισόδου, αφετέρου κοστίζουν σε χρόνο, μιας και ο αλγόριθμος εκτελεί επαναληπτικά πολλές πράξεις σε στοιχεία των πινάκων αυτών. Απ την άλλη, η LEDA κάνοντας καλύτερη διαχείριση μνήμης, τρέχει σε μικρότερους πάντα χρόνους, αντέχοντας και σε μεγαλύτερα μεγέθη εισόδου.

60 ΑΛΓΟΡΙΘΜΟΣ GOLDBERG - TARJAN Ανάλυση αλγορίθμου Ο αλγόριθμος βρίσκει τη μέγιστη ροή σ ένα δίκτυο ροής, με την τεχνική Προροής - Προωθήσεως. Σύμφωνα με τον Goldberg - Tarzan, όταν επιλεγεί μία ενεργή κορυφή ν, κορυφή δηλαδή που έχει περίσσευμα ροής, συνεχίζουμε να προωθούμε δια μέσου αυτής ροή, μέσω νόμιμων γειτονικών ακμών, μέχρι η ν να καταστεί ανενεργή ή να τελειώσουν οι νόμιμες ακμές, οπότε και προσαρμόζουμε το ύψος της. Στο σχήμα , βλέπουμε ένα στιγμιότυπο τρεξίματος του αλγορίθμου για ένα δίκτυο ροής. την αρχή οδηγούνται σε κορεσμό οι ακμές που οδηγούν στις κορυφές 1 και 3. Αποθηκεύεται δε, η σειρά ενεργοποίησης κορυφών σε μία ουρά Fifo, για τη μετέπειτα σειρά επεξεργασίας κορυφών. Έτσι, επεξεργαζόμενη την 1, οι 9 μονάδες που διοχετεύτηκαν σ αυτήν, διοχετεύονται στις κορυφές 2 και 4 μέσω νόμιμων ακμών, προσθέτοντας τις στην ουρά Fifo. Ο αλγόριθμος συνεχίζει με την κορυφή 2 ανάλογα κ. ο. κ. Σχήμα : Στιγμιότυπο της μεθόδου προροής - προωθήσεως με χρήση FIFO.

61 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\array.h> < C :LEDA\graph\node_list.h> < C :LEDA\graph\node_array.h> < C :LEDA\graph\edge_array.h> < C :LEDA\graph\ graph.h> < C :LEDA\core\ list.h> < C :LEDA\graph\node_matrix.h> using namespace leda; using std::cout; using std::cin; using std::endl; class fifo_set { list<node> L; p ublic: fifo_set(){ node del() {i f (!L.empty()) return L.pop(); else return nil; void insert(node v, int d) {L.append(v); void insert0(node v, int d) {L.append(v); bool empty() {return L.empty(); void clear() {L.clear(); ~fifo_set() { ; static int num_pushes,num_edge_inspections,num_relabels; int Max_Flow_Basic(const graph& G,node s,node t, const edge_array<int>& cap,edge_array<int>& flow, fifo_set& U,int& num_pushes,int& num_edge_inspections,int& num_relabels); int m a i n () { return 0; int Max_Flow_Basic(const graph& G,node s,node t,const edge_array<int>& cap,edge_array<int>& flow, fifo_set& U,int& num_pushes,int& num_edge_inspections,int& num_relabels) { //MF arxikopoiisi flow kai excess kai koresmos akmwn pou feugoun apo thn s flow.init(g,0); i f (G.outdeg(s)==0) return 0; int n=g.number_of_nodes(); int max_ level=2*n-1; int m=g.number_of_edges(); node_array<int> excess(g,0); // koresmos akmwn pou feugoun apo thn s edge e; forall_out_edges(e,s) {

62 61 U.insert(v,dist[v] ) ; int c=cap[e]; i f (c==0) continue; node v=target (e); flow[e]=c; excess[s]-=c; excess[v]+=c; //MF arxikopoiisi dist kai U node_array<int> dist(g,0); dist[s]=n; node v; forall_nodes(v, G) if (excess[v]>0) //MF arxikopoiisi metrhtwn num_relabels=num_pushes==num_edge_inspections=0; tou v //epipedo tou v //MF_BASIC main loop for (;;) { node v = U.d e l (); i f (v==nil) break; i f (v==t) continue; int ev=excess[v]; int dv=dist[v]; edge e; //excess e;e=g.adj_succ(e)) //isodinamo me (dw==dv-1) //stop: excess[v] koresmeno f o r (e=g.first_adj_edge(v); {num_edge_inspections++; int& fe=flow[e]; int rc=cap[e]-fe; i f (rc==0) continue; node w=target( e); int dw=dist[w]; i f (dw<dv) {num_pushes++; int& ew=excess[w]; i f (ew==0) U.insert0(w,dw); if (ev<=rc) {ew+=ev; fe+=ev; ev=0; break; else {ew+=rc; fe+=rc; ev-=rc; i f (ev>0) {

63 62 f o r (e=g.first_in_edge(v);e;e=g.in_succ(e) ) //isodinamo tou(dw==dv-1) //stop: excess[v] koresmeno {num_edge_inspections++; int& fe=flow[e]; i f (fe==0) continue; node w=source(e); int dw=dist[w]; i f (dw<dv) {num_pushes++; int& ew=excess[w]; i f (ew==0) U. insert0(w,dw); i f (ev<=fe) {fe-=ev; ew+=ev; ev=0; break; else {ew+=fe; ev-=fe; fe=0;

64 Εκτίμηση αλγορίθμου Διάγραμμα 16 PSEYDO LLDA SEYDO Siglv Linked LIST 1UU 1UUU LUUUU ^DUDD S'JUUO 1UUUUU Σχήμα : Σύγκριση υλοποιημένου GOLDBERG - TARJAN vs έτοιμης συνάρτησης LEDA Επεξήγηση διαγράμματος Ο οριζόντιος άξονας εκφράζει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή την πολυπλοκότητα του κατευθυνόμενου γραφήματος G, και συγκεκριμένα τον αριθμό των κορυφών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος για το αντίστοιχο μέγεθος εισόδου. Όπως φαίνεται από το διάγραμμα, ο υλοποιημένος αλγόριθμος GOLDBERG - TARJAN (μπλε και πράσινη γραμμή), αποδίδει χρονικά καλύτερα από την έτοιμη συνάρτηση της LEDA, MAX_ FLOW_T (κόκκινη γραμμή). Ο λόγος είναι, ότι η συνάρτηση της LEDA εκτελεί περισσότερους υπολογισμούς απ ότι ο αλγόριθμος GOLDBERG - TARJAN, υπολογισμούς όπως για το αν το αποτέλεσμα είναι όντως το σωστό κ.α. Άρα, η LEDA μπορεί καταγράφει μεγαλύτερους χρόνους στη συγκεκριμένη περίπτωση, παρ όλα αυτά όμως, εγγυάται ότι το αποτέλεσμα που δίνει είναι το σωστό.

65 ΑΛΓΟΡΙΘΜΟΣ LARGESTCOMMONSUBSEQ Ανάλυση αλγορίθμου Ο αλγόριθμος μετράει την ομοιότητα δύο συμβολοσειρών βρίσκοντας τη μέγιστη κοινή υπακολουθίας τους (η μεγαλύτερου μήκους υπακολουθία που εμφανίζεται και στις δύο), ως εξής: Αν x=x h, x i2,...x ik με H<i2<...<ik<n καλείται υπακολουθία μήκους k της x.. Έστω λοιπόν, x=xix2,... xn και y=y1y2...ym οι δύο συμβολοσειρές εισόδου. Η μέγιστη κοινή υπακολουθία τους z, ορίζεται ως εξής: Z=μκυ(x,y)=x ii x i2...x ik =y ji y j2...y jk με 1 <ii<i2<...<ik<n και 1<j1<j2<...<jk<n και το k έχει τη μέγιστη δυνατή τιμή. Στο σχήμα , φαίνεται ο τρόπος που τρέχει ο αλγόριθμος για να βρει τη μέγιστη ακολουθία των συμβολοσειρών ΒΑΒΕΛ ΚΑΙ ΑΒΕΛ. Αφού γεμίσει την πρώτη στήλη και γραμμή του πίνακα με 0, κάθε θέση (i,j) συμπληρώνεται ως εξής: Αν υπάρχει ταίριασμα των χαρακτήρων xi, yj, τότε στο διαγώνιο κουτί (i-1, j-1), που αφορά τα προθέματα x i.1, y j.1, θα έπρεπε να προστεθεί i στον πληθάριθμο και να επικολληθεί ο κοινός χαρακτήρας xi, yj. Διαφορετικά, γίνεται σύγκριση των θέσεων (i-1,j) και (i, j-1) και προτιμάται το πρώτο αν είναι μεγαλύτερο ή ίσο από το δεύτερο, αλλιώς το δεύτερο. 0 A 1 β 2 Ε 3 A 4 0 C C Β 1 ΤΟ TC *-1 1 A 2 το \ 1 1 *-1 1 Β 3 το Τ1 ^ Ε 4 το Τ1 Τ2 Ό 3 Λ 5 το Τ1 Τ2 Τ3 \ 4 Σχήμα : Στιγμιότυπο υπολογισμού μέγιστης κοινής υπακολουθίας

66 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\core\array.h> < C :LEDA\core\ array2.h> using namespace leda; using std::cout; using std::cin; using std::endl; int NOT_X,NOT_Y,XY; void largestcommonsubseq(array<char>& x,array<char>& y,array2<char>& lcss); int m a i n () { return 0; void largestcommonsubseq(array<char>& x,array<char>& y,array2<char>& lcss) { int n = x.size(); int m=y.size(); array2<int> b(n+1,m+1); array2<int> c(n+1,m+1); //pinakes kostous array2<int> aux(n+1,m+1); //voithitikos pinakas katagrafhs f o r (int i=0;i<=n;i++) { c(i,0)=0; b(i,0)=not_x; f o r (int i=0;i<=m;i++) { c(0,i)=0; b(0,i) =NOT_Y; f o r (int i=1;i<=n;i++) f o r (int j=1;j<=m;j++) { i f (x[i]==y[j]) { //tairiasma c(i,j)=c(i-1,j-1)+1; aux(i,j)=xy; else i f (c(i-1,j)>=c(i,j-1)) { c(i,j)=c(i-1,j); //to x(i) den anhkei aux(i,j)=not_x; else { c(i,j)=c(i,j-1); //to y(j) den anhkei aux(i,j)=not_y; f o r (int i=0;i<=n;i++) f o r (int j=0;j<=m;j++) lcss (i, j)=c(i, j) ;

67 Εκτίμηση αλγορίθμου Διάγραμμα 17 Σχήμα : Εκτίμηση υλοποιημένου LARGESTCOMMONSUBSEQ Επεξήγηση διαγράμματος Ο οριζόντιος άξονας δείχνει το μέγεθος εισόδου, ήτοι το μέγεθος των πινάκων συμβολοσειρών, των οποίων θα βρεθεί η μέγιστη κοινή υπακολουθία. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος του αλγορίθμου για το αντίστοιχο μέγεθος εισόδου. Απ το διάγραμμα είναι προφανές και λογικό ο αλγόριθμος να τρέχει σε υψηλούς σχετικά χρόνους και για μικρά μεγέθη εισόδου, δεδομένου οτι οι πολλές επαναληπτικές πράξεις σε στοιχεία δισδιάστατων πινάκων κοστίζουν σημαντικά.

68 ΑΛΓΟΡΙΘΜΟΣ HUFFMAN Ανάλυση αλγορίθμου Ο αλγόριθμος χρησιμοποιείται για συμπίεση κειμένων στηρίζοντας στην αρχή πως χαρακτήρες με μεγαλύτερη συχνότητα εμφανίσεως κωδικοποιούνται με λιγότερα bit απ ότι οι σπανιότεροι. Με την ιδιότητα των κωδικών προθεμάτων (δυαδικές συμβολοσειρές, με την κρίσιμη ιδιότητα καμία να μην αποτελεί πρόθεμα της άλλης), καθιστά δυνατή την περιγραφή των κωδικών με ένα δυαδικό δένδρο Τ, όπου κάθε αριστερή διακλάδωση αντιστοιχεί στο ψηφίο 0, κάθε δεξιά στο ψηφίο 1, ενώ κάθε φύλλο του δέντρου απεικονίζει και ένα διακριτό κωδικό. Στο σχήμα , βλέπουμε το τελικό στάδιο κωδικοποίησης της φράσης «Παράδειγμα κωδικοποιήσεως» με τον εν λόγω αλγόριθμο Πα ρά δ ΐ. y μ α κωδ l κ on ο l ή σε ω ς1 Huffman : Σχήμα : Κωδικοποίηση Huffman του «Παράδειγμα κωδικοποίησης

69 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> < C :LEDA\ core\d_array.h> < C :LEDA\ core\p_queue.h> < C :LEDA\core\impl\k_heap.h> < C :LEDA\core\impl\bin_heap.h> < C :LEDA\core\impl\m_heap.h> < C :LEDA\core\impl\p_heap.h> < C :LEDA\core\impl\r_heap.h> < C :LEDA\core\impl\list_pq.h> < C :LEDA\core\ string.h> using namespace leda; using std::cout; using std::cin; using std::endl; class huffman_node { p ublic: huffman_node *parent; int priority; bool is_left_child; huffman_node() : parent(nil) {; ; int m a i n () { d_array<char, int> H; char c; p_queue<int, huffman_node*> PQ; d_array<char, huffman_node*> leaf_belonging_to_char; float start_time=used_time(); // gia kathe xarakthra eisage ena huffman node stin priority queue // autos o node tha einai fullo tou dentrou pou tha kataskeuastei forall_defined(c,h) { //cout << c << ": " << H[c] << std::endl; huffman_node *new_leaf = new huffman_node; new_leaf->priority = H[c]; PQ.insert(H[c], new_leaf); leaf_belonging_to_char[c] = new_leaf; // kataskeui tou Huffman code // cout << "Constructing the Huffman code for all read characters.\n"; w h i l e (PQ.size() > 1) { // eksagwgh dio "paidiwn" me elaxisti proteraiotita huffman_node *left_child = PQ.inf(PQ.find_min()); P Q.del_min(); huffman_node *right_child = PQ.inf(PQ.find_min()); P Q.del_min();

70 69 // kataskeui tou neou parent node huffman_node *new_parent = new huffman_node; left_child->parent = right_child->parent = new_parent; left_child->is_left_child = t rue; right_child->is_left_child = false; new_parent->priority = left_child->priority + right_child- >priority; // eisagwgh tou neou parent stin priority queue PQ.insert(new_parent->priority, new_parent); // control output /* cout << "New parent created with priority "; cout << new_parent->priority << " = "; cout << left_child->priority << " + " << right_child->priority << " \n"; cout << "Oi Huffman kwdikes einai:\n"; */ forall_defined(c, H) { // cout << c << ": "; huffman_node *climber = leaf_belonging_to_char[c]; string huffman_code; w h i l e (climber->parent!= nil) { // min kaneis tipota gia ti riza i f (climber->is_left_child) huffman_code = "0" + huffman_code; else huffman_code = "1" + huffman_code; climber = climber->parent; // cout << huffman_code << std::endl;

71 Εκτίμηση αλγορίθμου Διάγραμμα 18 Σχήμα : Σύγκριση υλοποιημένου Huffman με 3 διαφορετικές δομές Επεξήγηση διαγράμματος Ο οριζόντιος άξονας δείχνει το μέγεθος εισόδου, τον αριθμό δηλαδή χαρακτήρων του κειμένου, και ο κάθετος άξονας το χρόνο τρεξίματος του αλγορίθμου για το αντίστοιχο μέγεθος εισόδου. Απ τους χρόνους που καταγράφει ο αλγόριθμος και με τις τρεις διαφορετικές δομές σωρού, ήτοι Fibonacci heap, k-nary heap και binary heap, είναι προφανές ότι οι διαφορές μεταξύ αυτών είναι αμελητέες και θα ήταν άστοχο να γίνει οποιαδήποτε κατάταξη καταλληλότητας. Και οι τρεις υλοποιήσεις λύνουν το πρόβλημα της συμπίεσης κειμένου αποτελεσματικά και είναι αδύνατο μέσω του Huffman, έστω μία εξ αυτών να τεθεί ως καλύτερη, από τη στιγμή που οι διαφορές χρόνων τρεξίματος αγγίζουν την τάξη των χιλιοστών του δευτερολέπτου.

72 ΑΛΓΟΡΙΘΜΟΣ BOYER - MOORE Ανάλυση αλγορίθμου Ο αλγόριθμος λύνει το πρόβλημα του ακριβούς ταιριάσματος προτύπου που ορίζεται ως εξής: Δοθέντος, μιας συμβολοσειράς Τ, μήκους n, και μιας συμβολοσειράς - πρότυπο P, ζητείται ο εντοπισμός όλων των εμφανίσεων του προτύπου στο κείμενο. Κατά τη διαδικασία, ένα παράθυρο μήκους m, τοποθετείται επί του κειμένου. Ο έλεγχος ταιριάσματος ή όχι των χαρακτήρων ξεκινά από το αριστερό άκρο του προτύπου και όσο υπάρχει επιτυχία, μετακινείται προς τα δεξιά. Όταν σημειωθεί αποτυχία, η διαδικασία επανεκινείται, αφού το παράθυρο ολισθήσει κατά έναν αριθμό θέσεων προς τα δεξιά, το μέγιστο από τις δύο τιμές που υπαγορεύουν δύο συγκεκριμένα ευρετικά κριτήρια. Στο σχήμα , φαίνεται ένα στιγμιότυπου τρεξίματος του αλγορίθμου, κατά το οποίο αναζητείται η εμφάνιση του abracadabra στο κείμενο abrababracadabra. Μετά από ένα ταίριασμα κατά την αρχική τοποθέτηση του παραθύρου, σημειώνεται η πρώτη αποτυχία. Έπειτα, βάση πρώτου κριτηρίου η ολίσθηση είναι 6 ενώ κατά το δεύτερο 4, άρα και επιλέγεται το πρώτο. Ο αλγόριθμος συνεχίζει ανάλογα. Σχήμα : Παράδειγμα εύρεσης ακριβούς ταιριάσματος προτύπου κατά BOYER - MOORE

73 Υλοποίηση αλγορίθμου με χρήση βιβλιοθήκης LEDA <iostream> <cstdio> <C:LEDA\core\array.h> <C:LEDA\core\list.h> using namespace leda; using std::cout; using std::cin; using std::endl; int bmpm(array<char>& T,array<char>& P,array<char>& S); void occurbm(array<char>& P,array<char>& S,array<int>& d); void matchmb(array<char>& P,array<int>& match); int c2i(char c,array<char>& S); int m a i n () { return 0; int bmpm(array<char>& T,array<char>& P, array<char>& S) { int n=t.size(); int m=p.size(); array<int> d(s.size()); occurbm(p,s,d); //sunarthsh emfanisews array<int> match(1,m); matchmb(p,match); //sunarthsh tairiasmatos int i=m; w h i l e (i<=n) { int j=m; w h i l e ((j>0) && (P[j]=T[i])) { //tairiasma xarakthrwn j--; i ; i f (j==0) return i+1; else parathirou kata to megisto i + = m a x (mat ch[j],d[t[i]] ); return -1; //vrethike //olisthisi tou void occurbm(array<char>& P,array<char>& S,array<int>& d) { int m=p.size(); f o r (int k=0;k<s.size();k++) d[ k]=0; f o r (int k=1;k<=p.size();k++) d[c2i(p[k],s)]=m-k; //h c2i metatrepei ton xarakthra

74 73 //ston arithmo diataksews tou sto S void matchmb(array<char>& P,array<int>& match) { int m=p.size(); array<int> fsuf(p.size()+1); f o r (int k=1;k<=p.size();k++) //arxikopoiisi match[k]=m+1; //me akiri timi olisthisews fsuf[m]=m+1; f o r (int k=m-1;k>=0;k ) { //upologismos sunarthshs apotuxias int j=fsuf[k+1]; w h i l e (j<=p.size()) { if (P[k+1]==P[j]) break; m a t c h [j]=min(match[j],j-(k+1) ); j=fsuf[j]; fsuf[k]=j-1; int l=1; int shft=fsuf[0]; w h i l e (shft<=p.size()) { //olisthisi vasei megistou tairiasmatos f o r (int k=l;k<=shft;k++) //prothematos se prosfuma ean den match[k]=min(match[k],shft);//vrethike endiamesh uposumboloseira l=shft+1; shft=fsuf[shft]; f o r (int j=1;j<=p.size();j++) //prosthesh sthn olisthisi tou plhthous match[j]+=p.size()-j; //twn xarakthrwn pou exoun tairiastei int c2i(char c,array<char>& S) { return S.binary_search(c) ;

75 Εκτίμηση αλγορίθμου Διάγραμμα 19 Σχήμα : Εκτίμηση υλοποιημένου BOYER - MOORE Επεξήγηση διαγράμματος Ο οριζόντιος άξονας δείχνει το μέγεθος εισόδου στον αλγόριθμο, δηλαδή το μέγεθος του κειμένου συμβολοσειρών. Ο κάθετος άξονας δείχνει το χρόνο τρεξίματος του αλγορίθμου για το αντίστοιχο μέγεθος εισόδου. Απ το σχήμα μπορούμε να συμπεραίνουμε ότι η υλοποίηση δεν καταναλώνει πολύ μνήμη, παράγοντας το επιθυμητό αποτέλεσμα ακόμα και για μεγάλα μεγέθη, απ την άλλη δε, εκτελεί πολλές πράξεις (ενθέσεις, συγκρίσεις ), που καταναλώνουν πολύ χρόνο.

76 75 ΚΕΦΑΛΑΙΟ 3. ΣΥΜΠΕΡΑΣΜΑΤΑ Οι αλγόριθμοι που υλοποιήθηκαν, είναι αλγόριθμοι γνωστοί, οι περισσότεροι από τους οποίους έχουν υλοποιηθεί σε πολλές γλώσσες προγραμματισμού, από διαφορετικούς προγραμματιστές. Καλύπτουν ευρύ φάσμα εφαρμογών σε πολλά πεδία (τηλεπικοινωνίες, ανάλυση δικτύων κ.α.) καθώς επιλύουν σημαντικά προβλήματα όπως εύρεση ελάχιστων επικαλύπτων δέντρων, συντομότερων μονοπατιών, μέγιστης ροής δικτύων, ομοιότητα συμβολοσειρών και πολλά άλλα. Η υλοποίηση των αλγορίθμων αυτών απαιτεί πλήθος δομών, ώστε να φέρουν εις πέρας τα ζητούμενα αποτελέσματα, πολλές εξ αυτών είναι πολύπλοκες και δύσκολο να υλοποιηθούν από τις διάφορες γλώσσες προγραμματισμού. Το περιβάλλον της βιβλιοθήκης LEDA ωστόσο, όχι μόνο διαθέτει έτοιμες υλοποιημένες τις περισσότερες από τις παραπάνω δομές, δίνοντας στο χρήστη τη δυνατότητα να τις χρησιμοποιήσει με ευκολία σε οποιαδήποτε υλοποίηση αυτός θέλει, αλλά παρέχει επίσης, πλήθος σημαντικών αλγορίθμων, εγγυώμενο για την αποτελεσματικότητα και πιστότητα αυτών. Η LEDA παρέχει δομές όπως πίνακες μονοδιάστατους ή δισδιάστατους, λίστες γραμμικά ή κυκλικά συνδεδεμένες, σύνολα, λεξικά, ουρές απλές, ουρές προτεραιοτήτων, πολλών ειδών γραφήματα και άλλες πολλές οι οποίες είναι δύσκολο να υλοποιηθούν και να διαχειριστούν σε μία γλώσσα προγραμματισμού. Οι αλγόριθμοι που υλοποιήθηκαν κατά την εργασία, έκαναν ευρεία χρήση των δομών αυτών και απέδειξαν ότι περίπλοκες εφαρμογές - αλγόριθμοι, είναι δυνατόν να αναπτυχθούν εύκολα και εγγυημένα σωστά, στο περιβάλλον της LEDA. Μάλιστα, στους αλγορίθμους αυτούς, οι δομές που χρησιμοποιήθηκαν δοκιμάστηκαν με διάφορες παραμέτρους κάθε φορά, δεδομένου ότι η LEDA δίνει τη δυνατότητα αυτή στους χρήστες της, με στόχο τον έλεγχο και εκτίμηση της αποτελεσματικότητάς τους. Τα δεδομένα έδειξαν ότι η χρήση διαφορετικών παραμέτρων, είτε στις δομές είτε στις έτοιμες συναρτήσεις, επιφέρουν διαφορετικά αποτελέσματα, κάτι που σημαίνει ότι ο χρήστης κάθε φορά μπορεί να χρησιμοποιεί τη δομή ή τον αλγόριθμο που θέλει, με τον τρόπο που του επιφέρει τα μέγιστα δυνατά αποτελέσματα. Όσον αφορά την εκτίμηση των προκειμένων, υλοποιημένων σε περιβάλλον LEDA, αλγορίθμων, τα συμπεράσματα είναι εμφανή σχεδόν σε κάθε διάγραμμα που παρουσιάστηκε. Στις συγκρίσεις μεταξύ των απλά υλοποιημένων αλγορίθμων και αυτών των έτοιμων συναρτήσεων της LEDA, διαπιστώνεται εύκολα η τεράστια υπεροχή των δεύτερων. Ο λόγος είναι σαφής: η LEDA πέρα από την καλύτερη διαχείριση μνήμης που διαθέτει, χρησιμοποιεί τις καταλληλότερες κάθε φορά δομές για την υλοποίηση του κάθε αλγορίθμου. Έτσι, αφενός πετυχαίνει καλύτερους χρόνους τρεξίματος από τους αντίστοιχους απλά υλοποιημένους αλγόριθμους, αφετέρου μπορεί να παράγει αποτελέσματα για πολύ μεγαλύτερα μεγέθη εισόδου. Δείγμα της ορθής υλοποίησης των έτοιμων συναρτήσεων της LEDA, είναι οι σταθερές αλλά μικρές διαφορές χρόνου τρεξίματος στις αυξήσεις μεγέθους εισόδου. Οι δομές που χρησιμοποιούν κάθε φορά οι διάφορες υλοποιήσεις, επηρεάζουν αντίστοιχα και τους χρόνους που καταγράφουν. Οι πίνακες και μάλιστα οι δισδιάστατοι, επιφέρουν τα χειρότερα αποτελέσματα σε χρόνους και μνήμη, ενώ

77 οι λίστες, οι ουρές ή στοίβες, προσφέρουν γρηγορότερες πράξεις και αντοχή σε μεγαλύτερα μεγέθη εισόδου. Επίσης, οι διάφορες υλοποιήσεις των δομών που υπάρχουν, συνήθως δίνουν καλύτερα αποτελέσματα για τα περισσότερα μεγέθη εισόδου, για παράδειγμα οι bounded queue έναντι της απλής queue, ή η s_list έναντι της απλής list, στο τέλος όμως, υπάρχει περίπτωση να συγκλίνουν στους ίδιους χρόνους. Γενικό συμπέρασμα, είναι ότι η χρήση της βιβλιοθήκης LEDA, διευκολύνει κατά πολύ την ανάπτυξη ακόμα και των πιο δύσκολων αλγορίθμων, προσφέροντας εγγύηση για την αποτελεσματικότητα των συναρτήσεών της, σε θέματα χρόνου και μνήμης καθώς και για την πιστότητα αυτών. 76

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

6η Διάλεξη Διάσχιση Γράφων και Δέντρων

6η Διάλεξη Διάσχιση Γράφων και Δέντρων ΘΕΩΡΙΑ ΓΡΑΦΩΝ 6 η Διάλεξη Διάσχιση Γράφων και Δέντρων Αλγόριθμος αναζήτησης σε Βαθος Αλγόριθμος αναζήτησης κατά Πλάτος Αλγόριθμοι για Δένδρα Εύρεση ελαχίστων Γεννητορικών (Επικαλύπτοντα) Δένδρων Διάσχιση

Διαβάστε περισσότερα

Μάθημα 21: Ουρές (Queues)

Μάθημα 21: Ουρές (Queues) Queues Page 1 Μάθημα 21: Ουρές (Queues) Η ουρά (queue) είναι μια δομή δεδομένων. Η βασική λειτουργικότητα είναι η εισαγωγή στοιχείων στην πίσω θέση και η εξαγωγή-διαγραφή στοιχείων από την μπροστινή θέση.

Διαβάστε περισσότερα

Διαπεράσεις Μη Κατευθυνόμενων Γραφημάτων

Διαπεράσεις Μη Κατευθυνόμενων Γραφημάτων Διαπεράσεις Μη Κατευθυνόμενων Γραφημάτων Κάθε διαδικασία συστηματικής και εξαντλητικής εξερευνήσεως ενός γραφήματος, με την εξέταση των κορυφών και ακμών του Παρ όλη την απλότητά τους, οι διαπεράσεις είναι

Διαβάστε περισσότερα

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2016-17 Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα) http://mixstef.github.io/courses/csintro/ Μ.Στεφανιδάκης Αφηρημένες

Διαβάστε περισσότερα

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων Άσκηση 1 α) Η δομή σταθμισμένης ένωσης με συμπίεση διαδρομής μπορεί να τροποποιηθεί πολύ εύκολα ώστε να υποστηρίζει τις

Διαβάστε περισσότερα

Στοιχεία Θεωρίας Γράφων (Graph Theory)

Στοιχεία Θεωρίας Γράφων (Graph Theory) Στοιχεία Θεωρίας Γράφων (Graph Theory) Ε Εξάμηνο, Τμήμα Πληροφορικής & Τεχνολογίας Υπολογιστών ΤΕΙ Λαμίας plam@inf.teilam.gr, Οι διαφάνειες βασίζονται στα βιβλία:. Αλγόριθμοι, Σχεδιασμός & Ανάλυση, η έκδοση,

Διαβάστε περισσότερα

Δομές Δεδομένων και Αλγόριθμοι

Δομές Δεδομένων και Αλγόριθμοι Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 1 Εισαγωγή 1 / 14 Δομές Δεδομένων και Αλγόριθμοι Δομή Δεδομένων Δομή δεδομένων είναι ένα σύνολο αποθηκευμένων

Διαβάστε περισσότερα

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

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00 Χρήστος. Ζαρολιάγκης Τεχνολογίες Υλοποίησης Αλγορίθµων : Άσκηση 1 1 Ασκηση 1 [16.03.2016] Παράδοση : Τετάρτη 13.04.2016, 13:00 Η παρούσα άσκηση αφορά στον έλεγχο διµερότητας ενός γραφήµατος. Σκοπός της

Διαβάστε περισσότερα

Αναζήτηση Κατά Πλάτος

Αναζήτηση Κατά Πλάτος Αναζήτηση Κατά Πλάτος Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γραφήματα Μοντελοποίηση πολλών σημαντικών προβλημάτων (π.χ. δίκτυα

Διαβάστε περισσότερα

Αναζήτηση Κατά Πλάτος

Αναζήτηση Κατά Πλάτος Αναζήτηση Κατά Πλάτος ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γραφήματα Μοντελοποίηση πολλών σημαντικών προβλημάτων (π.χ. δίκτυα συνεκτικότητα,

Διαβάστε περισσότερα

1 Διάσχιση κατευθυνόμενων γραφημάτων

1 Διάσχιση κατευθυνόμενων γραφημάτων ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010 11 Ιστοσελίδα μαθήματος: http://eclass.teilam.gr/di288 5ο ΕΡΓΑΣΤΗΡΙΟ

Διαβάστε περισσότερα

Αλγόριθμοι Ταξινόμησης Μέρος 2

Αλγόριθμοι Ταξινόμησης Μέρος 2 Αλγόριθμοι Ταξινόμησης Μέρος 2 Μανόλης Κουμπαράκης 1 Προχωρημένοι Αλγόριθμοι Ταξινόμησης Στη συνέχεια θα παρουσιάσουμε τρείς προχωρημένους αλγόριθμους ταξινόμησης: treesort, quicksort και mergesort. 2

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 8: C++ ΒΙΒΛΙΟΗΚΗ STL, ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Δομές Δεδομένων ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής Δομές

Διαβάστε περισσότερα

ΔΙΑΣΧΙΣΗ ΓΡΑΦΗΜΑΤΩΝ 1

ΔΙΑΣΧΙΣΗ ΓΡΑΦΗΜΑΤΩΝ 1 ΔΙΑΣΧΙΣΗ ΓΡΑΦΗΜΑΤΩΝ 1 Θέματα μελέτης Πρόβλημα αναζήτησης σε γραφήματα Αναζήτηση κατά βάθος (Depth-first search DFS) Αναζήτηση κατά πλάτος (Breadth-first search BFS) 2 Γράφημα (graph) Αναπαράσταση συνόλου

Διαβάστε περισσότερα

Αναζήτηση Κατά Πλάτος

Αναζήτηση Κατά Πλάτος Αναζήτηση Κατά Πλάτος ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Άδεια Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Γραφήματα. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Γραφήματα. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Γραφήματα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Γραφήματα Κατευθυνόμενο Γράφημα Ένα κατευθυνόμενο γράφημα G είναι ένα ζευγάρι (V, E) όπου V είναι ένα

Διαβάστε περισσότερα

Πληροφορική 2. Αλγόριθμοι

Πληροφορική 2. Αλγόριθμοι Πληροφορική 2 Αλγόριθμοι 1 2 Τι είναι αλγόριθμος; Αλγόριθμος είναι ένα διατεταγμένο σύνολο από σαφή βήματα το οποίο παράγει κάποιο αποτέλεσμα και τερματίζεται σε πεπερασμένο χρόνο. Ο αλγόριθμος δέχεται

Διαβάστε περισσότερα

Αναζήτηση Κατά Βάθος. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Αναζήτηση Κατά Βάθος. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Αναζήτηση Κατά Βάθος ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Αναζήτηση Κατά Βάθος (DFS) Εξερεύνηση

Διαβάστε περισσότερα

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα). Κ08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού Διδάσκων: Μανόλης Κουμπαράκης Εαρινό Εξάμηνο 2016-2017. Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Διαβάστε περισσότερα

Διάλεξη 21: Γράφοι II - Τοπολογική Ταξινόμηση

Διάλεξη 21: Γράφοι II - Τοπολογική Ταξινόμηση ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 21: Γράφοι II - Τοπολογική Ταξινόμηση Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Τοπολογική Ταξινόμηση - Εφαρμογές, Παραδείγματα, Αλγόριθμοι

Διαβάστε περισσότερα

Αναζήτηση Κατά Βάθος. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Αναζήτηση Κατά Βάθος. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Αναζήτηση Κατά Βάθος ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Άδεια Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Οι δυναμικές δομές δεδομένων στην ΑΕΠΠ

Οι δυναμικές δομές δεδομένων στην ΑΕΠΠ Καθηγητής Πληροφορικής Απαγορεύεται η αναπαραγωγή των σημειώσεων χωρίς αναφορά στην πηγή Οι σημειώσεις, αν και βασίζονται στο διδακτικό πακέτο, αποτελούν προσωπική θεώρηση της σχετικής ύλης και όχι επίσημο

Διαβάστε περισσότερα

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ 2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ Προκειμένου να επιτευχθεί η «ακριβής περιγραφή» ενός αλγορίθμου, χρησιμοποιείται κάποια γλώσσα που μπορεί να περιγράφει σειρές ενεργειών με τρόπο αυστηρό,

Διαβάστε περισσότερα

Αναζήτηση Κατά Πλάτος

Αναζήτηση Κατά Πλάτος Αναζήτηση Κατά Πλάτος Επιµέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γραφήµατα Μοντελοποίηση πολλών σηµαντικών προβληµάτων (π.χ. δίκτυα

Διαβάστε περισσότερα

Αναδρομή Ανάλυση Αλγορίθμων

Αναδρομή Ανάλυση Αλγορίθμων Αναδρομή Ανάλυση Αλγορίθμων Παράδειγμα: Υπολογισμός του παραγοντικού Ορισμός του n! n! = n x (n - 1) x x 2 x 1 Ο παραπάνω ορισμός μπορεί να γραφεί ως n! = 1 αν n = 0 n x (n -1)! αλλιώς Παράδειγμα (συνέχ).

Διαβάστε περισσότερα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( ) Τύποι Δεδομένων και Απλές Δομές Δεδομένων Παύλος Εφραιμίδης V1.0 (2014-01-13) Απλές Δομές Δεδομένων Στην ενότητα αυτή θα γνωρίσουμε ορισμένες απλές Δομές Δεδομένων και θα τις χρησιμοποιήσουμε για την αποδοτική

Διαβάστε περισσότερα

Αναζήτηση Κατά Βάθος. Επιμέλεια διαφανειών: Δ. Φωτάκης Συμπληρώσεις: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Αναζήτηση Κατά Βάθος. Επιμέλεια διαφανειών: Δ. Φωτάκης Συμπληρώσεις: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Αναζήτηση Κατά Βάθος Επιμέλεια διαφανειών: Δ. Φωτάκης Συμπληρώσεις: Α. Παγουρτζής Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Αναζήτηση Κατά Βάθος (DFS) Εξερεύνηση

Διαβάστε περισσότερα

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 10 ο. Γράφοι. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 10 ο. Γράφοι. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 10 ο Γράφοι Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Γράφοι Ορισµός Αφηρηµένος τύπος δεδοµένων Υλοποίηση Αναζήτηση έντρο

Διαβάστε περισσότερα

Αλγόριθμοι Γραφημάτων

Αλγόριθμοι Γραφημάτων Αλγόριθμοι Γραφημάτων 1. Διερεύνηση Πρώτα σε Βάθος (DFS) 2. Τοπολογική Ταξινόμηση Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη Depth-First Search Πρώτα σε Βάθος διερεύνηση (Depth-First Search) είναι

Διαβάστε περισσότερα

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 2 Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα

Διαβάστε περισσότερα

Δομές Δεδομένων και Αλγόριθμοι

Δομές Δεδομένων και Αλγόριθμοι Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 18 Dijkstra s Shortest Path Algorithm 1 / 12 Ο αλγόριθμος εύρεσης της συντομότερης διαδρομής του Dijkstra

Διαβάστε περισσότερα

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες Κατευθυνόμενο γράφημα Συνάρτηση χωρητικότητας 12 16 2 Ροή δικτύου Συνάρτηση αφετηρίακός κόμβος 13 1 με τις ακόλουθες ιδιότητες 4 14 9 7 4 τερματικός κόμβος Περιορισμός χωρητικότητας: Αντισυμμετρία: Διατήρηση

Διαβάστε περισσότερα

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

Σχεδίαση Αλγορίθμων -Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο Πολλαπλασιασμός μεγάλων ακεραίων (1) Για να πολλαπλασιάσουμε δύο ακεραίους με n 1 και n 2 ψηφία με το χέρι, θα εκτελέσουμε n 1 n 2 πράξεις πολλαπλασιασμού Πρόβλημα ρβημ όταν έχουμε πολλά ψηφία: A = 12345678901357986429

Διαβάστε περισσότερα

Περιεχόμενα. Περιεχόμενα

Περιεχόμενα. Περιεχόμενα Περιεχόμενα xv Περιεχόμενα 1 Αρχές της Java... 1 1.1 Προκαταρκτικά: Κλάσεις, Τύποι και Αντικείμενα... 2 1.1.1 Βασικοί Τύποι... 5 1.1.2 Αντικείμενα... 7 1.1.3 Τύποι Enum... 14 1.2 Μέθοδοι... 15 1.3 Εκφράσεις...

Διαβάστε περισσότερα

ΠΛΕ075: Προηγμένη Σχεδίαση Αλγορίθμων και Δομών Δεδομένων. Λουκάς Γεωργιάδης

ΠΛΕ075: Προηγμένη Σχεδίαση Αλγορίθμων και Δομών Δεδομένων. Λουκάς Γεωργιάδης ΠΛΕ075: Προηγμένη Σχεδίαση Αλγορίθμων και Δομών Δεδομένων Λουκάς Γεωργιάδης loukas@cs.uoi.gr www.cs.uoi.gr/~loukas Βασικές έννοιες και εφαρμογές Αλγόριθμος: Μέθοδος για την επίλυση ενός προβλήματος Δομή

Διαβάστε περισσότερα

Αναζήτηση σε Γράφους. Μανόλης Κουμπαράκης. ΥΣ02 Τεχνητή Νοημοσύνη 1

Αναζήτηση σε Γράφους. Μανόλης Κουμπαράκης. ΥΣ02 Τεχνητή Νοημοσύνη 1 Αναζήτηση σε Γράφους Μανόλης Κουμπαράκης ΥΣ02 Τεχνητή Νοημοσύνη 1 Πρόλογος Μέχρι τώρα έχουμε δει αλγόριθμους αναζήτησης για την περίπτωση που ο χώρος καταστάσεων είναι δένδρο (υπάρχει μία μόνο διαδρομή

Διαβάστε περισσότερα

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών Γράφημα Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 1 2 3 4 5 πλήθος κορυφών πλήθος ακμών Γράφημα Συνδυαστικό αντικείμενο που αποτελείται από

Διαβάστε περισσότερα

Αφηρημένες Δομές Δεδομένων. Στοίβα (Stack) Υλοποίηση στοίβας

Αφηρημένες Δομές Δεδομένων. Στοίβα (Stack) Υλοποίηση στοίβας Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής ισαγωγή στην πιστήμη των Υπολογιστών 2015-16 λγόριθμοι και ομές εδομένων (IΙ) (γράφοι και δένδρα) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης φηρημένες

Διαβάστε περισσότερα

Graph Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Καούρη Γεωργία Μήτσου Βάλια

Graph Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Καούρη Γεωργία Μήτσου Βάλια Graph Algorithms Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Καούρη Γεωργία Μήτσου Βάλια Περιεχόμενα Μεταβατικό Κλείσιμο Συνεκτικές συνιστώσες Συντομότερα μονοπάτια Breadth First Spanning

Διαβάστε περισσότερα

Αλγόριθµοι Γραφηµάτων

Αλγόριθµοι Γραφηµάτων Αλγόριθµοι Γραφηµάτων Παύλος Σπυράκης Πανεπιστήµιο Πατρών Τοµέας Θεµελιώσεων και Εφαρµογών της Επιστήµης των Υπολογιστών Ερευνητικό Ακαδηµαϊκό Ινστιτούτο Τεχνολογίας Υπολογιστών Γραφήµατα Μοντελοποίηση

Διαβάστε περισσότερα

ιαφάνειες παρουσίασης #11

ιαφάνειες παρουσίασης #11 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ http://www.corelab.ece.ntua.gr/courses/programming/ ιδάσκοντες: Στάθης Ζάχος (zachos@cs.ntua.gr) Νίκος Παπασπύρου (nickie@softlab.ntua.gr) ιαφάνειες παρουσίασης

Διαβάστε περισσότερα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 9: Εισαγωγή στους Γράφους Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Γράφοι - ορισμοί και υλοποίηση Διάσχιση Γράφων Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διαβάστε περισσότερα

Σχεδιαση Αλγοριθμων -Τμημα Πληροφορικης ΑΠΘ - Κεφαλαιο 9ο

Σχεδιαση Αλγοριθμων -Τμημα Πληροφορικης ΑΠΘ - Κεφαλαιο 9ο Σχεδίαση Αλγορίθμων Άπληστοι Αλγόριθμοι http://delab.csd.auth.gr/~gounaris/courses/ad 1 Άπληστοι αλγόριθμοι Προβλήματα βελτιστοποίησης ηςλύνονται με μια σειρά επιλογών που είναι: εφικτές τοπικά βέλτιστες

Διαβάστε περισσότερα

Διαίρει και Βασίλευε. πρόβλημα μεγέθους Ν. διάσπαση. πρόβλημα μεγέθους k. πρόβλημα μεγέθους Ν-k

Διαίρει και Βασίλευε. πρόβλημα μεγέθους Ν. διάσπαση. πρόβλημα μεγέθους k. πρόβλημα μεγέθους Ν-k Διαίρει και Βασίλευε πρόβλημα μεγέθους Ν διάσπαση πρόβλημα μεγέθους k πρόβλημα μεγέθους Ν-k Διαίρει και Βασίλευε πρόβλημα μεγέθους Ν διάσπαση επιλύουμε αναδρομικά τα υποπροβλήματα πρόβλημα μεγέθους k πρόβλημα

Διαβάστε περισσότερα

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι Θέματα Απόδοσης Αλγορίθμων 1 Η Ανάγκη για Δομές Δεδομένων Οι δομές δεδομένων οργανώνουν τα δεδομένα πιο αποδοτικά προγράμματα Πιο ισχυροί υπολογιστές πιο σύνθετες εφαρμογές Οι πιο σύνθετες εφαρμογές απαιτούν

Διαβάστε περισσότερα

Δομές Δεδομένων (Data Structures)

Δομές Δεδομένων (Data Structures) Δομές Δεδομένων (Data Structures) Στοίβες Ουρές Στοίβες: Βασικές Έννοιες. Ουρές: Βασικές Έννοιες. Βασικές Λειτουργίες. Παραδείγματα. Στοίβες Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή πρώτη

Διαβάστε περισσότερα

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης Δοµές Δεδοµένων 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων Ε. Μαρκάκης Περίληψη Quicksort Χαρακτηριστικά επιδόσεων Μη αναδροµική υλοποίηση Δέντρα Μαθηµατικές ιδιότητες Δοµές Δεδοµένων 11-2

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ Ενότητα 10γ: Αλγόριθμοι Γραφημάτων- Διερεύνηση Πρώτα σε Βάθος (DFS)- Τοπολογική Ταξινόμηση Μαρία Σατρατζέμη Τμήμα Εφαρμοσμένης Πληροφορικής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί

Διαβάστε περισσότερα

Αλγόριθμοι Γραφημάτων

Αλγόριθμοι Γραφημάτων Αλγόριθμοι Γραφημάτων. Γραφήματα. Αναπαράσταση Γραφημάτων 3. Διερεύνηση σε Πρώτα σε Πλάτος (BFS) Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη Γράφημα Ορισμός: Ένα γράφημα G είναι το διατεταγμένο ζεύγος

Διαβάστε περισσότερα

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά ΕΠΛ231 Δομές Δεδομένων

Διαβάστε περισσότερα

Συλλογές, Στοίβες και Ουρές

Συλλογές, Στοίβες και Ουρές Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει

Διαβάστε περισσότερα

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι - Πίνακες 1 Πίνακες Οι πίνακες έχουν σταθερό μέγεθος και τύπο δεδομένων. Βασικά πλεονεκτήματά τους είναι η απλότητα προγραμματισμού τους και η ταχύτητα. Ωστόσο δεν παρέχουν την ευελιξία η οποία απαιτείται

Διαβάστε περισσότερα

Αλγόριθµοι Τύπου Μείωσης Προβλήµατος

Αλγόριθµοι Τύπου Μείωσης Προβλήµατος Αλγόριθµοι Τύπου Μείωσης Προβλήµατος Περίληψη Αλγόριθµοι Τύπου Μείωσης Προβλήµατος ( Decrease and Conquer ) Μείωση κατά µια σταθερά (decrease by a constant) Μείωση κατά ένα ποσοστό (decrease by a constant

Διαβάστε περισσότερα

Ταξινόμηση με συγχώνευση Merge Sort

Ταξινόμηση με συγχώνευση Merge Sort Ταξινόμηση με συγχώνευση Merge Sort 7 2 9 4 2 4 7 9 7 2 2 7 9 4 4 9 7 7 2 2 9 9 4 4 Πληροφορικής 1 Διαίρει και Βασίλευε Η μέθοδος του «Διαίρει και Βασίλευε» είναι μια γενική αρχή σχεδιασμού αλγορίθμων

Διαβάστε περισσότερα

Γράφοι: κατευθυνόμενοι και μη

Γράφοι: κατευθυνόμενοι και μη Γράφοι: κατευθυνόμενοι και μη (V,E ) (V,E ) Γράφος (ή γράφημα): ζεύγος (V,E), V ένα μη κενό σύνολο, Ε διμελής σχέση πάνω στο V Μη κατευθυνόμενος γράφος: σχέση Ε συμμετρική V: κορυφές (vertices), κόμβοι

Διαβάστε περισσότερα

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι Δομές Δεδομένων & Αναζήτηση & Ταξινόμηση 1 Αναζήτηση Έχω έναν πίνακα Α με Ν στοιχεία. Πρόβλημα: Βρες αν το στοιχείο x ανήκει στον πίνακα Αν ο πίνακας είναι αταξινόμητος τότε μόνη λύση σειριακή αναζήτηση

Διαβάστε περισσότερα

Δομές δεδομένων (2) Αλγόριθμοι

Δομές δεδομένων (2) Αλγόριθμοι Δομές δεδομένων (2) Αλγόριθμοι Παράγωγοι τύποι (struct) σύνοψη προηγουμένων Πίνακες: πολλές μεταβλητές ίδιου τύπου Παράγωγοι τύποι ή Δομές (struct): ομαδοποίηση μεταβλητών διαφορετικού τύπου struct Student

Διαβάστε περισσότερα

Θεωρία Γραφημάτων Θεμελιώσεις-Αλγόριθμοι-Εφαρμογές

Θεωρία Γραφημάτων Θεμελιώσεις-Αλγόριθμοι-Εφαρμογές Θεωρία Γραφημάτων Θεμελιώσεις-Αλγόριθμοι-Εφαρμογές Ενότητα 5 ΣΥΝΕΚΤΙΚΟΤΗΤΑ Σταύρος Δ. Νικολόπουλος 2017-18 www.cs.uoi.gr/~stavros Συνεκτικότητα Έννοια της συνδεσμικότητας: «Ποσότητα συνδεσμικότητας»...

Διαβάστε περισσότερα

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Οι αλγόριθμοι ταξινόμησης: Α. SelectionSort Ταξινόμηση με Επιλογή Β. InsertionSort Ταξινόμηση με Εισαγωγή

Διαβάστε περισσότερα

Αλγοριθμικές Τεχνικές. Brute Force. Διαίρει και Βασίλευε. Παράδειγμα MergeSort. Παράδειγμα. Τεχνικές Σχεδιασμού Αλγορίθμων

Αλγοριθμικές Τεχνικές. Brute Force. Διαίρει και Βασίλευε. Παράδειγμα MergeSort. Παράδειγμα. Τεχνικές Σχεδιασμού Αλγορίθμων Τεχνικές Σχεδιασμού Αλγορίθμων Αλγοριθμικές Τεχνικές Παύλος Εφραιμίδης, Λέκτορας http://pericles.ee.duth.gr Ορισμένες γενικές αρχές για τον σχεδιασμό αλγορίθμων είναι: Διαίρει και Βασίλευε (Divide and

Διαβάστε περισσότερα

Ενότητα 5: Αλγόριθμοι γράφων και δικτύων

Ενότητα 5: Αλγόριθμοι γράφων και δικτύων Εισαγωγή στην Επιστήμη των Υπολογιστών ο εξάμηνο ΣΗΜΜΥ Ενότητα : Αλγόριθμοι γράφων και δικτύων Επιμέλεια διαφανειών: Στάθης Ζάχος, Άρης Παγουρτζής, Δημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών

Διαβάστε περισσότερα

Συντομότερες Διαδρομές

Συντομότερες Διαδρομές Συντομότερες Διαδρομές Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Συντομότερη Διαδρομή Κατευθυνόμενο G(V, E, w) με μήκη Μήκος διαδρομής

Διαβάστε περισσότερα

Βασικές Έννοιες Δοµών Δεδοµένων

Βασικές Έννοιες Δοµών Δεδοµένων Δοµές Δεδοµένων Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλήµατος του ευσταθούς ταιριάσµατος Βασικές Έννοιες

Διαβάστε περισσότερα

Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1

Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1 Σχεδίαση Αλγορίθμων Μείωσε και Βασίλευε http://delab.csd.auth.gr/~gounaris/courses/ad auth gounaris/courses/ad Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1 Μείωσε και Βασίλευε 1. Μειώνουμε

Διαβάστε περισσότερα

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

Αλγόριθμοι και Πολυπλοκότητα Αλγόριθμοι και Πολυπλοκότητα Ανάλυση Αλγορίθμων Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ανάλυση Αλγορίθμων Η ανάλυση αλγορίθμων περιλαμβάνει τη διερεύνηση του τρόπου

Διαβάστε περισσότερα

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

Εισαγωγή στους Αλγόριθμους Εισαγωγή στους Αλγόριθμους Εύη Παπαϊωάννου Σχολή Οργάνωσης και Διοίκησης Επιχειρήσεων Τμήμα Διαχείρισης Πολιτισμικού Περιβάλλοντος και Νέων Τεχνολογιών Σκοποί ενότητας Παρουσίαση και μελέτη αλγορίθμων

Διαβάστε περισσότερα

u v 4 w G 2 G 1 u v w x y z 4

u v 4 w G 2 G 1 u v w x y z 4 Διάλεξη :.0.06 Θεωρία Γραφημάτων Γραφέας: Σ. Κ. Διδάσκων: Σταύρος Κολλιόπουλος. Εισαγωγικοί ορισμοί Ορισμός. Γράφημα G καλείται ένα ζεύγος G = (V, E) όπου V είναι το σύνολο των κορυφών (ή κόμβων) και E

Διαβάστε περισσότερα

Θεωρία Γραφημάτων 6η Διάλεξη

Θεωρία Γραφημάτων 6η Διάλεξη Θεωρία Γραφημάτων 6η Διάλεξη Α. Συμβώνης Εθνικο Μετσοβειο Πολυτεχνειο Σχολη Εφαρμοσμενων Μαθηματικων και Φυσικων Επιστημων Τομεασ Μαθηματικων Φεβρουάριος 2016 Α. Συμβώνης (ΕΜΠ) Θεωρία Γραφημάτων 6η Διάλεξη

Διαβάστε περισσότερα

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής Ενότητα 8: Γραμμική Αναζήτηση και Δυαδική Αναζήτηση-Εισαγωγή στα Δέντρα και Δυαδικά Δέντρα-Δυαδικά Δέντρα Αναζήτησης & Υλοποίηση ΔΔΑ με δείκτες Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Λυσεις προβλημάτων τελικής φάσης Παγκύπριου Μαθητικού Διαγωνισμού Πληροφορικής 2007

Λυσεις προβλημάτων τελικής φάσης Παγκύπριου Μαθητικού Διαγωνισμού Πληροφορικής 2007 Λυσεις προβλημάτων τελικής φάσης Παγκύπριου Μαθητικού Διαγωνισμού Πληροφορικής 2007 Πρόβλημα 1 Το πρώτο πρόβλημα λύνεται με τη μέθοδο του Δυναμικού Προγραμματισμού. Για να το λύσουμε με Δυναμικό Προγραμματισμό

Διαβάστε περισσότερα

Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα).

Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα). Κ08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού Διδάσκων: Μανόλης Κουμπαράκης Εαρινό Εξάμηνο 2017-2018. Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα).

Διαβάστε περισσότερα

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems Ημερομηνία Παράδοσης: 0/1/017 την ώρα του μαθήματος ή με email: mkarabin@csd.uoc.gr Γενικές Οδηγίες α) Επιτρέπεται η αναζήτηση στο Internet και στην βιβλιοθήκη

Διαβάστε περισσότερα

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών : Δένδρα Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών : Ανάλυση αλγορίθμων (π.χ. δένδρα αναδρομής) Δομές δεδομένων (π.χ. δένδρα αναζήτησης) ακμή Κατηγορίες (αύξουσα

Διαβάστε περισσότερα

Διάλεξη 04: Παραδείγματα Ανάλυσης

Διάλεξη 04: Παραδείγματα Ανάλυσης Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Παραδείγματα Ανάλυσης Πολυπλοκότητας : Μέθοδοι, παραδείγματα

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ Ενότητα 10β: Αλγόριθμοι Γραφημάτων-Γραφήματα- Αναπαράσταση Γραφημάτων- Διερεύνηση Πρώτα σε Πλάτος (BFS) Μαρία Σατρατζέμη Τμήμα Εφαρμοσμένης Πληροφορικής Άδειες Χρήσης Το

Διαβάστε περισσότερα

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ Φροντιστήριο #: Εύρεση Ελαχίστων Μονοπατιών σε Γραφήματα που Περιλαμβάνουν και Αρνητικά Βάρη: Αλγόριθμος

Διαβάστε περισσότερα

Αναζήτηση Κατά Βάθος. Επιµέλεια διαφανειών:. Φωτάκης διαφάνειες για SCC: A. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Αναζήτηση Κατά Βάθος. Επιµέλεια διαφανειών:. Φωτάκης διαφάνειες για SCC: A. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Αναζήτηση Κατά Βάθος Επιµέλεια διαφανειών:. Φωτάκης διαφάνειες για SCC: A. Παγουρτζής Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Αναζήτηση Κατά Βάθος (DFS) Εξερεύνηση

Διαβάστε περισσότερα

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 11-1

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 11-1 Γράφοι Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Γράφοι - ορισµοί και υλοποίηση Διάσχιση Γράφων Τοπολογική Ταξινόµηση ΕΠΛ 23 Δοµές Δεδοµένων και Αλγόριθµοι - Γράφοι Η πιο γενική µορφή δοµής

Διαβάστε περισσότερα

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Παραδείγματα Ανάλυσης Πολυπλοκότητας : Μέθοδοι, παραδείγματα

Διαβάστε περισσότερα

Αλγόριθμοι Γραφημάτων

Αλγόριθμοι Γραφημάτων Αλγόριθμοι Γραφημάτων 1. Συντομότατα μονοπάτια 2. Αλγόριθμος Bellman-Ford 3. Αλγόριθμος Dijkstra 4. Floyd-Warshall Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη Single-Source Shortest Path Πρόβλημα:

Διαβάστε περισσότερα

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση ΑΤΔ με Συνδεδεμένες Λίστες -

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ 1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 2 ο : ΣΤΟΙΒΑ & ΟΥΡΑ ΙΣΤΟΣΕΛΙΔΑ ΜΑΘΗΜΑΤΟΣ: http://eclass.sch.gr/courses/el594100/ ΣΤΟΙΒΑ 2 Μια στοίβα

Διαβάστε περισσότερα

Αλγοριθμικές Τεχνικές

Αλγοριθμικές Τεχνικές Αλγοριθμικές Τεχνικές Παύλος Εφραιμίδης, Λέκτορας http://pericles.ee.duth.gr Αλγοριθμικές Τεχνικές 1 Τεχνικές Σχεδιασμού Αλγορίθμων Ορισμένες γενικές αρχές για τον σχεδιασμό αλγορίθμων είναι: Διαίρει και

Διαβάστε περισσότερα

Αλγόριθμοι Γραφημάτων

Αλγόριθμοι Γραφημάτων Αλγόριθμοι Γραφημάτων 1. Minimum Spanning Trees 2. Αλγόριθμος Prim 3. Αλγόριθμος Kruskal Εισαγωγή στην Ανάλυση Αλγορίθμων Μάγια Σατρατζέμη Minimum Spanning Tree Πρόβλημα: Για δοσμένο συνεκτικό, μη προσανατολισμένο,

Διαβάστε περισσότερα

Αναζήτηση στους γράφους. - Αναζήτηση η κατά βάθος Συνεκτικές Συνιστώσες - Αλγόριθμος εύρεσης συνεκτικών συνιστωσών

Αναζήτηση στους γράφους. - Αναζήτηση η κατά βάθος Συνεκτικές Συνιστώσες - Αλγόριθμος εύρεσης συνεκτικών συνιστωσών Αναζήτηση στους γράφους Βασικός αλγόριθμος λό - Αναζήτηση κατά πλάτος - Αναζήτηση η κατά βάθος Συνεκτικές Συνιστώσες - Αλγόριθμος εύρεσης συνεκτικών συνιστωσών Διάσχιση (αναζήτηση ) στους γράφους Φεύγοντας

Διαβάστε περισσότερα

Κατανεμημένα Συστήματα Ι

Κατανεμημένα Συστήματα Ι Κατανεμημένα Συστήματα Ι Παναγιώτα Παναγοπούλου Χριστίνα Σπυροπούλου 8η Διάλεξη 8 Δεκεμβρίου 2016 1 Ασύγχρονη κατασκευή BFS δέντρου Στα σύγχρονα συστήματα ο αλγόριθμος της πλημμύρας είναι ένας απλός αλλά

Διαβάστε περισσότερα

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων ΕΠΛ31 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων Στην ενότητα

Διαβάστε περισσότερα

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - Εξάμηνο 4ο Σχεδίαση Αλγορίθμων Διαίρει και Βασίλευε http://delab.csd.auth.gr/courses/algorithms/ auth 1 Διαίρει και Βασίλευε Η γνωστότερη ρημέθοδος σχεδιασμού αλγορίθμων: 1. Διαιρούμε το στιγμιότυπο του προβλήματος

Διαβάστε περισσότερα

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to Κεφάλαιο 2 Δοµές Δεδοµένων Ι Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne. 1 Δοµές Δεδοµένων Ι Στην ενότητα αυτή θα γνωρίσουµε ορισµένες Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε

Διαβάστε περισσότερα

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Γιάννης Κουτσονίκος Επίκουρος Καθηγητής Οργάνωση Δεδομένων Δομή Δεδομένων: τεχνική οργάνωσης των δεδομένων με σκοπό την

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 231: Δομές Δεδομένων και Αλγόριθμοι Εαρινό Εξάμηνο 2013 ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση Διδάσκων Καθηγητής: Παναγιώτης Ανδρέου

Διαβάστε περισσότερα

Δομές Δεδομένων και Αλγόριθμοι

Δομές Δεδομένων και Αλγόριθμοι Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 14 Στοίβες 1 / 14 Στοίβες Η στοίβα είναι μια ειδική περίπτωση γραμμικής λίστας στην οποία οι εισαγωγές

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 3. Στοίβες & Ουρές 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 19/10/2017 Ανακεφαλαίωση:

Διαβάστε περισσότερα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 20: Τοπολογική Ταξινόμηση Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ολοκλήρωση Αλγορίθμων Διάσχισης Γράφων (Από Διάλεξη 19) Τοπολογική Ταξινόμηση Εφαρμογές, Παραδείγματα, Αλγόριθμοι

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 3. Στοίβες & Ουρές 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 4/11/2016 Ανακεφαλαίωση:

Διαβάστε περισσότερα

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις Άσκηση 1 Γράψτε μία αναδρομική συνάρτηση που θα παίρνει ως παράμετρο ένα δείκτη στη ρίζα ενός δυαδικού δένδρου και θα επιστρέφει το βαθμό του

Διαβάστε περισσότερα