ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 2 ο Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
Αλγόριθµοι Ορισµός Παράδειγµα Ασυµπτωτική Ανάλυση Ανασκόπηση Αφηρηµένοι Τύποι εδοµένων Ορισµός Ακέραιος Πραγµατικός Πίνακας Σύνολο Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 2
Αλγόριθµος Σαφώς καθορισµένη υπολογιστική διεργασία που επιλύει ένα συγκεκριµένο πρόβληµα έχεται ως είσοδο ένα σύνολο από τιµές και παράγει ως έξοδο ένα σύνολο από τιµές Αφηρηµένη ιδέα ανεξάρτητη από τη µηχανή εκτέλεσης Μπορεί να περιγραφεί µε τις βασικές δοµές µιας γλώσσας προγραµµατισµού (ψευδο-κώδικα) χωρίς τις συντακτικές λεπτοµέρειες της γλώσσας Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 3
Ένα Πρόβληµα ίνεται ένα διάνυσµα x από n ακέραιους αριθµούς 31-41 59 26-53 58 97-93 -23 84 Ζητείται το µεγαλύτερο άθροισµα στοιχείων σε οποιαδήποτε συνεχόµενο υποδιάνυσµα x[i..j] του διανύσµατος x 31-41 59 26-53 58 97-93 -23 84 59 + 26 53 + 58 + 97 = 187 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 4
Λύση Εξετάζουµε µε τη σειρά όλα τα ζεύγη i,j µε 0<=i<j<n Για κάθε ζεύγος i,j υπολογίζουµε το άθροισµα Ελέγχουµε αν το άθροισµα αυτό είναι µεγαλύτερο από το µέγιστο άθροισµα που βρήκαµε µέχρι τώρα j k = i x [ k] Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 5
Ψευδο-κώδικας maxsofar = 0 for i = 1..n for j = i..n sum = 0 for k = i..j sum += x[k] maxsofar = max(maxsofar, sum) Κόστος <= n (i βρόχος) X n (j βρόχος) X n (k βρόχος) = n 3 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 6
Βελτιωµένη Λύση Το άθροισµα ενός υποδιανύσµατος x[i..j] είναι προσαύξηση κατά x[j] του αθροίσµατος του αµέσως προηγούµενου υποδιανύσµατος x[i..j-1] Άρα µπορούµε να παραλείψουµε το βρόχο k Μειώνουµε τους υπολογισµούς και το χρόνο εκτέλεσης Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 7
Ψευδο-κώδικας (2) maxsofar = 0 for i = 1..n sum = 0 for j = i..n sum += x[j] maxsofar = max(maxsofar, sum) Κόστος Υπολογισµού <= n (i βρόχος) X n (j βρόχος) = n 2 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 8
Ασυµπτωτική Ανάλυση Ρυθµός αύξησης του χρόνου υπολογισµού ενός αλγορίθµου στο όριο της τιµής εισόδου, δηλαδή καθώς το µεγέθος της τιµής εισόδου αυξάνει απεριόριστα Μας ενδιαφέρει µόνο ο ρυθµός αύξησης χρόνου εκτέλεσης Παραλείπουµε όρους χαµηλής τάξης και πολλαπλασιαστικές σταθερές Παράδειγµα Για i:1..n έχουµε n επαναλήψεις του εξωτερικού βρόχου Για j:i..n έχουµε (n+n-1 + n-2 + + 1) = n(n+1)/2 = n 2 +n/2 επαναλήψεις του εσωτερικού βρόχου Μας ενδιαφέρει ο ρυθµός αύξησης n 2 του χρόνου εκτέλεσης Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 9
Ασυµπτωτικός Συµβολισµός Έστω πραγµατικές συναρτήσεις πραγµατικής µεταβλητής f και g και σταθερές c και N έτσι ώστε f(n) <= c g(n) για κάθε n >= N Γράφουµε f = O (g) «η f είναι µεγάλο όµικρον της g» Εννοούµε ότι όταν το n γίνει αρκετά µεγάλο, τότε κάποιο σταθερό πολλαπλάσιο της g(n) γίνεται άνω όριο της f(n) Για παράδειγµα n 2 +n/2 = O(n 2 ), επειδή µε c = 2 και Ν = 1 έχουµε n 2 +n/2 <= 2n 2 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 10
Αφηρηµένοι Τύποι εδοµένων (Α Τ) Ένας τύπος δεδοµένων ορίζει ένα σύνολο από τιµές και ένα σύνολο από πράξεις στις τιµές αυτές σε κάποια γλώσσα προγραµµατισµού Π.χ. ο τύπος int έχει ένα σύνολο από τιµές 0, +-1, +-2,... και τις πράξεις πρόσθεση (+), πολλαπλασιασµός (*),... Ένας αφηρηµένος τύπος δεδοµένων ορίζει ένα µαθηµατικό µοντέλο τύπου δεδοµένων, στο οποίο ο ορισµός των τιµών και των πράξεων διαχωρίζεται από την αναπαράσταση των τιµών και την υλοποίηση των πράξεων Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 11
Πλεονεκτήµατα των ΑΤ Αφαίρεση (abstraction) Επεξεργασία της πληροφορίας σε λογικό επίπεδο Ο προγραµµατιστής επικεντρώνεται στην επίλυση του προβλήµατος και όχι στις λεπτοµέρειες των τύπων δεδοµένων Απόκρυψη πληροφορίας (information hiding) Η αναπαράσταση των δεδοµένων και η υλοποίηση των πράξεων µπορεί να µεταβληθεί Ο κώδικας του υπόλοιπου προγράµµατος παραµένει ίδιος εφόσον η προδιαγραφή των δεδοµένων και η επίδραση των πράξεων παραµένει αµετάβλητη Το πρόγραµµα διασπάται σε τµήµατα που µπορούν να συντηρηθούν ανεξάρτητα Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 12
οµική Σχέση Στοιχείων ΑΤ Γραµµική Κάθε στοιχείο έχει το πολύ ένα άµεσο προηγούµενο και το πολύ ένα άµεσο επόµενο Ιεραρχική Κάθε στοιχείο έχει το πολύ ένα άµεσο προηγούµενο αλλά µπορεί να έχει πολλά άµεσα επόµενα στοιχεία ίκτυο Κάθε στοιχείο µπορεί να έχει πολλά άµεσα προηγούµενα και πολλά άµεσα επόµενα Σύνολο Τα στοιχεία δεν έχουν καµιά σχέση µεταξύ τους... Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 13
Ορισµός δεδοµένων Ακέραιοι αριθµοί Ορισµός πράξεων ΑΤ Ακέραιος Καταχώρηση αποθηκεύει έναν ακέραιο στη µνήµη Πρόσθεση επιστρέφει το ακέραιο άθροισµα δύο ακεραίων Αφαίρεση επιστρέφει την ακέραιη διαφορά δύο ακεραίων Πολλαπλασιασµός επιστρέφει ακέραιο γινόµενο δύο ακεραίων ιαίρεση επιστρέφει το ακέραιο πηλίκο δύο ακεραίων Υπόλοιπο επιστρέφει το ακέραιο υπόλοιπο δύο ακεραίων Μηδέν ελέγχει την ισότητα ενός ακεραίου µε το µηδέν Θετικός ελέγχει αν ο ακέραιος είναι θετικός Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 14
ΑΤ Ακέραιος (2) Αναπαράσταση δεδοµένων n=16 bits µε συµβολισµό συµπληρώµατος ως προς 2 Προσηµασµένοι αριθµοί στο διάστηµα [-2 n-1.. 2 n-1-1] Το αριστερότερο bit υποδηλώνει το πρόσηµο Οι θετικοί ακολουθούν την κανονική δυαδική σειρά Π.χ. 0=(0...000 2 ), 1=(0...001 2 ),... Οι αρνητικοί προκύπτουν µε πρόσθεση 1 στο συµπλήρωµα Π.χ. (0..0001 2 =1) γίνεται (1..1110 2 ) που δίνει (1..1111 2 =-1) Υλοποίηση πράξεων void kataxorisi( int *i, int stoixeio ) { *i = stoixeio; } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 15
Ορισµός δεδοµένων Πραγµατικοί αριθµοί Ορισµός πράξεων ΑΤ Πραγµατικός Καταχώρηση αποθηκεύει ένα πραγµατικό στη µνήµη Πρόσθεση επιστρέφει το άθροισµα δύο πραγµατικών Αφαίρεση επιστρέφει τη διαφορά δύο πραγµατικών Πολλαπλασιασµός επιστρέφει το γινόµενο δύο πραγµατικών ιαίρεση επιστρέφει το πηλίκο δύο πραγµατικών Αποκοπή επιστρέφει το ακέραιο µέρος του πραγµατικού Θετικός ελέγχει αν ο πραγµατικός είναι θετικός Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 16
ΑΤ Πραγµατικός Αναπαράσταση δεδοµένων x = s b e k = 1 b s το πρόσηµο (+-1) p f k k, e min b καθορίζει το σύστηµα αρίθµησης (συνήθως 2) e η τιµή του εκθέτη (exponent) p το πλήθος των ψηφίων της βάσης (significand, mantissa) f k τα ψηφία της βάσης (significand, mantissa), 0<= f k <b Π.χ. IEEE Standard for Binary Floating-Point Arithmetic float b=2, p=24, e min =-125, e max =+128 double b=2, p=53, e min =-1021, e max =+1024 e e max βάση f1...fp εκθέτης e Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 17
Ορισµός δεδοµένων ΑΤ Πίνακας Γραµµική διάταξη στοιχείων σταθερού πλήθους και ίδιου τύπου δεδοµένων Αντιστοιχία µεταξύ στοιχείων και ακέραιων δεικτών Ορισµός πράξεων ηµιουργία επιστρέφει εναν κενό πίνακα Αποθήκευση δέχεται το όνοµα του πίνακα, την τιµή του δείκτη και την τιµή του στοιχείου, την οποία καταχωρεί στο στοιχείο του πίνακα που αντιστοιχεί στην τιµή του δείκτη Ανάκτηση δέχεται το όνοµα του πίνακα και την τιµή του δείκτη για να επιστρέψει την τιµή του στοιχείου που αντιστοιχεί στην τιµή του δείκτη Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 18
ΑΤ Πίνακας (2) Αναπαράσταση δεδοµένων #define PLITHOS 1000 typedef int stoixeio_t; typedef stoixeio_t pinakas_t[plithos]; Υλοποίηση πράξεων void kataxorisi(pinakas_t a, int i, stoixeio_t s) { } if ((0 <= i) && (i <= PLITHOS 1)) a[i] = s; else printf( Λάθος τιµή δείκτη ); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 19
Ορισµός δεδοµένων ΑΤ Σύνολο Μια συλλογή από στοιχεία που είναι µοναδικά, ίδιου τύπου δεδοµένων, άσχετα µεταξύ τους Ορισµός Πράξεων ηµιουργία κενού σύνολου, δηµιουργία καθολικού συνόλου Εισαγωγή στοιχείου, διαγραφή στοιχείου Μέλος ελέγχει αν ένα στοιχείο ανήκει σε ένα σύνολο Κενό ελέγχει αν ένα σύνολο είναι κενό Ισότητα ελέγχει την ισότητα δύο συνόλων Υποσύνολο ελέγχει αν το σύνολο Α είναι υποσύνολο του Β Ένωση, τοµή και διαφορά δύο συνόλων Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 20
ΑΤ Σύνολο (2) Αναπαράσταση δεδοµένων #define MEG_PLITHOS 1000 typedef int synolo_t[plithos]; Υλοποίηση πράξεων void katholiko(synolo_t synolo) { for (int s = 0; s < MEG_PLITHOS; s++) synolo[s] = 1; } void eisagogi(int s, synolo_t synolo) { synolo[s - 1] = 1; } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 21
ΑΤ Σύνολο (3) Υλοποίηση πράξεων (συνέχεια) int melos(int s, synolo_t synolo) { return synolo[s-1]; } void diagrafi(int s, synolo_t synolo) { synolo[s - 1] = 0; } int keno_synolo(synolo_t synolo) { int s = 1, keno = 1; while ((s <= MEG_PLITHOS) && keno) if (melos(s, synolo)) keno = 0; else s++; return keno; } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 22
Εφαρµογή του ΑΤ Σύνολο Κόσκινο του Ερατοσθένη (194 π.χ.) ίνεται θετικός ακέραιος n Να βρεθούν όλοι οι πρώτοι αριθµοί µεταξύ 1 και n Λύση ηµιουργούµε το σύνολο των ακεραίων 1..n ιαγράφουµε τον 1 (δεν είναι πρώτος αριθµός) Ενόσω το σύνολο δεν είναι κενό Βρίσκουµε το µικρότερο στοιχείο του τρέχοντος συνόλου (είναι πρώτος αριθµός) ιαγράφουµε το στοιχείο αυτό µαζί µε όλα τα πολλαπλάσιά του από το σύνολο Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 23
#define n MEG_PLITHOS Υλοποίηση Αλγορίθµου void koskinoeratostheni() { int i, j, epomeno; synolo_t koskino; } katholiko(koskino); diagrafi(1, koskino); epomeno = 1; while (!keno_synolo(koskino)) { while (!melos(epomeno, koskino)) epomeno++; printf( %d, epomeno); } for (j = epomeno; j <= n; j += epomeno) diagrafi(j, koskino); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 24