Προχωρημένες έννοιες προγραμματισμού σε C

Σχετικά έγγραφα
Επεξεργασία κειμένου και συμβολοσειρών σε C

Προέλευση της Pazcal ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

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

Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

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

Ταξινόμηση. Παύλος Εφραιμίδης. Δομές Δεδομένων Ταξινόμηση 1

Αλγόριθμοι Αναζήτησης

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

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

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

Αλγόριθμοι ταξινόμησης

Εισαγωγή σε βασικές έννοιες του Internet

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

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

Λειτουργικό σύστημα Unix

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

Τίτλος Μαθήματος: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ιαίρει-και-βασίλευε ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Ταξινόµηση. Παύλος Εφραιµίδης. οµές εδοµένων και

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

Μεταγλωττιστές Βελτιστοποίηση

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

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

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Μεταγλωττιστές Βελτιστοποίηση

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομημένος Προγραμματισμός

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Quicksort. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

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

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

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

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Δομημένος Προγραμματισμός

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

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

Εργαστηριακή Άσκηση 1

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός

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

Συντομότερα Μονοπάτια για Όλα τα Ζεύγη Κορυφών

Δομημένος Προγραμματισμός

Πληροφορική ΙΙ Ενότητα 1

Διαίρει-και-Βασίλευε. Διαίρει-και-Βασίλευε. MergeSort. MergeSort. Πρόβλημα Ταξινόμησης: Είσοδος : ακολουθία n αριθμών (α 1

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

Εισαγωγή στον Προγραμματισμό

Αλγόριθμοι και Δομές Δεδομένων(Θ) Ευάγγελος Γ. Ούτσιος

Δομημένος Προγραμματισμός

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 8: Αναζήτηση και ταξινόμηση

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

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Σχεδίαση και Ανάλυση Αλγορίθμων

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δείκτες Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

Δομημένος Προγραμματισμός

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προχωρημένες έννοιες προγραμματισμού σε Pazcal

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Quicksort [Hoare, 62] Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Quicksort 1

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

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις II Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Αλγόριθμοι και πολυπλοκότητα Ταχυταξινόμηση (Quick-Sort)

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

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

Διδάσκων: Παναγιώτης Ανδρέου

Στατιστική Επιχειρήσεων

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αποτελέσματα προόδου

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Λεξικό, Union Find. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Transcript:

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες: Στάθης Ζάχος (zachos@cs.ntua.gr) Νίκος Παπασπύρου (nickie@softlab.ntua.gr) Δημήτρης Φωτάκης fotakis@cs.ntua.gr) Προχωρημένες έννοιες προγραμματισμού σε C

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

Δείκτες (i) Δείκτης (pointer): η διεύθυνση μιας περιοχής της μνήμης όπου βρίσκεται μια μεταβλητή Παράδειγμα int *p; p... /* οδείκτης p τοποθετείται να δείχνει σε κάποια ακέραια μεταβλητή */... *p = 42; WRITELN(*p + 1); 42 4 206

Δείκτες (ii) Κενός δείκτης (NULL): ειδική τιμή δείκτη που δε δείχνει πουθενά Παράδειγμα int *p;... p = NULL; p Απαγορεύεται η προσπέλαση της μνήμης μέσω ενός κενού δείκτη p = NULL; WRITELN(*p); // λάθος! 5 207

Δείκτες (iii) Δεικτοδότηση: & η διεύθυνση μιας μεταβλητής int x = 17, *p; p = &x; Αποδεικτοδότηση: * το περιεχόμενο μιας διεύθυνσης WRITELN(*p); *p = 42; WRITELN(x); x 17 42 p 6 208

Δείκτες και ανάθεση Ανάθεση δεικτών q = p; p 42 q 17 p q 42 17 μετά πριν Ανάθεση περιεχομένων *q = *p; p q 42 42 μετά 7 209

