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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

IsEmptyList(L): επιστρέφει true αν L = < >, false

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

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

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

Σημειώσεις όγδοης εβδομάδας

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

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

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

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

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

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

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

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

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

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

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

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Transcript:

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων Άσκηση 1 Ξεκινούμε με τον αριθμό μας, n, και αρχίζουμε να τον διαιρούμε με ακέραιους ξεκινώντας με το 2 και προχωρώντας στο 3, 4, 5,. Όταν εντοπίσουμε πως ένας αριθμός i είναι παράγοντας του n (δηλαδή n mod i == 0) τον τοποθετούμε σε μία στοίβα και θέτουμε n = n/i. Όταν ο n γίνει 1 τότε σταματούμε και τυπώνουμε τα στοιχεία της στοίβας. Υποθέτουμε την ύπαρξη υλοποίησης στοίβας με πράξεις MakeEmpty, IsEmpty, Push, Pop και Top. Paragontopoihsh(int n) { i=2; MakeEmpty(S); while (n!= 1){ if (n mod i == 0) { Push (i, S); n = n div i i++; while (!IsEmpty(S)) { print Top(S) ; Pop(S); Ο χρόνος εκτέλεσης του αλγορίθμου είναι της τάξης Ο(n), αφού στη χείριστη περίπτωση που το n είναι πρώτος αριθμός, θα χρειαστεί να κοιτάξουμε όλους τους υποψήφιους παράγοντες 2..n. Άσκηση 2 Για την επίλυση της άσκησης αυτής θα χρησιμοποιήσουμε διπλά συνδεδεμένες λίστες υλοποιημένες με δυναμική χορήγηση μνήμης. Χρησιμοποιούμε τις πιο κάτω δομές: typedef struct Node{ type data; typedef struct DLlist { int popularity; node *head; struct Node *next; dllist; struct Node *prev; node; Οι ζητούμενες διαδικασίες υλοποιούνται ως εξής: (1) H διαδικασία που ακολουθείται για την εισαγωγή είναι η εξής: Ξεκινούμε μία διάσχιση της λίστας μέχρι να φτάσουμε στο τέλος της. Εκεί δημιουργούμε ένα καινούριο κόμβο τον οποίο συνδέουμε με τον προηγούμενο κόμβο της λίστας, αν υπάρχει, ενώ, αν δεν υπάρχει τότε ενημερώνουμε τον κόμβο κορυφής της λίστας ως τον νεοδημιούργητο κόμβο. 1

void Insert(dllist *X, type e){ node *previous = NULL; for (p = X->head ; p!= NULL && p->data!= e; p=p->next) previous = p; if (p->data == e) report Element is already in list ; { node *r = (node *) malloc (sizeof(node)); r->next = NULL; r->prev = previous; r->data = e; r->popularity = 0; if previous == NULL X->head = r; previous->next = p; Χρόνος Εκτέλεσης: O(n), όπου n το μέγεθος της λίστας Χ. (2) Η διαδικασία πρόσβασης στοιχείου εντοπίζει το στοιχείο, αν υπάρχει, αυξάνει τη δημοτικότητά του κατά 1 και στη συνέχεια αναπροσαρμόζει τη λίστα μέσω της βοηθητικής συνάρτησης Balance(dllist *X, node *p) η οποία μεταφέρει το στοιχείο του κόμβου p μέσα στη λίστα έτσι ώστε να βρεθεί στην κατάλληλη θέση σε σχέση με την αυξημένη του δημοτικότητα. node *Access(dllist *X, type e){ node *p; if (X->head == NULL) return NULL; { for(p = X->head; p->data!=e && p->next!=null; p=p->next) ; if (p->data == e) p->next->popularity++; Balance (&X, &p); return p; return NULL: Balance(dllist *X, node *p){ while(p->prev!= NULL && p->popularity>p->prev->popularity) { //Ανταλλάσσουμε τα στοιχεία data και popularity // των δύο κόμβων και το προωθούμε πιο μπροστά SwapElements(p,p->prev); 2

p = p->prev; if p->prev = NULL X->head = p; Χρόνος Εκτέλεσης: Στην περίπτωση που το e ανήκει στην Χ: O(i), όπου i είναι η θέση του στοιχείου e στην ουρά, και Ο(n), όπου n είναι το μέγεθος της ουράς Χ, αν το στοιχείο e δεν ανήκει στην Χ. (3) Η διαδικασία εξαγωγής εντοπίζει τον ζητούμενο κόμβο και τον διαγράφει από τη λίστα. void Delete(dllist *X, type e){ node *p; if (X->head == NULL) { printf( The list is empty ); { for (p = X->head; p->data!= e && p->next!=null; p=p->next) ; if (p->data == e) { if (p->next!= NULL) p->next->prev = p->prev; if (p->prev!= NULL) p->prev->next = p->next; X->head = p->next; free(p); Χρόνος Εκτέλεσης: Στην περίπτωση που το e ανήκει στην Χ: O(i), όπου i είναι η θέση του στοιχείου e στην ουρά, και Ο(n), όπου n είναι το μέγεθος της ουράς Χ, αν το στοιχείο e δεν ανήκει στην Χ. (4) Η διαδικασία Union ξεκινά αντιγράφοντας τα στοιχεία τη πρώτης λίστας Χ στην καινούρια λίστα Ζ και στη συνέχεια παίρνει ένα-ένα τα στοιχεία της λίστας Υ και τα εισάγει στη λίστα μέσω της βοηθητικής διαδικασίας Insert2. Η διαδικασία Insert2 λειτουργεί παρόμοια με την διαδικασία Insert με τη διαφορά ότι αν το στοιχείο προς εισαγωγή υπάρχει ήδη στη λίστα τότε αυξάνει τη δημοτικότητά του προσθέτοντας σε αυτή τη δημοτικότητα του καινούριου στοιχείου. void Union(dllist *X, dllist *Y, dllist *Z){ node *p=x->head, *q=null, *r; Z->head = NULL; while(p!= NULL) { r =(node *) malloc (sizeof(node)); 3

r->data = p->data; r->popularity = p->popularity; r->prev = q; r->next = NULL; if (q == NULL) Z->head = r; q->next = r; q = r; p = Y->head; while (p!= NULL) Insert2(&Z, &p) void Insert2(dllist *Z, node *q){ node *previous = NULL; for (p = X->head ; p!= NULL && p->data!=q->data; p=p->next) previous = p; if (p->data == q->data) p->popularity = p->popularity + q->popularity; Balance(&Z, &p); { node *r = (node *) malloc (sizeof(node)); r->next = NULL; r->prev = previous; r->data = q->data; r->popularity = q->popularity; if previous == NULL X->head = r; previous->next = p; Χρόνος Εκτέλεσης: O(n m), όπου n και m είναι τα μεγέθη των λιστών Χ και Υ αντίστοιχα. Άσκηση 3 (1) Ευθύγραμμη διπλά συνδεδεμένη λίστα Χρησιμοποιούμε τις πιο κάτω δομές: typedef struct Node{ typedef struct DLlist { type data; node *top; struct Node *next; dllist; struct Node *prev; node; 4

Μη-αναδρομική εκδοχή EvenList1(dllist *L, dllist *new_list){ node *p, *previous, *new_node; new_list->top = NULL; p = L->top; previous = NULL; while (p!= NULL) { if (p->data mod 2 == 0) { new_node =(node *) malloc (sizeof(node)); new_node->data = p->data; new_node->next = NULL; new_node->prev = previous; if (previous == NULL) new_list->top = new_node; previous->next = new_node; previous = new_node; p = p->next; Αναδρομική εκδοχή RecEvenList1(dllist *L, dllist *new_list){ new_list->top = RecEven1(L->top) node *RecEven1(node *n){ node *new_node, p; if (n == NULL) return NULL; if (n->data mod 2 == 0) { new_node = (node *) malloc (sizeof(node)); new_node->data = n->data; new_node->prev = NULL; p = RecEven1(n->next); new_node->next = p; if (p!= NULL) p->prev = new_node; return new_node; return RecEven1(n->next); 5

(2) Κυκλική απλά συνδεδεμένη λίστα Χρησιμοποιούμε τις πιο κάτω δομές: typedef struct Node{ typedef struct Clist { type data; node *head; struct Node *next; clist; node; Μη-αναδρομική εκδοχή EvenList2(Clist *L, Clist *new_list){ node *p, *previous, *new_node; new_list->head = NULL; p = L->head; previous = NULL; if (p == NULL) return; do { if (p->data mod 2 == 0) { new_node =(node *) malloc (sizeof(node)); new_node->data = p->data; if (previous == NULL){ new_list->head = new_node; new_node->next = new_node; previous->next = new_node; new_node->next = new_list->head; previous = new_node; p = p->next; while (p!= L->head) Αναδρομική εκδοχή RecEvenList2(clist *L, clist *new_list){ new_list->top = RecEven2(L, L->top, NULL, 0) node *RecEven2(clist *L, node *n, node *first, int visited){ node *new_node; if (n == NULL) return NULL; if (n->data mod 2 == 0) { new_node = (node *) malloc (sizeof(node)); new_node->data = n->data; 6

(new_node)->next = RecEven2(L, n->next,first,1); return(new_node); if (visited == 1 and n == L->head) return first; return RecEven2(L, n->next, first, 1); (3) Κυκλική απλά συνδεδεμένη λίστα με κεφαλή Χρησιμοποιούμε τις πιο κάτω δομές: typedef struct Node{ typedef struct Clist { type data; node *head; struct Node *next; clist; node; Μη-αναδρομική εκδοχή EvenList3(Clist *L, Clist *new_list){ node *p, *previous, *new_node; new_node =(node *) malloc (sizeof(node)); new_list->head = new_node; previous = new_node; p = L->head->next; while (p!= L->head) { if (p->data mod 2 == 0) { new_node =(node *) malloc (sizeof(node)); new_node->data = p->data; previous->next = new_node; new_node->next = new_list->head; previous = new_node; p = p->next; Αναδρομική εκδοχή RecEvenList3(clist *L, clist *newlist){ head = (node *) malloc (sizeof(node)); new_list-> head = head; head->next = RecEven(L, L->top->next, head) node *RecEven3(clist *L, node *n, node *head_new){ 7

node *new_node; if (n == L->head) return head_new; if (n->data mod 2 == 0) { new_node = (node *) malloc (sizeof(node)); new_node->data = n->data; (new_node)->next=receven3(l, n->next, head_new); return(new_node); return RecEven3(L, n->next, head_new); 8