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

Σχετικά έγγραφα
Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

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

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

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

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

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

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

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

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

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

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

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

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

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

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

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

Βασικές Δομές Δεδομένων

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

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

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

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Σημειώσεις έκτης και έβδομης εβδομάδας

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Ιδιοκτησία Αντικειµένου

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

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

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

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

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

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

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

Εργαστήριο 5. Εαρινό Εξάμηνο

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

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

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

4. Συνδεδεμένες Λίστες

Φροντιςτήριο. Linked-List

Γραμμικές λίστες. Γκόγκος Χρήστος ΤΕΙ Ηπείρου

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

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

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

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

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Transcript:

Φροντιστήριο 4 Σκελετοί Λύσεων 1. Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως εξής: (i) Διαδοχική χορήγηση μνήμης Υποθέτουμε ότι οι λίστες μας έχουν μέγιστο μέγεθος max και χρησιμοποιούμε τη δομή type elements[max]; int size; list; Οι διαδικασίες υλοποιούνται ως εξής: type Access (list *L, int i){ if (i< L->size) return L[i-1]; Χρόνος Εκτέλεσης: O(1) InsertAfter(list *L, int i, type x){ int k; if ( L->size < max AND i < L->size ){ for ( k = L->size; k > i; k--) L->elements[k] = L->elements[k-1]; L->elements[i] = x; L->size++; Χρόνος Εκτέλεσης: n i O(n), όπου n είναι το μέγεθος της λίστας. Delete(list *L, int i){ int k; if (i < L->size ){ for ( k = i-1; k < L->size; k++) L->elements[k] = L->elements[k+1]; L->size--; Χρόνος Εκτέλεσης: n i O(n), όπου n είναι το μέγεθος της λίστας. 1

(ii) Συνδετική χορήγηση μνήμης Χρησιμοποιούμε τις πιο κάτω δομές typedef struct Node{ type data; struct node *next; node; node *top; int size; list; Οι διαδικασίες υλοποιούνται ως εξής: type Access (list *L, int i){ node *p; int j; if i> L->size return; for (j=0; j < i; j++) p= p->next; return p->data; Χρόνος Εκτέλεσης: i, O(n), όπου n είναι το μέγεθος της λίστας. InsertAfter(list *L, int i, type x){ node *p; int j; if (i > L->size) return; for (j=0; j < i; j++) p= p->next; q = (node *) malloc (sizeof(node)); q->data = x; q->next = p->next; p->next = q; Χρόνος Εκτέλεσης: i O(n), όπου n είναι το μέγεθος της λίστας. 2

Delete(list *L, int i){ node * ptr, *p; int j; if (i > L->size) return; for (j=0; j < i; j++) p= p->next; ptr = p->next; p->next = p->next->next; free(ptr); Χρόνος Εκτέλεσης: i O(n), όπου n είναι το μέγεθος της λίστας. Η υλοποίηση του ΑΤΔ με διαδοχική χορήγηση μνήμης αποτελείται από απλούστερες προγραμματιστικά διαδικασίες και από αυτές η Access είναι αποδοτικότερη από την αντίστοιχη διαδικασία της υλοποίησης με δυναμική δέσμευση μνήμης. Το βασικό πλεονέκτημα της υλοποίησης με δυναμική δέσμευση μνήμης είναι ότι δεν επιβάλλει περιορισμούς σχετικά με το πλήθος των στοιχείων της λίστας, και ανά πάσα στιγμή χρησιμοποιεί μνήμη ανάλογη με το πλήθος των στοιχείων της λίστας. Αντίθετα η υλοποίηση με πίνακα δεσμεύει μνήμη για τις max θέσεις του πίνακα καθ όλη τη διάρκεια της εκτέλεσης του προγράμματος, άσχετα με το πλήθος των στοιχείων της λίστας. Παρατηρούμε όμως, πως στην υλοποίηση με δυναμική δέσμευση μνήμης χρειάζεται να αποθηκεύουμε και μνήμη για του δείκτες next κάθε κόμβου της λίστας. 2. Υποθέτουμε πως οι λίστες είναι υλοποιημένες χρησιμοποιώντας τις πιο κάτω δομές. typedef struct Node{ type data; struct node *next; node; node *top; int size; list; Υλοποιούμε διαδικασίες οι οποίες ελέγχουν κατά πόσο μια λίστα είναι ταξινομημένη σε αύξουσα σειρά. 3

Μη-αναδρομική εκδοχή int IsSorted(list *L){ if (p == NULL) report The list is empty ; return 1; q = p-> next; while (q!= NULL) if (p->data <= q-> data) p = q; q = q-> next; report List not sorted return 0; report List is sorted return 1; Aναδρομική εκδοχή int RecIsSorted(list *L){ return RecIsΙncreasing(L->top); int RecIsIncreasing(node *p){ if (p == NULL OR p->next == NULL) return 1; if (p->data <= (p->next)->data) return RecIsIncreasing(p->next); return 0; Προφανώς και οι δύο αλγόριθμοι είναι της τάξης Ο(n), όπου n είναι ο αριθμός κόμβων της λίστας. O αναδρομικός αλγόριθμος είναι όμως λιγότερο αποδοτικός από άποψη χώρου (και χρόνου). Αυτό οφείλεται στο ότι για κάθε αναδρομική κλήση της διαδικασίας δεσμεύεται επιπλέον χώρος για τις παραμέτρους και τις τοπικές μεταβλητές των κλήσεων. Κατά συνέπεια, κατά την επεξεργασία του τελευταίου κόμβου της λίστας θα υπάρχουν σε κατάσταση αναμονής n 1 κλήσεις (όπου n είναι το μέγεθος της λίστας) που αφορούν όλους τους προηγούμενους κόμβους και για κάθε κλήση θα υπάρχει δεσμευμένη μνήμη για όλες τις παραμέτρους, τοπικές μεταβλητές, κλπ. 4

3. Υποθέτουμε πως οι λίστες είναι υλοποιημένες χρησιμοποιώντας τις πιο κάτω δομές. typedef struct Node{ type data; struct node *next; struct node *prev; node; node *head; list; Υποθέτουμε ότι το πεδίο top της λίστας δείχνει το πρώτο στοιχείο της λίστας. Επίσης υποθέτουμε ότι αν το i είναι μεγαλύτερο από το μέγεθος της λίστας, τότε το στοιχείο προς εισαγωγή εισάγεται στην τελευταία θέση της λίστας. Μη-αναδρομική εκδοχή InsertAfter(list *L, type x, int i){ p = (node *) malloc (sizeof(node)); p->data = x; q = L->top; if (q == NULL) p->next = p; p->prev = p; L->top = p; return; j = 1; while (j<=i AND q->next!= L->top) q = q->next; j++; p->next = q->next; (p->next)->prev = p; q->next = p; p->prev = q; if (i == 0) L->top = p; 5

Aναδρομική εκδοχή RecInsertAfter (list *L, type x, int i){ if (L->top == NULL) p = (node *) malloc (sizeof(node)); p->data = x; p->next = p; p->prev = p; L->top = p; RecInsAfter(L, L->top, x, i); RecInsAfter(list *L, node *q, type x, int i){ if (i == 0 OR q->next == L->top) p = (node *) malloc (sizeof(node)); p->data = x; p->next = q->next; (p->next)->prev = p; q->next = p; p->prev = q; if (i == 0 AND q == L->top) L->top = q; RecInsAfter(L, q->next, i-1); Προφανώς και οι δύο αλγόριθμοι είναι της τάξης Ο(n), όπου n είναι ο αριθμός κόμβων της λίστας. O αναδρομικός αλγόριθμος είναι όμως λιγότερο αποδοτικός από άποψη χώρου (και χρόνου). Αυτό οφείλεται στο ότι για κάθε αναδρομική κλήση της διαδικασίας δεσμεύεται επιπλέον χώρος για τις παραμέτρους και τις τοπικές μεταβλητές των κλήσεων. Κατά συνέπεια, κατά την επεξεργασία του τελευταίου κόμβου της λίστας θα υπάρχουν σε κατάσταση αναμονής n 1 κλήσεις (όπου n είναι το μέγεθος της λίστας) που αφορούν όλους τους προηγούμενους κόμβους και για κάθε κλήση θα υπάρχει δεσμευμένη μνήμη για όλες τις παραμέτρους, τοπικές μεταβλητές, κλπ. 6