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

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

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 2. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης

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

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

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

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

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Τµήµα Πληροφορικής. Υλοποίηση LRU Cache ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ - ΕΡΓΑΣΙΑ 4. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Γενικά περί Caching

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Αλγόριθµοι και Πολυπλοκότητα

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

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

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

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

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

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

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

Πληροφορική 2. Αλγόριθμοι

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

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

Δοµές Δεδοµένων. 15η Διάλεξη Δέντρα Δυαδικής Αναζήτησης και Κατακερµατισµός. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

for for for for( . */

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

HY-252 Αντικειµενοστραφής Προγραµµατισµός. Χειµερινό Εξάµηνο 2010 ιδάσκων: Χριστοφίδης Βασίλης. Ηµεροµηνία Παράδοσης: 15/10/2010

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Κεφάλαιο 10 Ψηφιακά Λεξικά

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

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

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

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

Ασκήσεις μελέτης της 4 ης διάλεξης. ), για οποιοδήποτε μονοπάτι n 1

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

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

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 11 / 12 / 2014 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΕΠΛ131 Αρχές Προγραμματισμού

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ. Πρώτη Σειρά ασκήσεων Ημερομηνία Παράδοσης: 24 Απριλίου 2018, 12 μ.μ.

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

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

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

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

Ενότητα 7 Ουρές Προτεραιότητας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

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

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

Ουρά Προτεραιότητας (priority queue)

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

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

AVL-trees C++ implementation

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

PROJECT ΣΤΟ ΜΑΘΗΜΑ ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΕΥΡΕΤΙΚΕΣ ΜΕΘΟ ΟΥΣ

scanf() scanf() stdin scanf() printf() int float double %lf float

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Διάλεξη 14: Δέντρα IV - B-Δένδρα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Δέντρα Δυαδικής Αναζήτησης Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή

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

Κεφάλαιο 6 Ουρές Προτεραιότητας

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

Δοµές Δεδοµένων. 17η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

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

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Ενότητα 7 Ουρές Προτεραιότητας

Transcript:

Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα Πληροφορικής Φθινοπωρινό Εξάµηνο 2016 Δοµές Δεδοµένων - Εργασία 3 Διδάσκων: E. Μαρκάκης Εφαρµογές των Δέντρων Δυαδικής Αναζήτησης Σκοπός της εργασίας αυτής είναι η εξοικείωση µε δενδρικές δοµές και µε τις επεκτάσεις των Δέντρων Δυαδικής Αναζήτησης. Συγκεκριµένα, θα πρέπει να υλοποιήσετε µεθόδους για 2d-trees, µια δενδρική δοµή δεδοµένων κατάλληλη για την αναπαράσταση και την επεξεργασία σηµείων στο επίπεδο. Δεδοµένων Ν σηµείων στο δισδιάστατο χώρο, οι πιο σηµαντικές λειτουργίες που θέλουµε να υλοποιήσουµε είναι 1. range search: βρες όλα τα σηµεία, από τα Ν, που περιέχονται σε ένα παραλληλόγραµµο που δίνει ο χρήστης, (δείτε το σχήµα παρακάτω) 2. nearest neighbor search: βρες από τα Ν σηµεία αυτό που απέχει τη µικρότερη απόσταση από κάποιο σηµείο που καθορίζει ο χρήστης. Για ευκολία, θα περιοριστούµε στο χώρο [0,100] x [0,100], εποµένως όλα τα σηµεία που θα θεωρήσουµε θα έχουν συντεταγµένες (x, y) µε x, y ακέραιους στο διάστηµα [0,100]. Εφαρµογές των 2d-trees: Τα 2d-trees και οι επεκτάσεις τους έχουν αρκετές εφαρµογές σε όραση υπολογιστών, επιτάχυνση νευρωνικών δικτύων, και ανάκτηση εικόνας. Μια χαρακτηριστική εφαρµογή είναι η ανίχνευση σύγκρουσης (collision detection) σε video games 2 διαστάσεων. Για παράδειγµα, σε ένα platform video game, συχνά το πρόγραµµα του παιχνιδιού καλείται να αποφασίσει α) αν ο χαρακτήρας που χειρίζεται ο παίκτης συγκρούστηκε µε κάποιο αντικείµενο (π.χ. αντίπαλος παίκτης ή σφαίρα) ή β) αν γίνει µια έκρηξη, τότε πόσα αντικείµενα στο γύρω χώρο πρέπει να ανατιναχτούν. Για να παρθούν αυτές οι αποφάσεις, ένας µηαποδοτικός τρόπος είναι να συγκριθεί η θέση του εξεταζόµενου αντικειµένου σε σχέση µε όλα τα Ν αντικείµενα που εµφανίζονται στην οθόνη. Αυτό όµως είναι