Παράδειγμα με δείκτες PROGRAM example () { int x = 42, y = 17; int *p, *q; p = &x; q = &y; *p = *p - *q; *q = *p *y; q = p; (*q)++; *p -= 3; WRITESPLN(x, y); p q 23 425 26 42 25 23 x 425 17 y 8 210

Δείκτες αντί περάσματος με αναφορά int gcd (int a, int b); void normalize (int *p, int *q) { int g = gcd(*p, *q); *p /= g; *q /= g; int main () { int x, y; scanf("%d %d", &x, &y); normalize(&x, &y); printf("%d %d\n", x, y); return 0; 9 211

Πίνακες και δείκτες (i) Αριθμητική δεικτών int a[3] = {7, 6, 42; int *p; p = &(a[0]); p = &a; p = a; a 7 6 42 WRITELN(*p); WRITELN(*(p+1)); p = p+2; WRITELN(*p); 7 6 42 p 10 212

Πίνακες και δείκτες (ii) Ισοδυναμία πινάκων και δεικτών Ένας πίνακας είναι ένας δείκτης στο πρώτο στοιχείο. a[i] ισοδύναμο με *(a+i) Οι πίνακες όμως είναι σταθεροί δείκτες, δηλαδή δεν μπορούν να αλλάξουν τιμή int a[3] = {7, 6, 42; int *p = &a; p++; /* σωστό */ a++; /* λάθος! */ 11 213

Πίνακες και δείκτες (iii) Συμβολοσειρές char a[15] = "Hello world!", b[15]; // a[12] == '\0' void strcpy (char *t, char *s) { while ((*t++ = *s++)!= '\0'); int main () { strcpy(b, a); printf("%s\n", a); return 0; 12 214

Πίνακες και δείκτες (iv) Εκτύπωση συμβολοσειράς void putchar (char c); void puts (char *p) { while (*p!= '\0') putchar(*p++); int main () { char s[] = "Hello world!\n"; puts(s); return 0; 13 215

(i) Πρόβλημα: να αναδιαταχθούν τα στοιχεία ενός πίνακα ακεραίων σε αύξουσα σειρά Μια από τις σημαντικότερες εφαρμογές των ηλεκτρονικών υπολογιστών Βασική διαδικασία: εναλλαγή τιμών PROC swap (int *x, int *y); { int save; save = *x; *x = *y; *y = save; 14 216

(ii) Ταξινόμηση με επιλογή (selection sort) FOR (i, 0 TO n-2) { int minj = i; FOR (j, i+1 TO n-1) if (a[j] < a[minj]) minj = j; swap(&(a[i]), &(a[minj])); Πλήθος συγκρίσεων; της τάξης του n 2 O(n 2 ) 15 217

(iii) Ταξινόμηση με εισαγωγή (insertion sort) FOR (i, 1 TO n-1) { int x = a[i], j = i; while (j > 0 AND a[j-1] > x) { a[j] = a[j-1]; j = j-1; a[j] = x; Πλήθος συγκρίσεων; της τάξης του n 2 O(n 2 ) 16 218

(iv) Μέθοδος της φυσαλίδας (bubble sort) FOR (i, 0 TO n-2) FOR (j, n-2 DOWNTO i) if (a[j] > a[j+1]) swap(&(a[j]), &(a[j+1])); Πλήθος συγκρίσεων (n 1) + (n 2) +... + 2 + 1 = n (n 1) / 2 της τάξης του n 2 O(n 2 ) 17 219

(v) Παράδειγμα εκτέλεσης (n = 7) 2 0 3 4 1 5 18 220

(vi) Βελτίωση με έλεγχο εναλλαγών FOR (i, 0 TO n-2) { bool swaps = false; FOR (j, n-2 DOWNTO i) if (a[j] > a[j+1]) { swaps = true; swap(&(a[j]), &(a[j+1])); if (NOT swaps) break; Στην καλύτερη περίπτωση απαιτούνται O(n) συγκρίσεις, στη χειρότερη O(n 2 ) 19 221

(vii) Ταξινόμηση με συγχώνευση (merge sort) Διαιρώ την ακολουθία των αριθμών σε δύο μέρη Με αναδρομικές κλήσεις, ταξινομώ τα δύο μέρη ανεξάρτητα Συγχωνεύω τα δύο ταξινομημένα μέρη Στη χειρότερη περίπτωση απαιτούνται O(n log n) συγκρίσεις 20 222

(viii) Ταξινόμηση με συγχώνευση PROC mergesort (int a[], int first, int last) { int mid; if (first >= last) return; mid = (first + last) / 2; mergesort(a, first, mid); mergesort(a, mid+1, last); merge(a, first, mid, last); 21 223

(ix) Συγχώνευση PROC merge (int a[], int first, int mid, int last) { int b[last-first+1]; int i = first, j = mid+1, k = 0; while (i <= mid AND j <= last) if (a[i] < a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; while (i <= mid) b[k++] = a[i++]; while (j <= last) b[k++] = a[j++]; FOR (i, 0 TO k-1) a[first+i] = b[i]; 22 224

(x) Ταξινόμηση με συγχώνευση (διαφορετικά) PROC mergesort (int n, int *a) { int mid; if (n <= 1) return; mid = n/2; mergesort(mid, a); mergesort(n-mid, a+mid); merge(a, a+mid, a+n); 23 225

(xi) Συγχώνευση (διαφορετικά) PROC merge (int *first, int *mid, int *last) { int b[last-first]; int *i = first, *j = mid, *k = b; while (i < mid AND j < last) if (*i < *j) *k++ = *i++; else *k++ = *j++; while (i < mid) *k++ = *i++; while (j < last) *k++ = *j++; i = first; j = b; while (j < k) *i++ = *j++; 24 226

(xii) Οποιοσδήποτε αλγόριθμος ταξινόμησης n αριθμών χρειάζεται τουλάχιστον O(n log n) συγκρίσεις 25 227

(xiii) Ταξινόμηση με διαμέριση (quick sort) PROC quicksort (int a[], int first, int last) { int i; if (first >= last) return; i = partition(a, first, last); quicksort(a, first, i); quicksort(a, i+1, last); 26 228

(xiv) Διαμέριση (partition) FUNC int partition (int a[], int first, int last) { //επιλογή ενός στοιχείου int x = a[(first + last)/2]; int i = first, j = last; while (true) { while (a[i] < x) i++; while (x < a[j]) j--; if (i >= j) break; swap(&(a[i]), &(a[j])); i++; j--; return j; 27 229

(xv) Σε κάθε βήμα της διαμέρισης swap(&(a[i]), &(a[j])) x first x i x j x last Μετά τη διαμέριση first x x x x j i μέρος 1 μέρος 2 last 28 230

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