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

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

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Ανάπτυξη και Σχεδίαση Λογισμικού

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ιαφάνειες παρουσίασης #5 (β)

Διάλεξη 17η: Ταξινόμηση και Αναζήτηση

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Δομές Δεδομένων

Διαδικασιακός Προγραμματισμός

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

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

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

Περιεχόμενα. Πρόλογος... 21

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

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Στοίβες με Δυναμική Δέσμευση Μνήμης

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

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

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

Περιεχόμενα. Πρόλογος... 17

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

Φροντιστήριο 4 Σκελετοί Λύσεων

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Διαδικασιακός Προγραμματισμός

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

ΗΥ-150. Ταξινόµηση και Αναζήτηση

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματιστικές Τεχνικές

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

Ουρά Προτεραιότητας (priority queue)

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

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

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Προγραµµατιστικές Τεχνικές

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Ενότητα 3: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

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

3 ΑΝΑ ΡΟΜΗ ΑΝΑΖΗΤΗΣΗ - ΤΑΞΙΝΟΜΗΣΗ. n! = 1*2*3*..(n-1)*n. n! = 1 αν n = 0, = n*(n-1)! αν n > ΑΝΑ ΡΟΜΗ Εισαγωγή

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

Προγραμματισμός Ι (ΗΥ120)

υναµικές οµές εδοµένων

Δομές Δεδομένων Εισαγωγή παράγωγους τύπους δομών δεδομένων Ορισμός και συζήτηση της έννοιας μέλη ετικέτα Τρόπος δήλωσης και ορισμού

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

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

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

Ταχεία Ταξινόμηση Quick-Sort

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

Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

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

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

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

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

C: Από τη Θεωρία στην Εφαρμογή

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

Αναζήτηση και ταξινόμηση

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

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

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

Transcript:

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

Παράγωγοι τύποι (struct) σύνοψη προηγουμένων Πίνακες: πολλές μεταβλητές ίδιου τύπου Παράγωγοι τύποι ή Δομές (struct): ομαδοποίηση μεταβλητών διαφορετικού τύπου struct Student { int AM; char *name; char *fname; int semester; float grade; }; typedef struct Student STUDENT; STUDENT someone; someone.am = 25; τελεστής μέλους τελεία someone.name = "Tade"; κλπ... STUDENT *sptr; μπορώ να ορίσω δείκτες σε δομές sptr = &someone; sptr->αμ = 3; τότε: τελεστής μέλους βέλος. STUDENT pliroforiki[8]; Pliroforiki[] = someone Ως ορίσματα σε συναρτήσεις:, π.χ.: void func(struct Student *pliroforiki, int num); Τύποι με μέλη άλλους παράγωγους τύπους: struct new_type { int age; x.stdnt.am = 14; STUDENT stdnt; } x; πίνακες παραγώγων τύπων με απλή ανάθεση εξισώνω τα μέλη

Παράγωγοι τύποι (struct) αυτοαναφορικοί τύποι Πιο σημαντική ιδιότητα: αυτοαναφορά = μέλος δείκτης στον τύπο όπου περιέχεται Επιτρέπει δημιουργία πολύπλοκων δομών δεδομένων struct Student { int AM; char *name; char *fname; int semester; float grade; struct Student *next; }; typedef struct Student STUDENT; STUDENT *someone; someone = (STUDENT *) malloc (sizeof( STUDENT ) ); someone->next = (STUDENT *) malloc (sizeof( STUDENT ) ); someone->next->next = NULL; Τώρα, *(someone.next) είναι μεταβλητή τύπου STUDENT * someone *(someone->next) someone->next someone->next->next

Δομές δεδομένων Γραμμική Λίστα Στοίβα = γραμμική λίστα όπου προσθαφαιρούνται στοιχεία μόνο στην αρχή: LIFO Ουρά = γραμμική λίστα όπου: εισάγονται στοιχεία μόνο στην αρχή, εξάγονται στοιχεία μόνο από το τέλος: FIFO Δέντρο Διπλά συνδεδεμένη λίστα struct tree {... struct tree *left, right; }

Υλοποίηση στοίβας Προσθήκη στοιχείου (push) HEAD... new new =(...) malloc(...); HEAD... new new->next=head->next; HEAD... head->next = new; new

Υλοποίηση στοίβας Αφαίρεση στοιχείου (pop) HEAD old... HEAD old... head->next=old->next; HEAD oldx... free ( old ); HEAD...

Υλοποίηση ουράς Εισαγωγή στοιχείου: όπως και στη στοίβα Εξαγωγή στοιχείου: prev last prev last prev->next=null; X prev last free(last); last Πρέπει να διατρέξω τη λίστα για να βρω το prev πιο εύκολα γίνεται με διπλά συνδεδεμένη λίστα last = prev;

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