υπολογιστικά ακριβό καθώς κοστίζει Ο(Ν). Με τη χρήση των 2d-trees, η πολυπλοκότητα µειώνεται σηµαντικά σε O(logN) κατά µέσο όρο. Παράδειγµα: Στο παιχνίδι Space Invaders θέλουµε να δούµε αν η σφαίρα που έριξε το αεροπλανάκι βρίσκει στόχο. Επιπλέον, αν η σφαίρα είναι ένα ειδικό όπλο που εκρήγνυται, τότε η υλοποίηση του προγράµµατος θα πρέπει να εντοπίζει όλους τους εξωγήινους γύρω από την έκρηξη (δηλαδή, υλοποίηση της range_search) ώστε να τους καταστρέψει και αυτούς. Μέρος Α: ΑΤΔ γεωµετρικών αντικειµένων: Ξεκινώντας, υλοποιήστε πρώτα µία κλάση για την αναπαράσταση σηµείων και µία για την αναπαράσταση παραλληλογράµµων, µε πλευρές παράλληλες µε τους άξονες. Συγκεκριµένα: Υλοποιήστε τον ΑΤΔ Point για σηµεία στο επίπεδο που να υποστηρίζει τις εξής λειτουργίες: public class Point { public Point(int x, int y) // construct the point (x, y) public int x() // return the x-coordinate public int y() // return the y-coordinate public double distanceto(point z) // Euclidean distance //between two points public int squaredistanceto(point z) // square of the Euclidean //distance between two points public String tostring() // string representation: (x, y) } Για την κλάση αυτή µπορείτε να βασιστείτε στην κλάση Point από το βιβλίο (Κεφάλαιο 3) και να την τροποποιήσετε κατάλληλα όπου χρειάζεται. Στη συνέχεια γράψτε τον ΑΤΔ Rectangle για την αναπαράσταση παραλληλογράµµων. Για ευκολία, τα παραλληλόγραµµα θα είναι παράλληλα προς τους άξονες. Εποµένως, τα παραλληλόγραµµα είναι της µορφής [x min, x max ] x [y min, y max ] όπου x min, x max, y min, y max [0,100]. Άρα η κλάση Rectangle αναπαρίσταται µε τέσσερις ακεραίους. Οι λειτουργίες που πρέπει να υποστηρίζονται από την κλάση Rectangle είναι οι εξής: public class Rectangle { public Rectangle(int xmin, int ymin, int xmax, int ymax) // construct the rectangle [xmin, ymin] x [xmax, ymax]

} public int xmin() // minimum x-coordinate of rectangle public int ymin() // minimum y-coordinate of rectangle public int xmax() // maximum x-coordinate of rectangle public int ymax() // maximum y-coordinate of rectangle public boolean contains(point p) //does p belong to the rectangle? public boolean intersects(rectangle that) // do the two rectangles // intersect? public double distanceto(point p) // Euclidean distance from p //to closest point in rectangle public int squaredistanceto(point p) // square of Euclidean // distance from p to closest point in rectangle public String tostring() // string representation: // [x min, x max ] x [y min, y max ] Ελέγξτε προσεκτικά τις µεθόδους σας µέχρι εδώ προτού προχωρήσετε. Δείτε τα σχόλια που περιγράφουν τι κάνει κάθε µέθοδος, καθώς και πότε πρέπει να πετάξετε κάποια εξαίρεση (επιλέξτε έτοιµη εξαίρεση από την Java ή κατασκευάστε δική σας, προκειµένου να εκφράζει καλύτερα τον τύπο του σφάλµατος). Π.χ. αν στον constructor του παραλληλογράµµου, τα ορίσµατα ικανοποιούν ότι xmin > xmax θα πρέπει να πετάτε κάποιο exception. Για την µέθοδο contains(p), η απάντηση πρέπει να είναι true είτε όταν το σηµείο p βρίσκεται στο εσωτερικό του παραλληλόγραµµου, είτε όταν βρίσκεται πάνω στις πλευρές του. Για την µέθοδο intersects, θα πρέπει να επιστρέφετε true όταν τα 2 παραλληλόγραµµα έχουν ένα τουλάχιστον κοινό σηµείο. Μέρος Β: ΑΤΔ για 2d-trees. Ένα 2d-tree είναι µία γενίκευση των Δέντρων Δυαδικής Αναζήτησης, για 2διάστατα κλειδιά. Κάθε κόµβος του 2d-tree θα αντιστοιχεί σε ένα από τα Ν σηµεία που θα δίνει ο χρήστης. Εποµένως προτού ορίσετε την κλάση TwoDTree που περιγράφεται παρακάτω, θα πρέπει πρώτα να ορίσετε µία κλάση TreeNode, για τους κόµβους (σε αναλογία µε την υλοποίηση για ΔΔΑ του Κεφαλαίου 12). Ένας κόµβος στη δοµή σας θα περιέχει τουλάχιστον ένα αντικείµενο Point και 2 δείκτες προς το αριστερό και δεξιό υποδέντρο. Η ιδέα στα 2dtrees είναι ότι χρησιµοποιούµε εναλλάξ τις συντεταγµένες x, y για να καθορίσουµε το µονοπάτι της αναζήτησης καθώς και το πού θα εισαχθεί ένας νέος κόµβος (δείτε και τα hints στην τελευταία σελίδα). Μέθοδοι search και insert. Ο αλγόριθµος αναζήτησης σε ένα 2d-tree είναι παρόµοιος µε τον αντίστοιχο αλγόριθµο σε ΔΔΑ και λειτουργεί ως εξής: ξεκινώντας από τη ρίζα, αν το σηµείο που ψάχνουµε έχει συντεταγµένη x µικρότερη από την συντεταγµένη x της ρίζας, τότε συνεχίζουµε την αναζήτηση στο αριστερό υποδέντρο, αλλιώς τη συνεχίζουµε στο δεξιό (ελέγχουµε φυσικά πρώτα αν το σηµείο που ψάχνουµε έχει x και y συντεταγµένες ίσες µε το σηµείο στη ρίζα, και σε τέτοια περίπτωση σταµατάµε αφού έχουµε επιτυχή αναζήτηση). Στη συνέχεια στο επόµενο επίπεδο χρησιµοποιούµε την συντεταγµένη y για να καθορίσουµε αν θα κινηθούµε προς το αριστερό ή το δεξιό υποδέντρο, ενώ στο µεθεπόµενο επίπεδο χρησιµοποιούµε πάλι τη συντεταγµένη x κ.ο.κ. Με τον ίδιο τρόπο γίνεται και η εισαγωγή ενός νέου κόµβου. Ακολουθούµε το µονοπάτι στο δέντρο χρησιµοποιώντας εναλλάξ τις συντεταγµένες x και y και εισάγουµε το νέο σηµείο ως φύλλο. Κάνουµε λοιπόν εισαγωγή σε φύλλο σε αντιστοιχία µε το πρόγραµµα 12.15 του βιβλίου και όχι εισαγωγή στη ρίζα. Για παράδειγµα το δέντρο που θα δηµιουργηθεί από τις 4

