Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών. ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης



Σχετικά έγγραφα
Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

Instruction Execution Times

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

EE512: Error Control Coding

2 Composition. Invertible Mappings

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

HOMEWORK 4 = G. In order to plot the stress versus the stretch we define a normalized stretch:

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

The Simply Typed Lambda Calculus

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Physical DB Design. B-Trees Index files can become quite large for large main files Indices on index files are possible.

Συστήματα Διαχείρισης Βάσεων Δεδομένων

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Section 8.3 Trigonometric Equations

Approximation of distance between locations on earth given by latitude and longitude

(C) 2010 Pearson Education, Inc. All rights reserved.

The challenges of non-stable predicates

1) Formulation of the Problem as a Linear Programming Model

Αντισταθμιστική ανάλυση

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Concrete Mathematics Exercises from 30 September 2016

Partial Differential Equations in Biology The boundary element method. March 26, 2013

Finite Field Problems: Solutions

C.S. 430 Assignment 6, Sample Solutions

Lecture 2: Dirac notation and a review of linear algebra Read Sakurai chapter 1, Baym chatper 3

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

Αντικειµενοστρεφής Προγραµµατισµός

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

Assalamu `alaikum wr. wb.

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

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

TMA4115 Matematikk 3

Αντικειμενοστρεφής Προγραμματισμός

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

Other Test Constructions: Likelihood Ratio & Bayes Tests

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

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

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

Block Ciphers Modes. Ramki Thurimella

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

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ANSWERSHEET (TOPIC = DIFFERENTIAL CALCULUS) COLLECTION #2. h 0 h h 0 h h 0 ( ) g k = g 0 + g 1 + g g 2009 =?

Example Sheet 3 Solutions

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

department listing department name αχχουντσ ϕανε βαλικτ δδσϕηασδδη σδηφγ ασκϕηλκ τεχηνιχαλ αλαν ϕουν διξ τεχηνιχαλ ϕοην µαριανι

ΚΥΠΡΙΑΚΟΣ ΣΥΝΔΕΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY 21 ος ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δεύτερος Γύρος - 30 Μαρτίου 2011

ST5224: Advanced Statistical Theory II

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

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

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

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

Στο εστιατόριο «ToDokimasesPrinToBgaleisStonKosmo?» έξω από τους δακτυλίους του Κρόνου, οι παραγγελίες γίνονται ηλεκτρονικά.

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

Cambridge International Examinations Cambridge International General Certificate of Secondary Education

Γιπλυμαηική Δπγαζία. «Ανθπυποκενηπικόρ ζσεδιαζμόρ γέθςπαρ πλοίος» Φοςζιάνηρ Αθανάζιορ. Δπιβλέπυν Καθηγηηήρ: Νηθφιανο Π. Βεληίθνο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Econ 2110: Fall 2008 Suggested Solutions to Problem Set 8 questions or comments to Dan Fetter 1

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

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

(Διαφάνειες Νίκου Βιδάκη)

derivation of the Laplacian from rectangular to spherical coordinates

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

PARTIAL NOTES for 6.1 Trigonometric Identities

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική»

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

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

Every set of first-order formulas is equivalent to an independent set

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Math 6 SL Probability Distributions Practice Test Mark Scheme

Homework 3 Solutions

Numerical Analysis FMN011

Homework 8 Model Solution Section

Section 9.2 Polar Equations and Graphs

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

Cambridge International Examinations Cambridge International General Certificate of Secondary Education

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Modbus basic setup notes for IO-Link AL1xxx Master Block

Transcript:

Ονοµατεπώνυµο: Αριθµός Μητρώου: Άσκηση 1 (15 µονάδες) Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης Τελική Εξέταση (3 ώρες) Ηµεροµηνία: 24 Ιουνίου 2003 (α) Θεωρήστε το παρακάτω πρόγραµµα Java: /*1 class A extends Exception{ /*2 class B extends Exception{ /*3 class Main{ /*4 public static void main(string[] args){ /*5 try{ /*6 try{ /*7 if(args.length==0) throw new A(); /*8 else throw new B(); /*9 /*10 catch(a a){ /*11 System.out.println("11"); /*12 /*13 finally{ /*14 System.out.println("14"); /*15 /*16 System.out.println("16"); /*17 /*18 catch(b b){ /*19 System.out.println("19"); /*20 /*21 System.out.println("21"); /*22 /*23 1. Τι τυπώνεται στην στάνταρ έξοδο του προγράµµατος όταν στην εντολή της γραµµής 7 προκύπτει µια εξαίρεση τύπου Α? Εξηγήστε σύντοµα την απάντησή σας. It prints 11 14 16 21. The exception is caught by the inner handler. After that, the control flow continues normally.

2. Τι τυπώνεται στην στάνταρ έξοδο του προγράµµατος όταν στην εντολή της γραµµής 8 προκύπτει µια εξαίρεση τύπου Β? Εξηγήστε σύντοµα την απάντησή σας. It prints 14 19 21. The exception propagates to the outer handler; on the way, the inner finally block gets executed. After the outer handler, the control flow continues normally. (β) Θεωρήστε το παρακάτω πρόγραµµα Java: 1 try { 2 <try-block> 3 finally { 4 <finally-blocκ> 1. Ξαναγράψτε τον παραπάνω κώδικα χρησιµοποιώντας try-catch αλλά χωρίς finally, υποθέτοντας ότι µόνο η δηµιουργία εξαιρέσεων µπορεί να προκαλέσει την απότοµη διακοπή εκτέλεσης των εντολών του παραπάνω προγράµµατος. try { <try-block> catch(throwable e) { <finally-block> throw e; <finally-block> 2. Είναι ο προηγούµενος µετασχηµατισµός σωστός όταν επίσης θεωρήσουµε ότι εντολές επιστροφής (return) µπορούν επίσης να προκαλέσουν την απότοµη διακοπή εκτέλεσης των εντολών του παραπάνω προγράµµατος? Αν η απάντησή σας είναι καταφατική εξηγήστε γιατί. Αν η απάντησή σας είναι αρνητική εξηγήστε τους κυριότερους λόγους και προτείνετε έναν τρόπο που εξασφαλίζει την σωστή εκτέλεση του µετασχηµατισµένου προγράµµατος. No, it does not, because in Java, a "return" cannot be caught as an exception. One way to make it work would be to rewrite all "return" statements by throws of a special kind of ReturnException, and putting a try-catch for ReturnExceptions around every call. Άσκηση 2 (15 µονάδες) Απαντήστε στις παρακάτω ερωτήσεις χρησιµοποιώντας την ακόλουθη ιεραρχία κλάσεων, όπου η κλάση στην κορυφή της ιεραρχίας έχει τις αφαιρετικές (abstract) µεθόδους play() και stop().

(α) Πώς µπορείτε να υλοποιήσετε την παραπάνω ιεραρχία κλάσεων σε µια γλώσσα προγραµµατισµού η οποία δεν υποστηρίζει κληρονοµικότητα κλάσεων? Ξανασχεδιάστε το παραπάνω διάγραµµα για την λύση που προτείνετε και εξηγήστε τις διαφορές µεταξύ του αρχικού και του τροποποιηµένου διαγράµµατος καθώς και τους κυριότερους λόγους για τους οποίους η χρήση της κληρονοµικότητας καθιστά ευκολότερη την σχεδίαση και συντήρηση της παραπάνω ιεραρχίας κλάσεων. There are two valid solutions to this question: 1) have two classes, CD and DVD, that implement everything from the initial system, plus all functionality from the Recording abstract class; 2) change the Recording abstract class to an interface, move all attributes from Recording to the subclasses, make methods setcolour() and move() abstract, and implement setcolour() and move() in both children classes. The downside of either solution, as compared with the initial solution using inheritance, is that code common to both CD and DVD will have to be duplicated. This is not so much a problem at development-time as it is during maintenance, where changing one of the methods should require changing it in both CD and DVD classes. Corollaries to this are that there is an increased amount of code to read and understand, and the chance of making a mistake/typo increases with the size of the code base. A further downside of the first solution is that dynamic binding will not be possible.

(β) Υλοποιήστε σε ένα πρόγραµµα Java την σχεδίαση που σας δόθηκε στην αρχή της άσκησης. Στην απάντησή σας να συµπεριλάβετε µόνο τις µεταβλητές στιγµιοτύπων και τις µεθόδους που αναγράφονται στο διάγραµµα ενώ η υλοποίηση των µεθόδων πρέπει να είναι κενή. Σηµειώστε ότι τα σύµβολα πριν από τις µεταβλητές στιγµιοτύπων και τις µεθόδους της κάθε κλάσης υποδεικνύουν τα αντίστοιχα δικαιώµατα εξουσιοδοτηµένης πρόσβασης: συν (+) για public, πλην (-) για private και δίεση (#) για protected. public abstract class Recording { protected String title; protected int length, year; public abstract void play(); public abstract void stop(); public void setlength() { public void setyear() { public class CD extends Recording { private String artist; public void play() { public void stop() {

public class DVD extends Recording { private String producer, director; public void play() { public void stop() { Άσκηση 3 (10 µονάδες) Εξετάστε το παρακάτω πρόγραµµα Java: public class Z { void show(z z) { System.out.println( Z ); public class Y extends Z { void show(y y) { System.out.println( Y ); public class X { public static void main(string[] args) { Z c = new Z(); Y b = new Y(); Z a = new Y(); c.show(b); b.show(c); b.show(a); a.show(a); b.show((y)a); a.show(c); b.show(b); Τι τυπώνεται στην στάνταρ έξοδο του προγράµµατος όταν εκτελέσουµε τον κώδικα της κλάσης X? The output is: Z (2 points) Z (1 point) Z (1 point) Z (1 point) Y (1 point) Z (2 points) Y (2 points) A common mistake was identifying the first line as an error by considering that c is of class Z and Z has no method that takes a parameter of class Y. However, since b is of class Y it is also of class Z and therefore the method inside Z fits.

Άσκηση 4 (20 µονάδες) (α) ώστε την υλοποίηση της παρακάτω διεπαφής Java η οποία υποστηρίζει (µη-αναδροµικά) κλειδώµατα (locks) ανάγνωσης (read) και γραφής (write), µε ένα µόνο συγγραφέα ή οποιοδήποτε αριθµό αναγνωστών, οι οποίοι µπορούν να αποκτούν το κλείδωµα (locks) οποιαδήποτε χρονική στιγµή: interface ReadWriteMonitor { void acquirereadlock() throws InterruptedException; void releasereadlock(); void acquirewritelock() throws InterruptedException; void releasewritelock(); Ακριβέστερα, όταν µια προγραµµατιστική ίνα (thread) απαιτεί ένα κλείδωµα γραψίµατος (write lock), µπορεί να αποκτήσει το κλείδωµα γραψίµατος ακόµα και αν άλλες προγραµµατιστικές ίνες (threads) απαιτούν συνεχώς κλειδώµατα ανάγνωσης (read locks). Με άλλα λόγια, µια προγραµµατιστική ίνα δεν µπορεί να περιµένει µέχρι την στιγµή όπου καµία άλλη δεν επιθυµεί να αποκτήσει ένα κλείδωµα ανάγνωσης γιατί αυτή η στιγµή µπορεί να µην έρθει ποτέ. class MyLock implements ReadWriteMonitor { int readlocks; boolean writelocked; int writelocksdesired; void synchronized acquirereadlock() throws InterruptedException { while (writelocked writelocksdesired!= 0) wait(); readlocks++; void synchronized releasereadlock() { readlocks--; notifyall(); void synchronized acquirewritelock() throws InterruptedException { writelocksdesired++; try { while (writelocked readlocks!= 0 ) wait(); writelocked = true; finally { writelocksdesired--; void synchronized releasewritelock() { writelocked = false; notifyall();

(β) ώστε την υλοποίηση της παρακάτω διεπαφής Java: interface TodoList { void add(runnable r); Για την υλοποίησή σας θεωρήστε την παρακάτω κλάση QueueImpl, η οποία υλοποιεί την παρακάτω διεπαφή: interface Queue { void enqueue(object r); Object dequeue(); int size(); Η µέθοδος dequeue() επιστρέφει null όταν δεν υπάρχει κανένα αντικείµενο για αποµάκρυνση από την ουρά. Η κλάση QueueImpl δεν είναι ασφαλής ως προς την χρήση προγραµµατιστικών ινών (not thread safe) δηλ. δεν χρησιµοποιεί τεχνικές συγχρονισµού (synchronization). Η υλοποίηση της ToDoList πρέπει να µπορεί να καλεί τις µεθόδους εκτέλεσης κάθε εργασίας (task) που προστίθεται στην ToDoList, µία µία κάθε χρονική στιγµή, και µε την σειρά που έχουν προστεθεί. Εντούτοις, η µέθοδος add() πρέπει να µπορεί να τερµατίζει την εκτέλεσή της αµέσως µόλις µια εργασία προστεθεί στην ToDoList. Σηµειώστε ότι ανά πάσα χρονική στιγµή µόνο µία εργασία µπορεί να εκτελείται. class MyTodoList implements TodoList, Runnable { QueueImpl q; synchronized public void add(runnable r) { if (q == null) { q = new QueueImpl(); Thread t = new Thread(this); t.setdaemon(true); t.start(); q.enqueue(r); notifyall(); public void run() { while (true) { Runnable r; synchronized(this) { while (q.size() <= 0) try { wait(); catch (InterruptedException e) {; r = q.dequeue(); ; r.run();

Άσκηση 5 (30 µονάδες) (α) Σχολιάστε τα πλεονεκτήµατα και µειονεκτήµατα των παρακάτω υλοποιήσεων συλλογών δεδοµένων Java. 1. Κάτω από ποιες προϋποθέσεις είναι προτιµότερο ένα διάνυσµα (Vector) από έναν πίνακα (array) για τον χειρισµό µια συλλογής δεδοµένων που απαιτεί πρόσβαση µε την χρήση δεικτών θέσης (index)? A Vector is preferable to an Array under several different circumstances. For example, it is often preferable when the number of elements that will be needed is unknown. This is because it will do the reallocate-and-grow automatically. It is also a better choice if common operations such as contains(), indexof(), or clone() are required. These could be written for an Array -- but they're there and ready to use in a Vector. 2. Πότε είναι προτιµότερο ένα διάνυσµα (Vector) από µία απλή ή διπλή συνδεδεµένη λίστα (singly or doubly linked list)? Με άλλα λόγια, ποιες λειτουργίες (operations) είναι πιο αποδοτικές σε ένα διάνυσµα από ότι σε µια συνδεδεµένη λίστα? Vectors are preferable to linked lists any time random access is required. Internally, the elements of vectors are organized in a contiguous chunk of memory, which allows individual elements to be located by address after only a simple computation. Linked lists, by contrast, require step-by-step traversal. Additionally, if the size is known in advance, and memory utilization is a concern, Vectors are preferable to linked lists, even if memory access will be sequential. Vectors require one reference per object, instead of two references per object in a singly linked list (or three per in a doubly linked list). Each element in a doubly linked list contains not only one reference for the data and one reference for the next element -- but also an additional element for the predecessor. From the perspective of operations, accessing (or mutating) by index is more efficient in an index, as is adding at the end, if the Vector is large enough (doesn't require growth). On the other hand, doubly linked lists should only be used when the extra reference is worth the space. What does this reference buy us? It makes it possibly to (without recursion or painful loops-within-loops) traverse the list backwards. It also simplifies removing within the list or at the tail. Furthermore, each-and-every mutator that does not require this predecessor pointer is made more complicated, and as a consequence, slower, by its presence. For example, it needs to be updated each time a node is added or removed -- even if it wasn't used to find the node. So, singly linked lists should be used any time it isn't often necessary to traverse the list in reverse, or remove nodes other than at the beginning of the list.

(β) Για κάθε ένα από τα παρακάτω προβλήµατα, περιγράψτε ποιος πιστεύετε ότι είναι ο καταλληλότερος ΑΤ (Αφαιρετικός Τύπος εδοµένων) για να σχεδιάσετε (ως προς την λειτουργικότητά της διεπαφής που προσφέρει) και να υλοποιήσετε (ως προς τις επιδόσεις της συγκεκριµένης δοµής δεδοµένων που χρησιµοποιεί) τις λειτουργίες που σας ζητούνται στην εκφώνηση. 1. Υποθέστε ότι εργάζεστε σε µια εταιρία λογισµικού που σχεδιάζει µια εφαρµογή διαχείρισης του χαρτοφυλακίου µετοχών ενός επενδυτή. Καλείστε να διαλέξετε τον καταλληλότερο ΑΤ από το Java Collection Framework για να αναπαραστήσετε ένα χαρτοφυλάκιο δηλ µια συλλογή µετοχών που ανά πάσα στιγµή έχει στην κατοχή του ένας επενδυτής. Η εφαρµογή πρέπει να επιτρέπει την εισαγωγή µιας µετοχής στο χαρτοφυλάκιο όταν αυτή αγοράζεται από έναν επενδυτή, την αφαίρεση µιας µετοχής από το χαρτοφυλάκιο όταν αυτή πωλείται από τον επενδυτή, και την πρόσβαση σε οποιαδήποτε µετοχή του χαρτοφυλακίου όταν ο επενδυτής θέλει να τυπώσει σχετικές πληροφορίες για µια συγκεκριµένη µετοχή. There are a few basic ways to design and implement a solution to this problem: use a Vector or Sequence implemented using either a dynamic array or a linked list. The List ADT is unacceptable, as it does not provide methods used to access an arbitrary stock in the portfolio. Both the Vector ADT and Sequence ADT contain such methods, and for that reason are acceptable. Either ADT could be implemented using a dynamic array or a linked list. Given this situation, each would provide a similar level of efficiency. Using a dynamic array, the insert operation and the remove operation would both run in time that is O(n) as the array would have to grow or shrink, respectively, in the worst case. Accessing an arbitrary stock in the portfolio would take O(1) time, as the array can instantly access any of its elements. Using a linked list, the insert operation would run in O(1) time, as stocks could be inserted at either the first or last position in constant time; the problem does not describe the need to insert stocks at arbitrary locations in the structure. Both removing and accessing an arbitrary stock from the portfolio would take O(n) time, as links must be followed from the head of the list to the stock that is to be removed or accessed. 2. Υποθέστε ότι εργάζεστε σε µια εταιρία λογισµικού που σχεδιάζει ένα διαλογικό σύστηµα οδήγησης αυτοκινήτων σε πραγµατικό χρόνο. Το σύστηµα πρέπει να προσφέρει κατάλληλες βοήθειες οδήγησης στον οδηγό του αυτοκινήτου, και να παρακολουθεί την πορεία του στον δρόµο καθώς ο οδηγός κατευθύνεται προς τον προορισµό του ακολουθώντας πιστά τις βοήθειες που του δίνονται από το σύστηµα. Καλείστε να διαλέξετε τον καταλληλότερο ΑΤ από το Java Collection Framework για να αναπαραστήσετε µία συλλογή από βοήθειες οδήγησης για να φτάσει ένας οδηγός από την αφετηρία στον προορισµό του. Το σύστηµα πρέπει να επιτρέπει την αφαίρεση µιας βοήθειας οδήγησης από την αρχή της συλλογής

όταν αυτή ακολουθείται από τον οδηγό, να προσφέρει την επόµενη βοήθεια µετά από µία συγκεκριµένη βοήθεια οδήγησης, και να ελέγχει εάν υπολείπονται βοήθειες στην συλλογή δηλ εάν ο οδηγός έχει φτάσει τελικά στον προορισµό του. The most appropriate way to solve this problem would be to use the List ADT. It is possible to use any of the other linear ADTs as well, but the List ADT best fits the description of the problem: remove from the front of the structure, access an element immediately after a given element, and test if the structure is empty. If the chosen linear ADT is implemented using a linked list, each of the methods could easily run in time that is O(1). For this reason, a linked list is the most appropriate choice. It is possible to implement the chosen linear ADT using a dynamic array and still have each of the methods run in time that is O(1). If the array is never shrunk as directions are removed from the structure, each of the methods will run in constant time, but memory will be wasted. It is more appropriate to assume that the remove operation would take O(n) time if a dynamic array implementation were used. For that reason, a linked list is a more appropriate choice of implementation. Ασκηση 6 (30 µονάδες) Θεωρήστε την παρακάτω διεπαφή Java που καθορίζει το συµβόλαιο του ΑΤ Ουρά µε Προτεραιότητα (Priority Queue ADT): * Required methods for the Priority Queue ADT. public interface IPriorityQueue { * Inserts the given key and element into this. * @param akey key for the item * @param anelement element for the item public void insertitem(comparable key, Object element); Returns a highest priority element in this. public Object highest(); Returns a highest priority key in this. public Comparable highestkey(); * Removes the highest priority item from this, * and returns its element. public Object removehighest();

Υποθέστε επίσης µια κλάση Item της οποίας ο ορισµός περιλαµβάνει δύο µεταβλητές στιγµιοτύπων: µία public Comparable µε το όνοµα key και µία public Object µε το όνοµα element. Μπορείτε επίσης να υποθέσετε ότι η κλάση Item διαθέτει επίσης µία µέθοδο κατασκευής αντικειµένων που παίρνει σαν παραµέτρους εισόδου ένα Comparable και ένα Object, και αποθηκεύει αυτά τα αντικείµενα αντιστοίχως στις µεταβλητές στιγµιοτύπων key και element του αντικειµένου Item που δηµιουργείται. ώστε µια κλάση UnsortedPriorityQueue που υλοποιεί την διεπαφή IPriorityQueue αποθηκεύοντας τα κλειδιά (keys) και τα στοιχεία (elements) της σε ένα µη ταξινοµηµένο Vector. Βεβαιωθείτε ότι η υλοποίησή σας λαµβάνει υπόψη της όλες τις συνθήκες λαθών που προβλέπονται στο συµβόλαιο του ΑΤ και δηµιουργήστε µια εξαίρεση RuntimeException σε κάθε περίπτωση που ένα λάθος εµφανίζεται. Για την ακριβέστερη διόρθωση της άσκησης ενσωµατώστε στον κώδικά σας κατάλληλα σχόλια Javadoc. import java.util.vector; * IPriorityQueue implementation using a sorted vector * to hold its keys and elements. * @author Jeff Raab public class UnsortedPriorityQueue implements IPriorityQueue { Vector used to hold the keys and elements. protected Vector items = new Vector(); Constructs a new unsorted priority queue. public UnsortedPriorityQueue() { * Inserts the given key and element into this. * @param akey key for the item * @param anelement element for the item * @example insertitem(1, A) into { : {(1, A) * @example insertitem(0, B) into {(1, A) : * {(1, A), (0, B) public void insertitem(comparable key,object element){ items.add(new Item(key, element)); * Returns a highest priority element in this. * @example highest() on { throws an exception * @example highest() on {(1, A), (0, B) returns B

public Object highest() { if (items.isempty()) { throw new RuntimeException( Queue is empty ); Object o = items.elementat(highestindex()); Item i = (Item)o; return i.element; * Returns a highest priority key in this. * @example highestkey() on { throws an exception * @example highestkey() on {(1, A), (0, B) returns 0 public Comparable highestkey() { if (items.isempty()) { throw new RuntimeException( Queue is empty ); Object o = items.elementat(highestindex()); Item i = (Item)o; return i.key; * Removes the highest priority item from this, * and returns its element. * @example removehighest() on { throws an exception * @example removehighest() on {(1, A), (0, B) * returns B public Object removehighest() { if (items.isempty()) { throw new RuntimeException( Queue is empty ); Object o = items.remove(highestindex()); Item i = (Item)o; return i.element; Returns the index of the highest key in this. private int highestindex() { int min = 0; Item minitem = (Item)items.elementAt(0); for (int i = 1; i < items.size(); i++) { Item anitem = (Item)items.elementAt(i); if (anitem.key.compareto(minitem.key) < 0) { min = i; minitem = anitem; return min;