Τεχνολογίες Υλοποίησης Αλγορίθµων Σχολιασµένη Βιβλιογραϕία Χρηστος. Ζαρολιαγκης Καθηγητής Τµήµα Μηχ/κων Υπολογιστών & Πληροϕορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Φεβρουάριος 2013 1
Περίληψη Το παρόν κείµενο παρουσιάζει µια ϐασική σχολιασµένη ϐιβλιογραϕία για το µάθηµα Τεχνολογίες Υλοποίησης Αλγορίθµων. Περιέχει µια λίστα ϐιβλίων τα οποία καλύπτουν ένα µεγάλο µέρος του µαθήµατος, καθώς και Ϲητήµατα «συγγενών» γνωστικών περιοχών. Ανάλογα µε τις γνώσεις σας, κάποια µπορεί να είναι καταλληλότερα από κάποια άλλα. 2
1 Τεχνολογίες Υλοποίησης Αλγορίθµων Οι Τεχνολογίες Υλοποίησης Αλγορίθµων (Algorithm Engineering) είναι ένας σχετικά νέος κλάδος της Επιστήµης και Τεχνολογίας Υπολογιστών, που αναπτύχθηκε στο δεύτερο ήµισυ της δεκαετίας του 1990. Ασχολείται κυρίως µε την αποδοτική υλοποίηση αλγορίθµων και δοµών δεδοµένων, καθώς και µε την εκτενή ανάλυση και πειραµατική αξιολόγησή τους, έτσι ώστε το προκύπτον λογισµικό να έχει πρακτική εϕαρµογή. Ασχολείται επίσης µε Ϲητήµατα δηµιουργίας περιβαλλόντων και ϐιβλιοθηκών λογισµικού που επιτρέπουν την εύκολη υλοποίηση και πειραµατική αξιολόγηση αλγορίθµων, και µε Ϲητήµατα µεθοδολογίας σε ότι αϕορά την πει- ϱαµατική έρευνα αλγορίθµων και δοµών δεδοµένων, καθώς και σε ότι αϕορά τη διαδικασία µετατροπής των απαιτήσεων του χρήστη σε αποδοτικές αλγοριθµικές λύσεις και υλοποιήσεις Υπάρχουν τρία πολύ αξιόλογα ϐιβλία σχετικά µε το περιεχόµενο του µαθήµατος. Το πρώτο είναι το κλασσικό ϐιβλίο των Mehlhorn και Naeher [8], το οποίο πραγµατεύεται διεξοδικά τα Ϲητήµατα εύκολης και αποδοτικής υλοποίησης ϐασικών και προηγµένων αλγο- ϱίθµων και δοµών δεδοµένων, µε χρήση της (πιο επιτυχηµένης) ϐιβλιοθήκης/περιβάλλοντος ανάπτυξης αλγορίθµων LEDA (Library for Efficient Data types and Algorithms). Το ϐιβλίο καλύπτει σχεδόν πλήρως το αντικείµενο του µαθήµατος µε χρήση της ϐιβλιοθήκης LEDA ειδικά σε ότι αϕορά την αποδοτική υλοποίηση αλγορίθµων και δοµών δεδοµένων, παρουσιά- Ϲοντας (σε αρκετά µεγάλο ϐάθος) τεχνικές και παραδείγµατα υλοποίησης και πειραµατικής αξιολόγηση µιας πληθώρας αλγορίθµων και δοµών δεδοµένων. Το ϐιβλίο αυτό αποτελεί το κυρίως ϐιβλίο του παρόντος µαθήµατος. Το δεύτερο ϐιβλίο [9], που επιµελήθηκαν οι Mueller-Hannemann και Schirra, πραγµατεύεται όλα σχεδόν τα Ϲητήµατα του κλάδου των Τεχνολογιών Υλοποίησης Αλγορίθµων, και κυρίως Ϲητήµατα µοντελοποίησης προβληµάτων, µεθοδολογίας σχεδιασµού σωστών υλοποιήσεων, δηµιουργίας περιβαλλόντων και ϐιβλιοθηκών λογισµικού, και πειραµατικής αξιολόγησης. Ουσιαστικά, είναι µια εκτενής καταγραϕή της εξέλιξης του κλάδου από τη δεκαετία του 1990 έως σήµερα. Το τρίτο (και πιο πρόσϕατο) ϐιβλίο [7] αϕορά Ϲητήµατα πειραµατικής αξιολόγησης αλγο- ϱίθµων καθώς και µεθοδολογικά Ϲητήµατα σχεδιασµού πειραµάτων. Μία εναλλακτική και ενδιαϕέρουσα µεθοδολογία υλοποίησης αλγορίθµων (που ϑα εξεταστεί και στο µάθηµα) είναι αυτή του γενικευµένου προγραµµατισµού (generic programming). Ο γενικευµένος προγραµµατισµός αποτελεί το υπόβαθρο της ϐιβλιοθήκης της C++και ειδικότερα το τµήµα που ονοµάζεται Standard Template Library (STL). Η µελέτη της STL µπορεί να ξεκινήσει από το ϐιβλίο [6] που παρουσιάζει µε πληρότητα την αρχιτεκτονική της STL καθώς και τους αλγόριθµους και τις δοµές δεδοµένων που παρέχει. Περαιτέρω µελέτη του γενικευµένου προγραµµατισµού γίνεται στο ϐιβλίο [1]. Ειδικότερα στο ϐιβλίο [1] αναλύεται η χρησιµότατη µεθοδολογία του σχεδιασµού κλάσεων µε πολιτικές (policy-based class design). Τέλος, όσοι ενδιαϕέρονται για τεχνικές γενικευµένου προγραµµατισµού στην υλοποίηση αλγορίθµων για γραϕήµατα µπορούν να ανατρέξουν στο ϐιβλίο [11], και για πιο προχωρηµένες εϕαρµογές στο ϐιβλίο [2]. Βιβλία τα οποία καλύπτουν γενικά το αντικείµενο της υλοποίησης αλγορίθµων και δοµών δεδοµένων είναι τα ϐιβλία των Sahni [10] και Weiss [12], αλλά είναι σε εισαγωγικό επίπεδο και δεν προχωρούν σε µεγάλο ϐάθος. Χρήσιµα µπορεί να ϐρείτε και τα ϐιβλία [4, 5]. 3
Αναϕορές [1] A. Alexandrescu, Modern C++design: Programming and Design Patterns Applied, Addison-Wesley, 2001. [2] D. Abrahams and A. Gurtovoy, C++ Template Metaprogramming : Concepts, Tools, and Techniques from Boost and Beyond, Addison-Wesley, 2004. [3] T. Budd, Data structures in C++ using the standard template library, Addison-Wesley, 1998. [4] F. Carrano, P. Helman, and R. Veroff, Data abstraction and problem solving with C++, 2nd Edition, Addison-Wesley, 1998. [5] E. Horowitz, S. Sahni, and D. Mehta, Fundamentals of data structures in C++, Computer Science Press, 1995. [6] N. Jossutis, The C++standard library: a tutorial and a reference, Addison Wesley Longman, 1999. [7] C.C. McGeoch, A Guide to Experimental Algorithmics, Cambridge University Press, 2012. [8] K. Mehlhorn and S. Naeher, LEDA: A platform for combinatorial and geometric computing, Cambridge University Press, 1999. [9] M. Mueller-Hannemanni and S. Schirra, Algorithm Engineering - Bridging the Gap between Algorithm Theory and Practice, Springer 2010. [10] S. Sahni, Data structures, algorithms, and applications in C++, WCB/McGraw-Hill, 1998. [11] J. Siek, A. Lumsdaine, L. Lee, The Boost Graph Library: User Guide and Reference Manual, Addison Wesley, 2002. [12] M.A. Weiss, Data structures and problem Solving with C++, 2nd Edition, Addison- Wesley, 2000. 4
2 Η Γλώσσα C++ Υπάρχουν πολλά διαθέσιµα ϐιβλία για C++ σε διάϕορα επίπεδα. Για όσους έχουν µικρή προγραµµατιστική εµπειρία, ένα αρκετά καλό ϐιβλίο είναι το [1]. Οσοι διαθέτουν µια καλή εµπειρία προγραµµατισµού µπορούν να ανατρέξουν στα ϐιβλία [3, 5, 6]. Το ϐιβλίο των Lippman και Lajoie [3] είναι πολύ καλό, ενώ µια διαϕορετική προσέγγιση µε περισσότερη έµϕαση στον γενικευµένο προγραµµατισµό προσϕέρεται από το ϐιβλίο των Koenig και Moo [2]. Ενα πολύ καλό ϐιβλίο σε προχωρηµένα ϑέµατα C++ είναι αυτό του Meyers [4]. Αναϕορές [1] H.M. Deitel and P.J. Deitel, C++: How to Program, 2nd Edition, Prentice-Hall, 1998. [2] A. Koenig and B. Moo, Accelerated C++, Addison-Wesley, 2000. [3] S.B. Lippman and J. Lajoie, C++ Primer, 3rd Edition, Addison-Wesley, 1998. [4] S. Meyers, Effective C++, 2nd Edition, Addison-Wesley, 1997. [5] I. Pohl, Object-Oriented Programming using C++, 2nd Edition, Addison-Wesley, 1997. [6] B. Stroustrup, The C++ Programming Language, 3rd Edition, Addison-Wesley, 1997. 3 Αντικειµενοστρεϕής Σχεδιασµός, Ανάλυση και Προγραµ- µατισµός Μερικά κλασικά ϐιβλία για την αντικειµενοστρεϕή µεθοδολογία είναι τα [1, 4, 5]. Πιο πρόσϕατα και συνιστώµενα ϐιβλία είναι τα [2, 3]. Το τελευταίο ϐιβλίο [3] εισάγει την έννοια των σχεδιαστικών προτύπων (design patterns) η οποία αποδείχθηκε µια από τις πλέον ϑεµελιώδεις στο σχεδιασµό λογισµικού τα τελευταία χρόνια. Αναϕορές [1] G. Booch, Object Oriented Design with Applications, 2nd Edition, Benjamin Cummings, 1994. [2] T. Budd, An Introduction to Object-Oriented Programming, 2nd Edition, Addison- Wesley, 1997. [3] E. Gamma, R. Helms, R. Johnson, and J. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1995. 5
[4] B. Meyer, Object Oriented Software Construction, Prentice-Hall, 1988. [5] J. Rumbaugh, M. Blaha, W. Premerlani, F. Eddy, and W. Lorenson, Object Oriented Modelling and Design, Prentice Hall, 1991. 4 Αλγόριθµοι και οµές εδοµένων Γενικά Υπάρχει µια πληθώρα καλών ϐιβλίων για τον (ϑεωρητικό) σχεδιασµό και την ανάλυση αλγο- ϱίθµων και δοµών δεδοµένων. Συνιστώµενα αντιπροσωπευτικά δείγµατα αποτελούν τα ϐιβλία [1, 2, 3, 4, 5]. Τα ϐιβλία [3, 4] είναι πολύ καλά και περιέχουν αρκετό υλικό πρόσϕατων ερευνητικών αποτελεσµάτων σε αλγορίθµους και δοµές δεδοµένων. Το ίδιο ισχύει και για το ϐιβλίο [2], το οποίο είναι σε πιο προχωρηµένο επίπεδο και εστιάζει κυρίως σε ϑέµατα ϱοών και συντοµότερων διαδροµών. References [1] A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983. [2] R. Ahuja, T. Magnanti, and J. Orlin, Network Flows, Prentice-Hall, 1993. [3] T. Cormen, C. Leiserson, R. Rivest, and C. Stein, Εισαγωγή στους Αλγορίθµους, ελληνική έκδοση, Πανεπιστηµιακές Εκδόσεις Κρήτης, 2012. [4] J. Kleinberg and E. Tardos, Σχεδιασµός Αλγορίθµων, ελληνική έκδοση, Εκδόσεις Κλειδάριθµος, 2008. [5] R.E. Tarjan, Data Structures and Network Algorithms, SIAM, 1983. 6