διαδοχικές εισαγωγές που φαίνονται παρακάτω αν γίνουν µε σειρά από αριστερά προς δεξιά θα είναι το εξής: insert (70, 20) insert (50, 40) insert (20, 30) insert (40, 70) Γράψτε τον ΑΤΔ TwoDTree που αναπαριστά ένα 2d-tree και υποστηρίζει τις εξής λειτουργίες (µπορείτε να προσθέσετε όποιες άλλες µεθόδους κρίνετε εσείς απαραίτητες): public class TwoDTree { public TwoDTree() // construct an empty tree public boolean isempty() // is the tree empty? public int size() // number of points in the tree public void insert(point p) // inserts the point p to the tree public boolean search(point p) // does the tree contain p? public Point nearestneighbor(point p) // point in the tree that is //closest to p //(null if tree is empty) public List<Point> rangesearch(rectangle rect) // Returns a list // with the Points that are contained in the rectangle } Προσοχή στην µέθοδο rangesearch: η µέθοδος επιστρέφει τα σηµεία (Points) που περιέχονται στο συγκεκριµένο χώρο (Rectangle) µέσα σε µια δοµή δεδοµένων. Αν δεν υπάρχουν σηµεία, θα επιστρέψει µια άδεια δοµή (αλλά όχι null). Στο σηµείο αυτό µπορείτε να χρησιµοποιήσετε είτε λίστα είτε ουρά (ή ακόµα και ΔΔΑ), και µπορείτε να βασιστείτε στις δοµές που έχουµε υλοποιήσει στο εργαστήριο ή να επαναχρησιµοποιήσετε µια δοµή που αναπτύξατε στις εργασίες σας και να την τροποποιήσετε αν χρειάζεται. Η δήλωση της συνάρτησης rangesearch να επιστρέφει List<Point> είναι ενδεικτική. Μπορείτε να την τροποποιήσετε κατά βούληση ώστε να επιστρέφει την δοµή που προτιµήσατε.

Όλοι οι παραπάνω ΑΤΔ (Point, Rectangle, TwoDTree) µπορούν να περιέχουν και άλλες βοηθητικές µεθόδους που κρίνετε εσείς απαραίτητες. Εκτέλεση, input και output Το πρόγραµµα TwoDTree.java θα έχει µία µέθοδο main η οποία αρχικά θα διαβάζει από ένα αρχείο εισόδου τον αριθµό των σηµείων και µετά τα ίδια τα σηµεία που θα εισάγει στο δέντρο (το όνοµα του αρχείου εισόδου θα δίνεται µαζί µε το path όπως και στις άλλες εργασίες). Ένα παράδειγµα για το αρχείο εισόδου είναι το εξής: 5 30 50 15 97 0 36 100 0 100 40 Στο παραπάνω παράδειγµα, Ν=5, και µετά την πρώτη γραµµή ακολουθούν τα 5 σηµεία. Δεν επιτρέπεται η επανάληψη σηµείων. Η main θα διαβάζει τα σηµεία και θα δηµιουργεί ένα 2d-tree κάνοντας διαδοχικές εισαγωγές. Αν υπάρχει οποιαδήποτε ασυνέπεια στην είσοδο θα πρέπει να τερµατίζετε το πρόγραµµα και να τυπώνετε το αντίστοιχο µήνυµα λάθους (π.χ. αν κάποια συντεταγµένη υπερβαίνει το 100 ή αν κάποιο σηµείο επαναλαµβάνεται). Στη συνέχεια η main θα εκτελεί έναν ατέρµονα βρόχο όπου θα ρωτάει το χρήστη αν θέλει να δώσει ένα query rectangle ή ένα query point ή απλώς να τερµατίσει το πρόγραµµα. Αν ο χρήστης δώσει ένα query rectangle, θα πρέπει να βρείτε τα σηµεία του δέντρου που περιέχονται µέσα στο δοσµένο παραλληλόγραµµο (rangesearch) και να τα τυπώσετε. Το παραλληλόγραµµο µπορεί να δίνεται από το χρήστη στη µορφή: 20 30 40 80 Αυτό θα αντιστοιχεί στο παραλληλόγραµµο [20, 30] x [40, 80]. Αν ο χρήστης δώσει ένα query point, π.χ. στη µορφή: 34 76 θα πρέπει να τρέξετε τη µέθοδο nearestneighbor και να τυπώσετε το σηµείο του δέντρου που βρίσκεται πιο κοντά στο δοσµένο σηµείο καθώς και την απόσταση. ΠΡΟΣΟΧΗ: Όταν συγκρίνετε Ευκλείδιες αποστάσεις, ο υπολογισµός της τετραγωνικής ρίζας ενδέχεται να κόψει µερικά απο τα δεκαδικά ψηφία. Είναι προτιµότερο να χρησιµοποιείτε το τετράγωνο της απόστασης για τη σύγκριση. Παραδοτέα: Για την εργασία θα υποβάλετε τα εξής αρχεία: 1) Point.java, o ΑΤΔ για σηµεία. 2) Rectangle.java, ο ΑΤΔ για παραλληλόγραµµα. 3) TwoDTree.java, o ΑΤΔ για 2d-trees που περιέχει και τη main. 4) Μία σύντοµη αναφορά σε pdf αρχείο µε όνοµα project3-report.pdf, στην οποία θα αναφέρετε τα µέλη της οµάδας σας και θα περιγράψετε συνοπτικά την υλοποίησή σας (2-5 σελίδες).

