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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

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

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

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

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

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

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

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

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

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

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

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

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

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

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

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

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

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

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

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

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

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

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

Στοίβες Ουρές - Λίστες

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

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

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

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

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

Transcript:

Φροντιστήριο 4 Σκελετοί Λύσεων Άσκηση 1 Υποθέτουμε πως οι λίστες είναι υλοποιημένες χρησιμοποιώντας τις πιο κάτω δομές. typedef struct Node{ type data; struct node *next; node; node *top; list; Υλοποιούμε διαδικασίες οι οποίες ελέγχουν κατά πόσο μια λίστα είναι ταξινομημένη σε αύξουσα σειρά. Μη-αναδρομική εκδοχή int IsSorted(list *L){ if (p == NULL) report The list is empty ; 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 Aναδρομική εκδοχή int RecIsSorted(list *L){ return RecIsΙncreasing(L->top); int RecIsIncreasing(node *p){ if (p == NULL OR p->next == NULL) if (p->data <= (p->next)->data) return RecIsIncreasing(p->next); return 0; Προφανώς και οι δύο αλγόριθμοι είναι της τάξης Ο(n), όπου n είναι ο αριθμός κόμβων της λίστας. O αναδρομικός αλγόριθμος είναι όμως λιγότερο αποδοτικός από άποψη χώρου (και χρόνου). Αυτό οφείλεται στο ότι για κάθε αναδρομική κλήση της διαδικασίας 1

δεσμεύεται επιπλέον χώρος για τις παραμέτρους και τις τοπικές μεταβλητές των κλήσεων. Κατά συνέπεια, κατά την επεξεργασία του τελευταίου κόμβου της λίστας θα υπάρχουν σε κατάσταση αναμονής n 1 κλήσεις (όπου n είναι το μέγεθος της λίστας) που αφορούν όλους τους προηγούμενους κόμβους και για κάθε κλήση θα υπάρχει δεσμευμένη μνήμη για όλες τις παραμέτρους, τοπικές μεταβλητές, κλπ. Άσκηση 2 Υποθέτουμε ότι η στοίβα θα χρησιμοποιηθεί για την αποθήκευση ακέραιων. Σύμφωνα με την προτεινόμενη τεχνική μια στοίβα είναι υλοποιημένη ως μία συνδεδεμένη λίστα, κάθε κόμβος της οποίας έχει τρία πεδία, ένα πίνακα όπου αποθηκεύονται οι πληροφορίες, μήκους maxsize, ένα ακέραιο που αντιπροσωπεύει την θέση κορυφής στον πίνακα που βρίσκεται στον κόμβο κορυφής (δηλαδή την θέση όπου θα γίνει η επόμενη εισαγωγή στοιχείου, και ένα δείκτη ο οποίος δείχνει στον επόμενο κόμβο της λίστας. Η πιο κάτω εγγραφή ορίζει τον τύπο κάθε κόμβου: struct hnode{ int block[maxsize]; int top; *hnode next; Μία στοίβα ορίζεται ως εγγραφή με ένα πεδίο, το πεδίο start τύπου *hnode, που δείχνει στον πρώτο κόμβο της στοίβας struct hstack{ hnode *start; Ακολουθούν οι πράξεις σε ψευδοκώδικα: MakeEmpty(hstack s){ (*s).start = null; bool IsEmpty(hstack s){ return ((*s).start == null); int TopNode(hstack s){ if (!IsEmpty(s)) hnode *n = (*s).start; return ((*n).block[(*n).top 1]); report ERROR Push(hstack s,int x){ hnode *n=(*s).start; if (n == null \/ (*n).top == maxsize ) { hnode *m = *New(hnode); (*m).top = 1; (*m).next = n; (*s).start = m; 2

n=(*s).start; (*n).block[(*n).top-1] = x; (*n).top = (*n).top +1; Pop(hstack s){ n=(*s).start; x= (*n).block[(*n).top-1]; (*n).top = (*n).top -1; if ((*n).top==0) (*s).start= (*n).next; free(n); return x; ERROR; Όλες οι διαδικασίες έχουν χρόνο εκτέλεσης Ο(1). Άσκηση 3 Σε κάθε θέση της στοίβας αποθηκεύουμε ζεύγη στοιχείων όπου το πρώτο μέλος κάθε ζεύγους αντιστοιχεί στο στοιχείο που εισήχθηκε, και το δεύτερο μέλος του ζεύγους στο μέχρι στιγμής ελάχιστο στοιχείο της στοίβας. Για παράδειγμα οι διαδοχικές εισαγωγές 4,3,5,9,7,1,2 έχουν ως αποτέλεσμα τις πιο κάτω καταστάσεις Κατά συνέπεια, ανά πάσα στιγμή μπορούμε να βρούμε και να επιστρέψουμε το ελάχιστο στοιχείο της στοίβας σε χρόνο σταθερό (επιστρέφοντας το δεύτερο μέλος του ζεύγους που βρίσκεται στον κόμβο κορυφής της στοίβας). Άσκηση 4 Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως εξής: (i) Διαδοχική χορήγηση μνήμης Υποθέτουμε ότι οι λίστες μας έχουν μέγιστο μέγεθος max και χρησιμοποιούμε τη δομή type elements[max]; list; 3

Οι διαδικασίες υλοποιούνται ως εξής: 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 είναι το μέγεθος της λίστας. (ii) Συνδετική χορήγηση μνήμης Χρησιμοποιούμε τις πιο κάτω δομές typedef struct Node{ type data; struct node *next; node; node *top; list; Οι διαδικασίες υλοποιούνται ως εξής: type Access node *p; (list *L, int i){ if i> L->size return; 4

return p->data; Χρόνος Εκτέλεσης: i, O(n), όπου n είναι το μέγεθος της λίστας. InsertAfter(list *L, int i, type x){ node *p; if (i > L->size) return; q = (node *) malloc (sizeof(node)); q->data = x; q->next = p->next; p->next = q; Χρόνος Εκτέλεσης: i O(n), όπου n είναι το μέγεθος της λίστας. Delete(list *L, int i){ node * ptr, *p; if (i > L->size) return; ptr = p->next; p->next = p->next->next; free(ptr); Χρόνος Εκτέλεσης: i O(n), όπου n είναι το μέγεθος της λίστας. Η υλοποίηση του ΑΤΔ με διαδοχική χορήγηση μνήμης αποτελείται από απλούστερες προγραμματιστικά διαδικασίες και από αυτές η Access είναι αποδοτικότερη από την αντίστοιχη διαδικασία της υλοποίησης με δυναμική δέσμευση μνήμης. Το βασικό πλεονέκτημα της υλοποίησης με δυναμική δέσμευση μνήμης είναι ότι δεν επιβάλλει περιορισμούς σχετικά με το πλήθος των στοιχείων της λίστας, και ανά πάσα στιγμή χρησιμοποιεί μνήμη ανάλογη με το πλήθος των στοιχείων της λίστας. Αντίθετα η υλοποίηση με πίνακα δεσμεύει μνήμη για τις max θέσεις του πίνακα καθ όλη τη διάρκεια της εκτέλεσης του προγράμματος, άσχετα με το πλήθος των στοιχείων της λίστας. Παρατηρούμε όμως, πως στην υλοποίηση με δυναμική δέσμευση μνήμης χρειάζεται να αποθηκεύουμε και μνήμη για του δείκτες next κάθε κόμβου της λίστας. 5