Αλγόριθμοι: ταξινόμηση και αναζήτηση Αναζήτηση στοιχείων: βασική και συχνά χρησιμοποιούμενη (π.χ. βάσεις δεδομένων) Ορισμός: εύρεση συγκεκριμένου στοιχείου από μεγάλο σύνολο δεδομένων Ταξινόμηση: διευκολύνει σημαντικά την αναζήτηση Ορισμός: τοποθέτηση δεδομένων σε σειρά (π.χ. αύξουσα, φθίνουσα) σύμφωνα με ένα χαρακτηριστικό (κλειδί) Δυσκολία αυξάνει με μέγεθος του συνόλου δεδομένων και πολυπλοκότητά τους. Δεν υπάρχει γενική μέθοδος (δλδ αποδοτική για κάθε μέγεθος προβλήματος) Ποικιλία τεχνικών αναζήτησης και ταξινόμησης για δεδομένα τόσο σε πίνακες όσο και σε λίστες ή άλλες δομές δεδομένων. Ταξινόμηση, αναζήτηση: συνήθεις ενέργειες => σχετικές πρότυπες συναρτήσεις

Τεχνικές ταξινόμησης Ονομασία Τεχνική Απόδοση Μέθοδος φυσαλλίδας αντιμετάθεση γειτονικών στοιχείων Ο(Ν 2 ) (bubble sort) Ταξινόμηση παρεμβολής Τοποθέτηση στοιχείου σε σχέση Ο(Ν 2 ) (straight insertion sort) με τα ήδη ταξινομημένα Μέθοδος του Shell Εφαρμόζει τη μέθοδο παρεμβολής Ο(Ν 3/2 ) (Shell sort) σε ένα υποσύνολο των δεδομένων που μεγαλώνει βαθμιαία μέχρι να τα περιλάβει όλα Μέθοδος σωρού Τακτοποίηση σε δέντρο όπου κάθε Ο(Ν log 2 N) (heap sort) στοιχείο είναι > από τους 2 κλάδους του. Επαναληπτική τακτοποίηση θέτοντας κάθε φορά άλλο στοιχείο στη ρίζα του δέντρου Ταχεία ταξινόμηση Αναδρομική ή επαναληπτική κλήση εξαρτάται` (quick sort) συνάρτησης που χωρίζει τον πίνακα συχνά, η ταχύτερη σε δύο μέρη και αντιμεταθέτει το min

#include <stdlib.h> Συνάρτηση πρότυπης βιβλιοθήκης για ταχεία ταξινόμηση void qsort(const void *base, size_t count, size_t width, int (*compar) (const void *, const void * ) ); base = δείχνει στην αρχή του πίνακα προς ταξινόμηση count = πλήθος στοιχείων προς ταξινόμηση width = μέγεθος κάθε στοιχείου, σε bytes compar = δείχνει σε συνάρτηση που ορίζει ο χρήστης. Παίρνει ως ορίσματα δύο στοιχεία για σύγκριση και επιστρέφει αν είναι ίσα, > αν το πρώτο είναι μεγαλύτερο και < αν είναι μικρότερο. Παράδειγμα: int cmp_double(const void *x, const void *y) { /* συνάρτηση που όρισε ο χρήστης */ return ( (*x == *y)? : ( (*x > *y)? 1 : -1 ) ); }... double array[1];... qsort(array, 1, sizeof(double), cmp_double);

Τεχνικές αναζήτησης Σειριακή αναζήτηση: Παίρνουμε τα στοιχεία με τη σειρά μέχρι να βρούμε το ζητούμενο. Η απλούστερη ως προς την υλοποίηση Απολύτως γενική (δεν απαιτεί ταξινόμηση) Μπορεί να γίνει πολύ αργή Αλλά μερικές φορές χρησιμοποιείται αναγκαστικά (π.χ. σειριακά αρχεία) Δυαδική αναζήτηση: Απαιτεί ταξινόμηση Χωρίζει το σύνολο στη μέση Αν μεσαίο στοιχείο δεν είναι το ζητούμενο, περιορίζεται στο ένα ήμισυ του συνόλου Γενικά, πιο γρήγορη από τη σειριακή Υπάρχει σε παραλλαγές που μπορεί να είνια ταχύτερες, ανάλογα με τη φύση των δεδομένων

#include <stdlib.h> Συνάρητηση πρότυπη βιβλιοθήκης για δυαδική αναζήτηση void *bsearch(const void *key, const void *base, size_t count, size_t width, int (*compar) (const void *, const void * ) ); key = διεύθυνση του δεδομένου προς εντοπισμό μέσα στον πίνακα base = δείχνει στην αρχή του πίνακα προς διερεύνηση count = πλήθος στοιχείων προς ταξινόμηση width = μέγεθος κάθε στοιχείου, σε bytes compar = δείχνει σε συνάρτηση που ορίζει ο χρήστης. Παίρνει ως ορίσματα δύο στοιχεία για σύγκριση και επιστρέφει αν είναι ίσα, > αν το πρώτο είναι μεγαλύτερο και < αν είναι μικρότερο. Παράδειγμα: int cmp_double(const void *x, const void *y) { /* συνάρτηση που όρισε ο χρήστης */ return ( (*x == *y)? : ( (*x > *y)? 1 : -1 ) ); }... double number, array[1];... bsearch(&number, array, 1, sizeof(double), cmp_double);