5) Ό,τι άλλο αρχείο χρειαστείτε, αν π.χ. χρησιµοποιήσετε κάποια λίστα ή κάτι άλλο που έχετε δει στο εργαστήριο. Ως συνήθως δεν επιτρέπονται έτοιµες δοµές της Java. Όλα τα παραπάνω αρχεία θα πρέπει να µπουν σε ένα αρχείο zip. Το όνοµα που θα δώσετε στο αρχείο αυτό θα είναι ο αριθµός µητρώου σας πχ. 3030056_3030066.zip ή 3030056.zip (αν δεν είστε σε οµάδα). Στη συνέχεια, θα υποβάλλετε το zip αρχείο σας στην περιοχή του µαθήµατος «Εργασίες» στο e-class. Η προθεσµία παράδοσης της εργασίας είναι Κυριακή, 22 Ιανουαρίου 2017 και ώρα 23:59. Hints για την υλοποίηση των rangesearch και nearestneighbor: Το κύριο πλεονέκτηµα των 2d-trees είναι ότι κάνουν πιο αποδοτική την υλοποίηση τέτοιων µεθόδων αναζήτησης. Καταρχήν παρατηρήστε ότι κάθε κόµβος σε ένα 2d-tree ουσιαστικά αντιστοιχεί σε ένα παραλληλόγραµµο, που περιέχει όλα τα σηµεία που βρισκονται στα 2 υποδέντρα του. Η ρίζα αντιστοιχεί στο παραλληλόγραµµο [0, 100] x [0,100]. Στο παράδειγµα πιο πάνω, το αριστερό παιδί της ρίζας αντιστοιχεί στο παραλληλόγραµµο [0, 70] x [0, 100], δηλαδή στα σηµεία που έχουν µικρότερη ή ίση x-συντεταγµένη από αυτή της ρίζας (δείτε το σχήµα πιο πάνω). Το δεξί παιδί της ρίζας αντιστοιχεί στο παραλληλόγραµµο [70, 100] x [0, 100]. Στη συνέχεια το αριστερό παιδί του κόµβου (50, 40) αντιστοιχεί στο παραλληλόγραµµο [0, 70] x [0, 40], χρησιµοποιούµε δηλαδή την y-συντεταγµένη σε αυτό το επίπεδο. Και συνεχίζουµε µε αυτόν τον τρόπο εναλλάξ µέχρι τα φύλλα. Range Search. Για να βρείτε όλα τα σηµεία που περιέχονται σε ένα παραλληλόγραµµο που δίνει ο χρήστης, ξεκινήστε από τη ρίζα και αναδροµικά ψάξτε στα 2 υποδέντρα µε τον εξής κανόνα: αν το παραλληλόγραµµο που έδωσε ο χρήστης δεν έχει κανένα κοινό σηµείο µε το παραλληλόγραµµο στο οποίο αντιστοιχεί κάποιος κόµβος (έτσι όπως το περιγράψαµε παραπάνω), τότε δεν χρειάζεται να ψάξετε αυτόν τον κόµβο ούτε και τα υποδέντρα του. Η αναδροµή συνεχίζεται µόνο εάν υπάρχει κάποια πιθανότητα το υποδέντρο να περιέχει σηµεία που ανήκουν στο παραλληλόγραµµο. Τέτοιες υλοποιήσεις επιταχύνουν σε µεγάλο βαθµό την εκτέλεση, καθώς ψάχνουν µόνο στα κοµµάτια του δέντρου που χρειάζεται. Για την υλοποίηση θα σας είναι χρήσιµη η µέθοδος intersects της κλάσης Rectangle. Nearest neighbor search. Για να βρείτε το πιο κοντινό σηµείο σε ένα σηµείο p που δίνει ο χρήστης, ξεκινήστε πάλι από τη ρίζα και αναδροµικά ψάξτε στα υποδέντρα µε τον εξής κανόνα: αν το τρέχον κοντινότερο σηµείο που έχετε βρει µέχρι εκείνη τη στιγµή έχει απόσταση από το p αυστηρά µικρότερη από την απόσταση του p από το παραλληλόγραµµο στο οποίο αντιστοιχεί κάποιος κόµβος (µε χρήση της distanceto από τη Rectangle) τότε πάλι δεν χρειάζεται να ψάξετε αυτόν τον κόµβο και τα υποδέντρα του. Για debugging, µπορείτε να έχετε µία µέθοδο που να τυπώνει τους κόµβους του δέντρου ανά επίπεδο (σαν τη διάσχιση level order που είδαµε στο µάθηµα). Δεν χρειάζεται να υπάρχει στα παραδοτέα, απλώς για δική σας διευκόλυνση.