Απλές Δοµές Δεδοµένων
Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλήµατος του ευσταθούς ταιριάσµατος
Βασικές Έννοιες Δοµών Δεδοµένων 3
Βασικές Έννοιες Δοµών Δεδοµένων Πρωτογενείς Τύποι Δεδοµένων Αντικείµενα Πίνακες (Arrays) και Λίστες (Lists) Στοίβες (stacks) ή ουρές LIFO Ουρές FIFO
Πρωτογενείς Τύποι Δεδοµένων Λογική µεταβλητή: boolean µε τιµή αληθής (true) ή ψευδής (false) Ακέραια µεταβλητή: int Μεταβλητή κινητής υποδιαστολής: float, double Μεταβλητή Χαρακτήρας: char 5
Πρωτογενείς Τύποι Δεδοµένων της Java Λέξη Κλειδί Περιγραφή Μέγεθος/Μορφή (Ακέραιοι) byte ακέραιος µεγέθους ενός byte 8-bit two's complement short µικρός (short) ακέραιος 16-bit two's complement int ακέραιος 32-bit two's complement long µεγάλος (long) ακέραιος 64-bit two's complement (Πραγµατικοί) float Απλής ακρίβειας αριθ. κιν. υποδιαστ. 32-bit IEEE 754 double ιπλής ακρίβειας αριθ. κιν. υποδιαστ. 64-bit IEEE 754 (Άλλοι Τύποι) char Ένας χαρακτήρας 16-bit Unicode character boolean Μια boolean τιµή (true ή false) true ή false 6
Αντικείµενα 7
Ένα αντικείµενο µιας υποτιθέµενης κλάσης Point Η δυναµική δηµιουργία αντικειµένων γίνεται µε τον τελεστή new Point origin_one = new Point( 23, 94); Ο τελεστής new δεσµεύει την απαιτούµενη µνήµη για τη δηµιουργία του αντικειµένου και καλεί τον CONSTRUCTOR. Ο τελεστής new επιστρέφει την αναφορά στο νέο αντικείµενο. Το αποτέλεσµα: Μία µεταβλητή αναφορά µε όνοµα origin_one σε αντικείµενο τύπου Point. Ένα αντικείµενο τύπου Point µε τιµές 23 και 94 για τις δύο πρωτογενείς µεταβλητές που περιέχει. 8
Αλφαριθµητικά και Πίνακες Στη Java για αλφαριθµητικές τιµές (strings) χρησιµοποιείται η κλάση. Στη Java τα String είναι αντικείµενα (και όχι πρωτογενείς τύποι). Εποµένως, ποιο θα είναι το αποτέλεσµα της εντολής: String hello = new String( Hello World! ); Επίσης, οι πίνακες είναι αντικείµενα στη Java. Εποµένως, στη Java τα αλφαριθµητικά και οι πίνακες είναι αντικείµενα. 9
Πίνακας (Array) Μια ακολουθία αντικειµένων του ιδίου τύπου Συνήθως περιλαµβάνει ένα προκαθορισµένο πλήθος στοιχείων Είναι µια στοιχειώδης Δοµή Δεδοµένων 10
Παραδείγµατα Πινάκων Πίνακας Διαστάσεων 1x6 µε αριθµούς κινητής υποδιαστολής: 2,45 0,15 3,20 15,85 6,33 2,67 Πίνακας Διαστάσεων 3x4 µε χαρακτήρες: a f e u b r d s k w r t 11
Πράξεις σε Πίνακες Προσπέλαση στοιχείου: Σε σταθερό χρόνο Ο(1) µπορούµε να διαβάσουµε το περιεχόµενο οποιασδήποτε θέσης του πίνακα (εφόσον µας δίνεται ο αύξων αριθµός του στοιχείου, πχ. το 12ο στοιχείο) Τροποποίηση στοιχείου: Σε Ο(1) όπως και η προσπέλαση Εισαγωγή/Διαγραφή στοιχείου: Μπορεί να απαιτήσει χρόνο έως και Ο(Ν) εάν πρέπει να µετακινηθούν στοιχεία του πίνακα ή να τροποποιηθεί το µέγεθος του πίνακα 12
Πίνακες στην Java // ορισµός µιας αναφοράς σε πίνακα ακεραίων int [] A; // ηµιουργία ενός αντικειµένου-πίνακα ακεραίων // µε 10 ακέραιους και καταχώρηση της διεύθυνσής // του πίνακα στην αναφορά A A = new int[10]; // Η παραπάνω διαδικασία σε µία γραµµή int [] B = new int[15]; 13
Λίστα (List) Με τη δοµή δεδοµένων λίστα εννοούµε γραµµικές ακολουθίες οποιονδήποτε αντικειµένων Κάθε στοιχείο της λίστας έχει ένα δείκτη (ή µια αναφορά) στο επόµενο στοιχείο της λίστας (διασυνδεδεµένη λίστα) ή έχει ένα δείκτη προς το επόµενο και ένα δείκτη προς το προηγούµενο στοιχείο (διπλά διασυνδεδεµένη λίστα) Δεν υποστηρίζεται η κατευθείαν προσπέλαση τυχαίων θέσεων της λίστας Οι θέσεις µνήµης στις οποίες αποθηκεύονται τα στοιχεία της λίστας δεν αντιστοιχούν απαραίτητα στη σειρά που έχουν τα στοιχεία µέσα στη λίστα 14
Παράδειγµα Λίστας Μια λίστα µε 4 στοιχεία: 8 5 12 9 Μια πιθανή υλοποίηση της παραπάνω λίστας µέσα σε ένα πίνακα: 8 9 12 5 Δοµές Δεδοµένων 15
Πράξεις σε Λίστα Εύρεση ενός στοιχείου: Εάν µας δίνεται ο αύξων αριθµός του στοιχείου, πχ. το 12ο στοιχείο, τότε απαιτείται να διατρέξουµε τη λίστα µέχρι να φτάσουµε στο στοιχείο: χρόνος Ο(Ν) Προσπέλαση/τροποποίηση στοιχείου: Σε σταθερό χρόνο Ο(1) εάν έχουµε αναφορά προς το στοιχείο Εισαγωγή/διαγραφή στοιχείου: Σε χρόνο Ο(1) εάν γίνει στην αρχή της λίστας στο τέλος της λίστας (διπλή λίστα) σε σηµείο της λίστας για το οποίο µας δίνεται αναφορά σε γειτονικό στοιχείο 16
κώδικας Java για µια λίστα ακεραίων Οι κλάσεις: µια κλάση ListNode για τους κόµβους της λίστας µια κλάση LinkedList για την ίδια τη λίστα public class ListNode { public ListNode next; public ListNode prev; public int data; } public ListNode(int pardata) { } data = pardata; 17
κλάση LinkedList public class LinkedList { private ListNode head; private ListNode tail; } public LinkedList() { head = null; tail = null; } public boolean isempty() { //... return true; } public void add(int index, int data) { //... } public void addfirst(int data) { //... } public void addlast(int data) { //... } public int countnodes() { int num = 0; //... return num; } public int remove(int index) { //... return -1; } public int removefirst() { //... return -1; } 18
παράδειγµα χρήσης της λίστας public class ListDemo { } public static void main(string[] args) { } LinkedList list = new LinkedList(); System.out.println("List empty? : " + list.isempty()); list.addfirst(10); list.addfirst(2); list.addfirst(8); System.out.println("List empty? : " + list.isempty()); 19
Ουρές 20
Στοίβα (Stack) Στοίβα: Είναι µια ουρά LIFO (Last In First Out) Βασικές Πράξεις: push: εισαγωγή στοιχείου στην κορυφή της λίστας σε χρόνο Ο(1) pop: αφαίρεση του κορυφαίου στοιχείου από τη στοίβα σε χρόνο Ο(1) 21
Παράδειγµα Στοίβας 2 9 4 22
Ουρά FIFO Ουρά FIFO (First In First Out) Βασικές Πράξεις: Εισαγωγή στοιχείου στο τέλος της ουράς Αφαίρεση στοιχείου από την αρχή της ουράς Και οι δύο πράξεις µπορούν να υλοποιηθούν σε Ο(1) χρόνο 23
Παράδειγµα Ουράς 3 9 4 24
Γραφήµατα 25
Γράφηµα (Graph) Γράφηµα ή Γράφος : Αποτελείται από ένα σύνολο από κόµβους ένα σύνολο από ακµές µεταξύ ζευγών κορυφών Θα εξετάσουµε τα γραφήµατα και αλγόριθµους γραφηµάτων πιο αναλυτικά παρακάτω στην ύλη 26
Παράδειγµα Γραφήµατος 27
Ένα µη-κατευθυνόµενο γράφηµα Μη-κατευθυνόµενο γράφηµα. G = (V, E) V = κόµβοι. E = ακµές µεταξύ ζευγών κόµβων. Κάθε ακµή αναπαριστά τη διµερή σχέση µεταξύ αντικειµένων. Παράµετροι µεγέθους του γραφήµατος: n = V, m = E. V = { 1, 2, 3, 4, 5, 6, 7, 8 } E = { 1-2, 1-3, 2-3, 2-4, 2-5, 3-5, 3-7, 3-8, 4-5, 5-6 } n = 8 m = 11 28
Δέντρο Δέντρο: Απλό συνδεδεµένο άκυκλο γράφηµα 29
Παράδειγµα Δυαδικού Δέντρου 9 5 12 2 7 10 15 30
Εγγραφές (Records) 31
Εγγραφές (record ή struct) Κώστας Παπαδόπουλος ιεύθυνση Πραξιτέλους 25, Ξάνθη Ονοµατεπώνυµο Ηλικία Τηλέφωνο 28 25410-12345 Παράδειγµα (Java) class Employee { String Name; String Address; int Age; String Telephone; } Δοµές Δεδοµένων 32
Υλοποίηση αλγορίθµου Gale-Shapley 33
Αλγόριθµος Propose-And-Reject Ο αλγόριθµος των Gale-Shapley για το ευσταθές ταίριασµα που είδαµε σε προηγούµενο µάθηµα. Αλγόριθµος Propose-and-Reject. [Gale-Shapley 1962] Μια µέθοδος που βρίσκει ένα ευσταθές ταίριασµα. Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to whom m has not yet proposed if (w is free) assign m and w to be engaged else if (w prefers m to her fiancé m') assign m and w to be engaged, and m' to be free else w rejects m } 34
Πλήθος επαναλήψεων του αλγορίθµου Gale-Shapley Ο αλγόριθµος των Gale-Shapley εκτελεί συνεχώς την ακόλουθη ενέργεια: Επιλέγεται ένας µη-δεσµευµένος άντρας (εάν όλοι οι άντρες είναι δεσµευµένοι ο αλγόριθµος τερµατίζει) Από τις γυναίκες στις οποίες δεν έχει προτείνει ακόµα ο άντρας αυτός, επιλέγει και προτείνει σε αυτή µε την υψηλότερη προτίµηση Μπορούµε να υπολογίσουµε ένα άνω όριο στο πλήθος των επαναλήψεων που εκτελεί ο αλγόριθµος στη χειρότερη περίπτωση; Πόσο χρόνο απαιτεί η εκτέλεση κάθε επανάληψης στη χειρότερη περίπτωση και πόσο χρόνο χρειάζεται συνολικά η εκτέλεση του αλγορίθµου στη χειρότερη περίπτωση; 35
Υλοποίηση αλγορίθµου Gale-Shapley Πλήθος επαναλήψεων που εκτελεί ο αλγόριθµος Gale- Shapley Τι δοµές δεδοµένων να χρησιµοποιήσουµε για την αποθήκευση των προτιµήσεων των αντρών; Τι δοµές δεδοµένων να χρησιµοποιήσουµε για την αποθήκευση των προτιµήσεων των γυναικών; Ποια η πολυπλοκότητα χρόνου κάθε επανάληψης;
πηγές/αναφορές Κεφάλαιο 2, Σχεδίαση Αλγορίθµων, J. Kleinberg and E. Tardos, Ελληνική έκδοση από τις Εκδ. Κλειδάριθµος Κεφάλαιο 3, Εισαγωγή στους αλγόριθµους, T. Cormen, C. Leiserson, R. Rivest and C. Stein, Ελληνική έκδοση από τις Πανεπιστηµιακές Εκδ. Κρήτης 37