ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ231: Δομές Δεδομένων και Αλγόριθμοι Εαρινό Εξάμηνο 2017-2018 Φροντιστήριο 3 1. Εστω η στοίβα S και ο παρακάτω αλγόριθμος επεξεργασίας της. Να καταγράψετε την κατάσταση της S στο τέλος κάθε επανάληψης του εξωτερικού βρόγχου εάν δίνεται ως είσοδος η συμβολοσειρά (((10 + 6 4) (1 + 1))/(7 5)). Stack s new Stack ( ) ; s. makeempty ( ) ; while ( c n e x t _ c h a r a c t e r ( ) and ( c i s not EOF) ) { i f ( c ( c Number c Operator ) s. push ( c ) ; e l s e i f ( c ) ) { d s. pop ( ) ; while ( d! ( ) { op2 d ; op s. pop ( ) ; op1 s. pop ( ) ; d s. pop ( ) ; r e s u l t evaluate ( op1 op op2 ) ; s. push ( r e s u l t ) ; s. push ( d ) ; e l s e r e p o r t e r r o r ; return s. top ( ) ; Χρησιμοποιούμε τον συμβολισμό S = [x 1, x 2,..., x k ] για να αναπαριστήσουμε την στοίβα όταν σε αυτήν έχουν εισαχθεί κατά σειρά τα στοιχεία x 1,..., x k. 1
Επανάληψη S 1 η [ ( ] 2 η [ (,( ] 3 η [ (,(,( ] 4 η [ (,(,(,10 ] 5 η [ (,(,(,10,+ ] 6 η [ (,(,(,10,+,6 ] 7 η [ (,(,(,10,+,6,-,4 ] 8 η [ (,(,12 ] 9 η [ (,(,12,* ] 10 η [ (,(,12,*,( ] 11 η [ (,(,12,*,(,1 ] 12 η [ (,(,12,*,(,1,+ ] 13 η [ (,(,12,*,(,1,+,1 ] η [ (,(,12,*,2 ] 15 η [ (,24 ] 16 η [ (,24,/ ] 17 η [ (,24,/,( ] 18 η [ (,24,(,7 ] 19 η [ (,24,(,7,- ] 20 η [ (,24,(,7,-,5 ] 21 η [ (,24,/,2 ] 22 η [ 12 ] 2. Εστω η πιο κάτω υλοποίηση. c l a s s Node { p r i v a t e i n t ; p r i v a t e Node ; Node ( i n t, Node ) { t h i s. ; t h i s. ; Node r e c _ r e m o v e _ l e s s _ t h a n ( i n t x ) { Node n ; i f (! null ) n. r e c _ r e m o v e _ l e s s _ t h a n ( x ) ; e l s e n null ; i f ( < x ) return n ; e l s e n ; return t h i s ;... c l a s s L i s t { Node top ; 2
void remove_less_than ( i n t x ) { top top. r e c _ r e m o v e _ l e s s _ t h a n ( x ) ; Υποθέστε την ύπαρξη συνάρτησης που κάνει καλεί την my_list.remove_less_than(42), όπου η λίστα που αντιστοιχεί στη δομή my_list αναπαρίσταται ως: my_list Να καταγράψετε την κατάσταση της λίστας στο τέλος κάθε αναδρομικής εκτέλεσης της συνάρτησης.rec_remove_less_than(42);. 1ος τερματισμός της συνάρτησης.rec_remove_less_than(42);. my_list 2ος τερματισμός της συνάρτησης.rec_remove_less_than(42);. my_list 3ος τερματισμός της συνάρτησης.rec_remove_less_than(42);. my_list 4ος τερματισμός της συνάρτησης.rec_remove_less_than(42);. my_list 32 32 32 τερματισμός της συνάρτησης mylist.remove_less_than(42);. my_list 3. Να γράψετε μία αναδρομική και μία μη αναδρομική διαδικασία οι οποίες να παίρνουν ως δεδομένο εισόδου μια συνδεδεμένη λίστα που περιέχει ακέραιους και να επιστρέφουν μια καινούρια συνδεδεμένη λίστα η οποία να περιέχει τα άρτια στοιχεία της αρχικής λίστας για κάθε μια από τις πιο κάτω περιπτώσεις: (a) ευθύγραμμη διπλά συνδεδεμένη λίστα (b) κυκλική απλά συνδεδεμένη λίστα. Να συγκρίνετε τις δύο διαδικασίες ως προς τον χώρο που χρησιμοποιούν και τον χρόνο που χρει- άζονται για να εκτελεστούν. Σημείωση: Τα στοιχεία της τελικής λίστας ϑα πρέπει να βρίσκονται στην ίδια σειρά με την οποία βρίσκονται στην αρχική λίστα. (a) Μη αναδρομική εκδοχή: c l a s s DList { p r i v a t e c l a s s Node { p r i v a t e i n t ; 3
p r i v a t e Node, prev ; Node ( i n t d, Node n, Node p ) { d ; n ; prev p ; i n t { return ; Node ( ) { return ; Node ( Node n) { n ; Node previous ( ) { return previous ; p r i v a t e Node f r o n t ; p r i v a t e Node rear ; DList evenlist ( ) { Node p ; DList l new DList ( ) ; p f r o n t ; while ( p! null ) { i f ( p. ( ) % 2 0) { l. enqueue ( ) ; p p. ( ) ; return l ; void enqueue ( ) { rear. ( new Node (, null, rear ) ) ; rear rear. ; i f ( f r o n t null ) f r o n t rear ; Αναδρομική εκδοχή: c l a s s DList { p r i v a t e c l a s s Node { p r i v a t e i n t ; p r i v a t e Node, prev ; Node ( i n t d, Node n, Node p ) { d ; n ; prev p ; i n t { return ; Node ( ) { return ; Node ( Node n) { n ; Node previous ( ) { return previous ; Node previous ( Node n) { previous n ; p r i v a t e Node top ; Node EvenNode ( ) { Node n ; i f ( n! null ) { Node tmp. evennode ( ) ; n new ( tmp. ( ), tmp. ( ), tmp. previous ( ) ) ; e l s e n null ; 4
i f ( ( ) % 2! 0) return n ; i f ( n! null ) n. previous ( t h i s ) ;. ( n) ; return t h i s ; DList evenlist ( ) { D l i s t l new DList ( ) ; l. top top. evennode ( ) ; return l ; 4. Να προτείνετε μια δομή δεδομένων η οποία εκτός από τις συνήθεις πράξεις στοίβας (IsEmpty, MakeEmpty, Top, Push, Pop) να υποστηρίζει και την επιπλέον πράξη FindMin, η οποία επιστρέφει το μικρότερο στοιχείο της δομής (χωρίς να το εξάγει). Να γράψετε: (a) μια καθαρή προδιαγραφή των πράξεων και των μεταβλητών που χρειάζονται για τη δομή και (b) την υλοποίηση των πράξεων σε ψευδοκώδικα. Ολες οι πράξεις πρέπει να είναι της τάξης Ο(1). Σε κάθε ϑέση της στοίβας αποθηκεύουμε ζεύγη στοιχείων όπου το πρώτο μέλος κάθε ζεύγους αντιστοιχεί στο στοιχείο που εισήχθηκε, και το δεύτερο μέλος του ζεύγους στο μέχρι στιγμής ελάχιστο στοιχείο της στοίβας. Για παράδειγμα οι διαδοχικές εισαγωγές 4, 3, 5, 9, 7, 1, 2 έχουν ως αποτέλεσμα τις καταστάσεις του Σχήματος 1. Σχήμα 1: Παράδειγμα διαδοχικών εισαγωγών την στοίβα του ερωτήματος 4. Κατά συνέπεια, ανά πάσα στιγμή μπορούμε να βρούμε και να επιστρέψουμε το ελάχιστο στοιχείο της στοίβας σε χρόνο σταθερό (επιστρέφοντας το δεύτερο μέλος του ζεύγους που βρίσκεται στον κόμβο κορυφής της στοίβας). 5. Εστω ΑΤΔ ουράς (πράξεις IsEmpty, MakeEmpty, Enqueue, Dequeue). Χρησιμοποιώντας τον ΑΤΔ ουράς να δώσετε μια υλοποίηση του ΑΤΔ στοίβας (IsEmpty, MakeEmpty, Top, Push, Pop) c l a s s Stack <E> { 5
Queue<E> q1, q2 ; Stack ( ) { q1 new Queue<E> ( ) ; q2 new Queue<E> ( ) ; q1. makeempty ( ) ; q2. makeempty ( ) ; void makeempty ( ) { q1. makeempty ( ) ; q2. makeempty ( ) ; boolean isempty ( ) { return q1. isempty ( ) ; void push ( E ) { q1. enqueue ( ) ; E pop ( ) { E null ; while ( q1. isempty ( ) f a l s e ) { q1. dequeue ( ) ; i f ( q1. isempty f a l s e ) q2. enqueue ( ) ; Queue tmp q1 ; q1 q2 ; q2 tmp ; return ; E top ( ) { E null ; while ( q1. isempty ( ) f a l s e ) { q1. dequeue ( ) ; q2. enqueue ( ) ; Queue tmp q1 ; q1 q2 ; q2 tmp ; return ; 6. Εστώ η πιο κάτω αναδρομική συνάρτηση που εκτυπώνει τη δυαδική αναπαράσταση ενός ακέραιου αριθμού: i n t d e c i m a l _ t o _ b i n a r y ( i n t x ) { i f ( x / 2! 0) { d e c i m a l _ t o _ b i n a r y ( x / 2 ) ; System. out. p r i n t ( x%2) ; 6
(a) Εξηγείστε ποιος ΑΤΔ μπορεί να χρησιμοποιηθεί για την υλοποίηση μιας μη αναδρομικής συνάρτησης που να υπολογίζει τη δυαδική αναπαράσταση ενός αριθμού. (b) Δώστε την υλοποίηση της πιο πάνω συνάρτησης. (a) Για την υλοποίηση μιας μη αναδρομικής διαδικασίας χρησιμοποιούμε το ΑΤΔ στοίβας, αφού η αναδρομή είναι μια διαδικασία που στηρίζεται σε δημιουργία στοίβας. (b) void d e c i m a l _ t o _ b i n a ry ( i n t x ) { Stack s new Stack ( ) ; s. makeempty ( ) ; i n t y ; for ( y x ; y / 2! 0; y y / 2 ) s. push ( y%2) ; while (! s. isempty ( ) ) { System. out. p r i n t l n ( s. top ( ) ) ; s. pop ( ) ; 7. Στις πρώτες βοήθειες ενός νοσοκομείου η πολιτική εξυπηρέτησης των ασθενών γίνεται με τη σειρά άφιξής τους με εξαίρεση τα έκτακτα περιστάτικά. Σε περίπτωση έκτακτου περιστατικού η πολιτική επιτρέπει την παράκαμψη της σειράς αναμονής και τοποθέτηση του ασθενή στη πρώτη ϑέση προς εξυπηρέτηση. Να προτείνεται (a) Την προδιαγραφή ΑΤΔ που μπορεί να μοντελοποιήσει την πολιτική εξυπηρέτησης ασθενών στο πιο πάνω νοσοκομείο. (b) Μια αποδοτική υλοποίηση του πιο πάνω ΑΤΔ. Δικαιολογήστε τις απαντήσεις σας. Επέκταση του ΑΤΔ ουράς (πράξεις IsEmpty, MakeEmpty, Enqueue, Dequeue) με την πράξη Priority_Queue η οποία τοποθετεί ένα περιστατικό στο μπροστά άκρο της ουράς (το άκρο εξαγωγής στοιχείων). Η χρονική πολυπλοκότητα της όποιας υλοποίησης ϑα είναι η ίδια συγκεκριμένα, όλες οι πράξεις χρειάζονται σταθερό χρόνο. Λόγω όμως μη προσδιορισμού του μέγιστου αριθμού περιστατικών που μπορεί να προκύψουν από την εκφώνηση του προβλήματος η υλοποίηση με δυναμική χορήγηση μνήμης προτείνεται για την αποδοτική διαχείριση της μνήμης. 7