Αλγόριθμοι Χρυσόστομος Στύλιος stylios@teiep.gr Πληροφορικής Αλγόριθμοι 1
Εργασία Αντικείμενο: υλοποίηση αλγορίθμων και δομών δεδομένων σε C++ Τμήματα: - Θεωρητική μελέτη - Κώδικας με σχόλια - Πειραματικές μετρήσεις 2
Προτεινόμενα Βιβλία Δομές Δεδομένων Αλγόριθμοι και Εφαρμογές στη C++ (2004) Sartaj Shani Μετάφραση: Ι. Μανωλόπουλος, Ι. Θεοδωρίδης (Εκδόσεις Τζιόλα) Δομές Δεδομένων (Έννοιες, Τεχνικές & Αλγόριθμοι) (2002) Γεώργιος Γεωργακόπουλος (Πανεπιστημιακές εκδόσεις Κρήτης) Αλγόριθμοι στην Java, (2005) Robert Lafore (Εκδόσεις Γκιούρδας) Δομές Δεδομένων (2006) Παναγιώτης Μποζάνης, (Εκδόσεις Τζιόλα) Εισαγωγή στους Αλγορίθμους (2006) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein (Πανεπιστημιακές Εκδόσεις Κρήτης) 3
Βιβλιογραφία "Data Structures and Algorithms in C++", M. T. Goodrich, R. Tamassia and D. Mount, Wiley, 2004 "Data Structures and Algorithm Analysis'', Clifford A. Shaffer, Prentice Hall, 1997 "Algorithms Data Structures and Problem Solving Using C++'', Mark Allen Weis, Addison-Wesley, 2000 "Data Structures & Algorithm Analysis in C++, Mark Allen Weis, Addison-Wesley, 1999 4
Διδασκαλία του Μαθήματος Βασικές γνώσεις C++ (Διδάσκεται σε διαφορετικό μάθημα) Βασικές γνώσεις αλγορίθμων Θα μελετηθούν οι απαραίτητες βασικές έννοιες ώστε να προχωρήσουμε με άνεση. Δομές Δεδομένων και αλγόριθμοι 5
Στόχοι Διδασκαλίας 1. Κατανόηση της αρχής ότι κάθε δομή δεδομένων έχει υπέρ και κατά 2. Εκμάθηση των πιο δημοφιλών δομών δεδομένων Αυτές σχηματίζουν ένα βασικό σύνολο εργαλείων πάνω στις δομές δεδομένων, το οποίο είναι χρήσιμο για έναν προγραμματιστή 3. Κατανόηση των τεχνικών μέτρησης του κόστους μιας δομής δεδομένων ή ενός προγράμματος Αυτές οι τεχνικές επίσης επιτρέπουν να κριθεί η αξία νέων δομών δεδομένων που μπορεί να ανακαλυφθούν στο μέλλον 6
Εισαγωγή Μελετάμε δομές δεδομένων και μαθαίνουμε να γράφουμε αποδοτικά προγράμματα Αυτό δεν έχει να κάνει με προγραμματικά κόλπα αλλά με Καλή οργάνωση της πληροφορίας και καλούς αλγορίθμους που κερδίζουν σε: Μνήμη και χρόνο εκτέλεσης 7
Δομές Δεδομένων Αναπαράσταση δεδομένων στην μνήμη Δομές Αρχείων: αναπαράσταση δεδομένων στον δίσκο Μια συλλογή εγγραφών μπορεί να αναπαριστάνεται με λίστα ή δέντρο Τααποδοτικά προγράμματα απαιτούν αποδοτικές δομές δεδομένων Ένα πρόβλημα πρέπει να λυθεί μέσα στα όρια χρόνου και μνήμης της εφαρμογής 8
Περιορισμοί Προβλήματος Κάθε πρόβλημα βάζει περιορισμούς χρόνου και χώρου μνήμης π.χ., παράδειγμα τράπεζας: άνοιγμα λογαριασμού: μερικά λεπτά συναλλαγές: μερικά δευτερόλεπτα κλείσιμο λογαριασμού: όλη τη νύκτα Μια λύση είναι αποδοτική εάν λύνει το πρόβλημα μέσα στα όρια μνήμης και χρόνου που έχουν δοθεί Κόστος της λύσης: ποσοστό των πόρων που καταναλώθηκαν 9
Στα πλαίσια του μαθήματος Διδασκαλία δομών δεδομένων για την κύρια μνήμη και τον δίσκο Διδασκαλία αλγορίθμων για διαφορετικά προβλήματα και δομές δεδομένων Διδασκαλία της ιδέας των διλημμάτων Υπάρχουν κόστη και κέρδη που συνδέονται με κάθε δομή δεδομένων και κάθε αλγόριθμο Διδασκαλία μεθόδων μέτρησης της αποτελεσματικότητας αλγορίθμων και δομών δεδομένων 10
Επιλέγοντας Δομές Δεδομένων 1. Ανάλυση του προβλήματος για να καθοριστούν τα όρια των πόρων που η λύση πρέπει να τηρεί 2. Καθορισμός των διαδικασιών που πρέπει να υποστηρίζονται από την εφαρμογή π.χ., αναζήτηση, εισαγωγή, διαγραφή δεδομένων 3. Ποσοτικοποιήστε τα όρια για κάθε λειτουργία π.χ., η αναζήτηση πρέπει να είναι γρήγορη 4. Επιλογή της δομής δεδομένων που ικανοποιεί καλύτερα αυτές τις απαιτήσεις 11
Κόστος & Κέρδος Κάθε δομή δεδομένων χρειάζεται: Χώρο για τον κάθε τύπο δεδομένων που αποθηκεύει Χρόνο εκτέλεσης κάθε λειτουργίας Προγραμματιστική προσπάθεια για να αναπτυχθεί Κάθε δομή δεδομένων έχει κόστη και κέρδη Σπάνια μια δομή δεδομένων είναι καλύτερη από μια άλλη σε όλες τις περιπτώσεις Κάποια μπορεί να επιτρέπει γρηγορότερη αναζήτηση (ή εισαγωγή ή διαγραφή) από μια άλλη Είναι όλες οι διαδικασίες το ίδιο σημαντικές; 12
Διάρθρωση Μαθήματος Εισαγωγή στη C και C++ Θέματα αλγορίθμων & απόδοσης αλγορίθμων Αναπαράσταση δεδομένων Πίνακες Λίστες, Στοίβες, Ουρές Δένδρα (Δυαδικά, Αναζήτησης, AVL) Σωροί Αναζήτηση και Ταξινόμηση Κατακερματισμός 13
Εισαγωγή στις γλώσσες C και C++ 14
Βασικά Στοιχεία Γλωσσών Οι γλώσσες προγραμματισμού αποτελούν εργαλεία για την ανάπτυξη πακέτων λογισμικού (προγράμματα). Πρόγραμμα = Υλοποίηση Αλγορίθμων + Υλοποίηση Δομών Δεδομένων 15
Διαχωρισμός Γλωσσών Δομημένες Γλώσσες Προγραμματισμού, όπως Pascal, C Γλώσσες Βασισμένες στα Αντικείμενα (object-oriented), C++, Java. 16
Ένα Απλό Παράδειγμα C # include <stdio.h> main ( ) { int x, y; x = 5; y=4; printf ( x + y = %d, x+y); } 17
Χαρακτηριστικά της C Γλώσσα μετρίου επιπέδου Οικονομία στην έκφραση (λιτή και περιεκτική) Σχετικά χαλαρό σύστημα τύπων Φιλοσοφία: ο προγραμματιστής έχει πλήρη έλεγχο και ευθύνεται για τα σφάλματά του 18
Χαρακτηριστικά της C Ιδιαίτερα δημοφιλής στην πράξη Έχει χρησιμοποιηθεί για τον προγραμματισμό ευρέως φάσματος συστημάτων και εφαρμογών Έχει χρησιμοποιηθεί ως βάση για πληθώρα άλλων γλωσσών: C++, Java 19
Εκτέλεση Προγραμμάτων Πηγαίος κώδικας (source) demo.c Προεπεξεργαστής C (preprocessor) Μεταγλωττιστής C (compiler) stdio.h Αρχεία επικεφαλίδας (header files) Object code demo.obj Εκτελέσιμο πρόγραμμα (executable) demo.exe Συνδέτης (linker) printf Βιβλιοθήκη (library) 20
Πιο Σύνθετο Παράδειγμα C #include <stdio.h> #include <math.h> #define PI 3.14 main () { float e,p,r; printf( Δώσε την ακτίνα του κύκλου: \n"); scanf("%f", &r); /* Εισαγωγή της ακτίνας από το χρήστη*/ e=pi*pow(r,2); /* Εύρεση του εμβαδού του κύκλου από τον τύπο Ε=π*r2 */ p=2*pi*r; /* Εύρεση της περιμέτρου του κύκλου από τον τύπο Π=2*π*r */ printf("to εμβαδό του κύκλου είναι ίσο με %.2f και η" "περίμετρος του κύκλου είναι ίση με %.2f", e, p); } 21
Βασικοί Τύποι Δεδομένων char, signed char, unsigned char signed short int, unsigned short int signed int, unsigned int signed long int, unsigned long int float, double, long double 22
Μεταβλητές int x; int x, y, z; double r; unsigned long abc; int x = 1; int x, y = 0, z = 2; double r = 1.87; unsigned long abc = 42000000; 23
Σταθερές ακέραιες σταθερές 42 0-1 δεκαδικές 037 οκταδικές 0x1f δεκαεξαδικές 42U 42L 42UL unsigned & long σταθερές κινητής υποδιαστολής 42.0-1.3 δεκαδικές 2.99e8 με δύναμη του 10 42.0F 42.0L float & long double 24
Σταθερές (συνέχεια) χαρακτήρα 'a' '0' '$' ειδικοί χαρακτήρες \n αλλαγή γραμμής \' απόστροφος \\ χαρακτήρας \ (backslash) \t αλλαγή στήλης (tab) \" εισαγωγικό \0 χαρακτήρας με ASCII = 0 (null) \037» με ASCII = 37 (οκταδικό) \x1f» με ASCII = 1f (δεκαεξαδικό) 25
Σταθερές (συνέχεια) συμβολοσειρές "abc" "Hello world!\n" "a\"51\"" δηλώσεις σταθερών const int size = 10, num = 5; const double pi = 3.14159; const char newline = '\n'; 26
printf ( ): εκτύπωση απλοί τύποι δεδομένων int %d char %c double %lf string %s παράδειγμα printf("%d %lf %c %s\n", 42, 1.2, 'a', aloha"); αποτέλεσμα 42 1.200000 a aloha 27
scanf ( ): ανάγνωση Ίδιοι κωδικοί για τους απλούς τύπους Παράδειγμα int n; double d; char c; scanf("%d", &n); scanf("%lf", &d); scanf("%c", &c); 28
Τελεστές και Εκφράσεις αριθμητικοί τελεστές + - * / % σχεσιακοί τελεστές ==!= < > <= >= λογικοί τελεστές && λογική σύζευξη (και) λογική διάζευξη (ή)! λογική άρνηση (όχι) π.χ. (x % 3!= 0) &&!finished 29
Τελεστές και Εκφράσεις (συνέχεια) τελεστές bit προς bit (bitwise) & σύζευξη bit (AND) διάζευξη bit (OR) ^ αποκλειστική διάζευξη bit (XOR) ~ άρνηση (NOT) << ολίσθηση bit αριστερά >> ολίσθηση bit δεξιά παράδειγμα (0x0101 & 0xfff0) << 2 0x0400 30
Τελεστές και Εκφράσεις (συνέχεια) τελεστής συνθήκης (a >= b)? a : b τελεστής παράθεσης a-1, b+5 τελεστές ανάθεσης a = b+1 a += x ισοδύναμο με a = a + x τελεστές αύξησης και μείωσης a++ a-- τιμή πριν τη μεταβολή ++a --a τιμή μετά τη μεταβολή 31
Έλεγχος Ροής Προγράμματος Εντολή if if (a >= b) max = a; else max = b; 32
Έλεγχος Ροής Προγράμματος Σύνθετη εντολή if (a >= b) { min = b; max = a; } else { max = b; min = a; } Ορίζει νέα εμβέλεια if (x < y) { int temp = x; } x = y; y = temp; 33
Έλεγχος Ροής Προγράμματος while (συνθήκη) εντολή Εντολή while int i = 1, s = 0; while (i <= 10) { s += i; i++; } συνθήκη αληθής εντολή ψευδής 34
Έλεγχος Ροής Προγράμματος do εντολή while (συνθήκη); Εντολή do-while int i = 1, s = 0; do { s += i++; } while (i <= 10); εντολή συνθήκη ψευδής αληθής 35
Έλεγχος Ροής Προγράμματος for (αρχικοποίηση ; συνθήκη ; βήμα) εντολή Εντολή for int i, s; for (i=1, s=0; i <= 10; i++) s += i; αρχικοποίηση συνθήκη αληθής εντολή βήμα ψευδής 36
Εντολή break int s; for (i=0, s=0; i < 10; i++) { int x; scanf("%d", &x); if (x < 0) break; s += x; } printf("sum is: %d\n", s); 37
Εντολή continue int s; for (i=0, s=0; i < 10; i++) { int x; scanf("%d", &x); if (x < 0) continue; s += x; } printf("sum is: %d\n", s); 38
switch (ch) { Eντολή switch } case 'a': printf("alpha\n"); break; case 'b': case 'c': printf("beta or c\n"); break; default: printf("other\n"); 39
Εντολή goto int i = 1, s = 0; loop: s += i++; if (i < 10) goto loop; printf("the sum is %d\n", s); Όχι goto: δομημένος προγραμματισμός! 40
Αντικειμενοστρεφής Προγραμματισμός Τι είναι: Μοντέλο προγραμματισμού -> Ένας τρόπος σκέψης Τυπικός ορισμός: Η αντικειμενοστρέφεια (object-orientation) είναι μία προσέγγιση στην ανάπτυξη λογισμικού που οργανώνει τόσο το πρόβλημα όσο και τη λύση του ως μία συλλογή από διακριτά αντικείμενα. Τα αντικείμενα αλληλεπιδρούν για την επίλυση του προβλήματος 41
Αντικειμενοστρεφής Προγραμματισμός 1967: Simula67 (Νορβηγία) -> πρώτη αντικειμενοστρεφής γλώσσα 70: Smalltalk (Palo Alto, CA) -> κάθε στοιχείo ένα αντικείμενο Αρχές 80: o αντικειμενοστρεφής τρόπος σκέψης εισάγεται σε ακαδημαϊκούς κύκλους 80: C++ (Stroustrup, AT&T): σοβαρή, αποδοτική γλώσσα, πρότυπο στη βιομηχανία 1995: JAVA, Sun Microsystems 42