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

Σχετικά έγγραφα
Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ενότητα 2 Στοίβες Ουρές - Λίστες

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

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

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

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

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

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

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

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

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

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

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

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

Δομές Δεδομένων (Data Structures)

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

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

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

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

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα

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

Ενότητα 2 Στοίβες Ουρές - Λίστες

Θεωρητικό Μέρος. 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); } }

Αναδρομικοί Αλγόριθμοι

Δρ. Πέτρος Παναγή B123

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

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

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

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

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

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

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

Transcript:

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων Άσκηση 1 Υπάρχουν διάφοροι τρόποι για να υλοποιήσουμε πράξεις ουράς για την προτεινόμενη εγγραφή. To πρόβλημα που δημιουργείται με οποιαδήποτε από αυτές είναι ότι είναι αδύνατο να ξεχωρίσουμε την άδεια ουρά από αυτήν που έχει n στοιχεία: Για παράδειγμα αν θέσουμε αρχικές τιμές των πεδίων (*q).front, και (*q).back το 0, τότε και οι δύο τύποι ουρών (η άδεια και η γεμάτη) ικανοποιούν την συνθήκη (*q).front = (*q).back, και καμιά άλλη συνθήκη με βάση την προτεινόμενη υλοποίηση δεν μας επιτρέπει να διακρίνουμε την άδεια ή τη γεμάτη ουρά. Εντούτοις με βάση αυτή την πρόταση μπορούμε να υλοποιήσουμε ουρές που περιέχουν το πολύ n-1 στοιχεία. Με αυτό το τρόπο η άδεια ουρά διακρίνεται από τη συνθήκη (*q).front == (*q).back ενώ η γεμάτη ουρά από τη συνθήκη (*q).βack 1 = (*q).front Οι διαδικασίες ουράς μπορούν να οριστούν εύκολα. Μειονέκτημα της πρόταση είναι ότι αποθηκεύονται το πολύ n-1 στοιχεία, δηλαδή, ένα λιγότερο από τη χωρητικότητα της λίστας. Άσκηση 2 Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως μια ακολουθία από στοιχεία τύπου job, συνοδευόμενη από τις πράξεις: NewJob (L, j) η οποία τοποθετεί την εργασία j στο τέλος της Process(L) Kill(L, j) MakeUrgent(L, j) ακολουθίας L η οποία επεξεργάζεται την εργασία που βρίσκεται στην κορυφή της L η οποία διαγράφει την εργασία j από τη λίστα L η οποία τοποθετεί την εργασία j στην κορυφή της λίστας L Παραθέτουμε την υλοποίηση του ΑΤΔ με δυναμική χορήγηση μνήμης. Αρχικά παρατηρούμε ότι για επεξεργασία των εργασιών είναι απαραίτητο να γνωρίζουμε για κάθε εργασία πόσος χρόνος εκτέλεσης απομένει μέχρι τη συμπλήρωσή της. Επομένως, υποθέτουμε ότι ο τύπος job περιέχει πεδίο time στο οποίο φυλάγεται αυτός ο χρόνος ως εξής: typedef struct Job{ int time; job; 1

Παρατηρούμε ότι για υλοποίηση της λίστας εργασιών χρειαζόμαστε ΑΤΔ όμοιο με τον ΑΤΔ ουρά: η διαδικασία NewJob ουσιαστικά υλοποιεί εισαγωγή στο τέλος της ακολουθίας ενώ η διαδικασία Process, υλοποιεί εξαγωγή από την αρχή και εισαγωγή στο τέλος. Για υλοποίηση ουρά χρησιμοποιούμε τις πιο κάτω δομές typedef struct Node{ typedef struct List{ job *data; node *front; struct node *next; node *back; node; int size; list; size front back Οι ζητούμενες διαδικασίες υλοποιούνται ως εξής: NewJob (list *L, job x){ r = (node *) malloc (sizeof(node)); r->data = x; if (L->size == 0) L->top = L->back = r; (L->back)->next = r L->back = r; L->size++; Χρόνος Εκτέλεσης: Θ(1) /*όπου οι διαδικασίες =, == και!= σε στοιχεία τύπου job είναι κατάλληλα γραμμένες ώστε να συγκρίνουν τα πεδία των στοιχείων */ Process (list *L){ p = L->front; if (p!= NULL) (p->data)->time = (p->data)->time 2; L->front = p->next; if ((p->data)->time == 0 ) if (p == L->back) L->back = NULL; L->size--; free(p); if ((p->data)->time > 0 AND p!= L->back) (L->back)->next = p; L->back = p; Χρόνος Εκτέλεσης: Θ(1) 2

Kill (list *L, job x){ if (L->size == 0) return; % η λίστα είναι κενή if (L->front)->data == x p = L->front; L->front = p->next; free(p); L->size--; p = FindPrev(L, x); if ( p!= NULL) q = p->next; p->next = q->next; if (L->back == q) L->back = p; free(q); L->size--; Η βοηθητική διαδικασίας FindPrev ορίζεται ως εξής: node *FindPrev (list *L, job x){ if (L->size == 0 OR (L->front)->data == x ) return NULL; p = L->front; while((p->next)->data!= x AND p->next!= NULL) p = p->next; if ((p->next)!= NULL) return p; return NULL; Χρόνος Εκτέλεσης: O(n), όπου n είναι το μήκος της λίστας L. (Πρέπει να εντοπίσουμε το στοιχείο x). MakeUrgent (list *L, job x){ p = FindPrev(L, x); if p == NULL return q = p->next; p->next = q->next; q->next = L->front; L->front = q; if (L->back == q) L->back = p; Χρόνος Εκτέλεσης: O(n), όπου n είναι το μήκος της λίστας L. (Πρέπει να εντοπίσουμε το στοιχείο x). 3

Άσκηση 3 (α) Για την υλοποίηση της διπλά συνδεδεμένης λίστας θα χρησιμοποιήσουμε τις πιο κάτω δομές: Ένας κόμβος ορίζεται από το πιο κάτω structure: typedef struct dlnode { int data; struct dlnode *prev; struct dlnode *next; DLNODE; O κόμβος που ορίζει τη διπλά συνδεδεμένη λίστα είναι: typedef struct dllist { DLNODE *top; DLLIST; Η συνάρτηση merge παίρνει ως παραμέτρους δύο διπλά συνδεδεμένες λίστες και καλεί την αναδρομική συνάρτηση rmerge για να ενωθούν οι δύο λίστες και να δημιουργηθεί μια τρίτη λίστα, σύμφωνα με την εκφώνηση της άσκησης Ακολουθεί η ζητούμενη υλοποίηση. DLLIST *merge(dllist * list1, DLLIST * list1){ DLNODE *new_list; new_list = (DLLIST *) malloc (sizeof(dllist)); if ((list1->top == NULL) && (list2->top == NULL)) new_list->top = NULL; new_list->top = rmerge(list1->top, list2->top, list1->top, list2->top); return new_list; Η αναδρομική συνάρτηση rmerge εκτελείται μέχρι να φτάσουμε στο τέλος των δύο λιστών. Όταν μια από τις δύο λίστες φτάσει στο τέλος της προσθέτονται τα στοιχεία της άλλης μέχρι να φτάσει και αυτή στο τέλος της, διαφορετικά σε κάθε κλήση προσθέτονται δύο νέοι κόμβοι, ένας από κάθε αρχική λίστα. Οι δύο τελευταίες παράμετροι χρησιμοποιούνται για να ξέρουμε ότι φτάσαμε στην αρχή της κάθε λίστας. DLNODE *rmerge(dlnode *list1, DLNODE *list2, DLNODE *clist1, DLNODE *clist2){ // Ο κόμβος που θα δημιουργήσουμε DLNODE *new_node; // Αν έχουμε φτάσει στο τέλος των δύο λιστών τότε τερματίζουμε if ((list1 == clist1) && (list2 == clist2)) return NULL; // Αν δεν έχουμε φτάσει στο τέλος της πρώτης λίστας προσθέτουμε 4

// τον επόμενο κόμβο της στη νέα λίστα και καλούμε αναδρομικά τη // διαδικασία αντιστρέφοντας τους ρόλους των δύο λιστών εφόσον η // δεύτερη λίστα έχει ακόμη στοιχεία if(list1!= clist1) new_node = (DLNODE *) malloc (sizeof(dlnode)); new_node->data = list1->data; if (list2!= clist2) new_node->next = rmerge(list2, list1->next, clist2,clist1); new_node->next = rmerge(list1->next, list2, clist1,clist2); return newnode; // Διαφορετικά, αν έχουμε εξαντλήσει τα στοιχεία της πρώτης λίστας // προσθέτουμε τον επόμενο κόμβο της δεύτερης λίστας στη νέα λίστα // και καλούμε αναδρομικά τη διαδικασία αντιστρέφοντας τους ρόλους // των δύο λιστών new_node = (DLNODE *) malloc (sizeof(dlnode)); new_node->data = list2->data; new_node->next = rmerge(list2->next, list1,clist2,clist1) return newnode; Χρονική πολυπλοκότητα: Ο(n+m) όπου n και m τα μήκη των δύο λίστών. (β) Για την υλοποίηση της διπλά συνδεδεμένης λίστας με κεφαλή θα χρησιμοποιήσουμε τις πιο κάτω δομές: Ένας κόμβος ορίζεται από το πιο κάτω structure: typedef struct dlnode { int data; struct dlnode *prev; struct dlnode *next; DLNODE; O κόμβος που ορίζει τη διπλά συνδεδεμένη λίστα είναι: typedef struct dllist { DLNODE *head; DLLIST; Κατ αρχή, η διαδικασία μας εντοπίζει τα δύο άκρα της λίστας και στη συνέχεια καλεί μια δεύτερη, αναδρομική συνάρτηση η οποία αναλαμβάνει να αποφασίσει κατά πόσο η λέξη που σχηματίζεται στη λίστα είναι παλίνδρομο. int *palindrome(list *list) { start = (list->head)->next if (start == NULL) return 1; end == start; 5

while (end->next!= NULL) end = end->next; return rpalindrome(start, end); Σε κάθε αναδρομική κλήση της συνάρτησης rpalindrome τα στοιχεία των δύο θέσεων της λίστας. Η συνάρτηση εκτελείται μέχρι τα στοιχεία αυτά να μην είναι τα ίδια, όπου επιστρέφει 0 (η λέξη δεν είναι παλίνδρομο) ή μέχρι οι δύο θέσεις που κοιτάζουμε να συμπίπτουν, ή τα στοιχεία της λίστας μας να έχουν εξαντληθεί. Στις δύο τελευταίες περιπτώσεις η λέξη είναι παλίνδρομο και επιστρέφουμε την τιμή 1. int rpalindrome(node *start, NODE *end); { // Aν τα στοιχεία των δύο θέσεων διαφέρουν επιστρέφουμε ότι η // λέξη δεν είναι παλίνδρομο if (start->data!= end->data) return 0; // Διαφορετικά, αν οι κόμβοι της λίστας έχουν εξαντληθεί // επιστρέφουμε ότι η λέξη είναι παλίνδρομο elsif (start == end OR start->next == end) return 1 // Διαφορετικά, προχωρούμε στους επόμενους κόμβους της λίστας rpalindrome(start->next, end->prev) Χρονική πολυπλοκότητα: Ο(n) όπου n το μήκος της λίστας. 6