Ανάλυση. Ο εσωτερικός ϐρόχος εκτελείται i + 1 ϕορές, για i = 0,..., n 1.

Σχετικά έγγραφα
Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

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

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

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

Στοιχεία Αλγορίθµων και Πολυπλοκότητας

Σύνοψη Προηγούµενου (2/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Πρόβληµα: Κατασκευή Οµοιόµορφα Τυχαίας Μετάθεσης.

Ταξινόμηση: Εισαγωγικά. Ταξινόμηση (Sor ng) Αλγόριθμοι Απλής Ταξινόμησης. Βασικά Βήματα των Αλγορίθμων

Ουρές Προτεραιότητας: Υπενθύμιση. Σωροί / Αναδρομή / Ταξινόμηση. Υλοποίηση Σωρού. Σωρός (Εισαγωγή) Ορέστης Τελέλης

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

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

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

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Κλάσεις και Αντικείµενα

Ορισµός. Εστω συναρτήσεις: f : N R και g : N R. η f(n) είναι fi( g(n) ) αν υπάρχουν σταθερές C 1, C 2 και n 0, τέτοιες ώστε:

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

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

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

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

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

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

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

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

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

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

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

ΗΥ-150. Ταξινόµηση και Αναζήτηση

Διάλεξη 04: Παραδείγματα Ανάλυσης

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

Εισαγωγή στους Αλγόριθµους. Αλγόριθµοι. Ιστορικά Στοιχεία. Ο πρώτος Αλγόριθµος. Παραδείγµατα Αλγορίθµων. Τι είναι Αλγόριθµος

Αλγόριθμοι Ταξινόμησης Μέρος 2

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

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

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

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

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

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

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

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

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

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

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

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

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

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

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

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

Σημειώσεις δεύτερης εβδομάδας

Βασικάχαρακτηριστικάτηςγλώσσας. Πίνακες, Έλεγχος Ροής και Βρόχοι

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

Αλγόριθμοι Ταξινόμησης Μέρος 1

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

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

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

Δοµές Δεδοµένων. 8η Διάλεξη: Ταξινόµηση. Ε. Μαρκάκης

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

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

Στοιχειώδεις Δομές Δεδομένων

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

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

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

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

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

Βασικά της γλώσσας JAVA

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

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

Σύνοψη Προηγούµενου. Κανονικές Γλώσσες (1) Προβλήµατα και Γλώσσες. Σε αυτό το µάθηµα. ιαδικαστικά του Μαθήµατος.

Προγραµµατισµός 1 Ταξινόµηση - Αναζήτηση

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

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

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

Ανάλυση Αλγορίθµων 4. Πειραµατικές Μελέτες. Χρόνος Εκτέλεσης. Περιγραφή και Υλικό Ανάγνωσης

Πίνακες (Μια παλιά άσκηση) Πίνακες Κατακερματισμού (Hash Tables) Πίνακες (Μια παλιά άσκηση) Εισαγωγή. A n

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

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

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

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

Transcript:

Σύνοψη Προηγούµενου Πίνακες Arrays Ορέστης Τελέλης telelis@unipi.gr Τµήµα Ψηφιακών Συστηµάτων, Πανεπιστήµιο Πειραιώς Πληροφορίες Μαθήµατος. ιαδικαστικά ϑέµατα. Αντικείµενο Μαθήµατος. Αντικειµενοστρεφής Προγραµµατισµός. Αντικείµενα, Κλάσεις, Μέθοδοι, Μεταβλητές. Κληρονοµικότητα, Πολυµορφισµός. Ανάλυση Χρόνου Αλγορίθµων. Πειραµατική Ανάλυση. Πολυπλοκότητα Ασυµπτωτική Ανάλυση. Τελέλης οµές εδοµένων 1 / 48 Τελέλης οµές εδοµένων 2 / 48 Παράδειγµα 5 Ανάλυση Αλγόριθµος υπολογισµού προθεµατικών µέσων Είσοδος: πίνακας n αριθµητικών στοιχείων. Εξοδος: πίνακας n αριθµών όπου ο A[i] είναι ο µέσος όρος των X[0],..., X[i]. Ο εξωτερικός ϐρόχος εκτελείται n ϕορές για i = 0,..., n 1. Εντός του και εκτός του εσωτερικού: O1 στοιχειώδες πράξεις. for int i = 0; i < n; i++ { int a = 0; for int j = 0; j <= i; j++ { a = a + X[j]; A[i] = a/i+1; return A; Ο εσωτερικός ϐρόχος εκτελείται i + 1 ϕορές, για i = 0,..., n 1. Αρα, ο εσωτερικός εκτελείται το πολύ n ϕορές, για i = 0,..., n 1. Εντός του εωτερικού ϐρόχου συµβαίνουν O1 στοιχειώδεις πράξεις. Συνολικά: n O1 + n O1 = On 2. Στοιχειώδεις πράξεις: πρόσθεση, διαίρεση, ανάθεση τιµής, ανάγνωση τιµής. Τελέλης οµές εδοµένων 3 / 48 Τελέλης οµές εδοµένων 4 / 48

Παράδειγµα 6 Σηµερινό Μάθηµα Βελτιωµένος Αλγόριθµος υπολογισµού προθεµατικών µέσων Είσοδος: πίνακας n αριθµητικών στοιχείων. Εξοδος: πίνακας n αριθµών όπου ο A[i] είναι ο µέσος όρος των X[0],..., X[i]. int s = 0; forint i = 0; i < n; i++ { s = s + X[i]; A[i] = s/i+1; return A; Πίνακες Arrays. Προβλήµατα σε Πίνακες και Εφαρµογές. Πολυπλοκότητα: On, βέλτιστη! Τελέλης οµές εδοµένων 5 / 48 Τελέλης οµές εδοµένων 6 / 48 Πίνακες Arrays ιαδεδοµένη δοµή αποθήκευσης δεδοµένων ίδιου τύπου. Αποθήκευση δεδοµένων σε συνεχόµενες θέσεις στη µνήµη. Προσπέλαση δεδοµένων µε ϐάση τη ϑέση τους στη µνήµη. Το i-οστό στοιχείο του πίνακα A προσπελαύνεται µε A[i] ισδιάστατος Πίνακας m n είναι ένας πίνακας µε m γραµµές και n στήλες. Τα m και n αντιστοιχούν στις δύο διαστάσεις του πίνακα. Ανάλογα µε τις ανάγκες/απαιτήσεις µπορεί να χρησιµοποιούνται πολυδιάστατοι πίνακες. Πίνακες Arrays: Βασικές Λειτουργίες Εισαγωγή: Απλή, π.χ., arr[10] = 77; Κρατείται ξεχωριστά το πλήθος των στοιχείων που έχουν εισαχθεί. Αναζήτηση: Π.χ., του στοιχείου µε τιµή 77. ιατρέχουµε τον πίνακα: από την αρχή, έως ότου εντοπίσουµε τη ϑέση όπου είναι αποθηκευµένο το 77. ιαγραφή Αρχικά γίνεται Αναζήτηση του στοιχείου προς διαγραφή. Επειτα, µετακινούνται όλα τα στοιχεία που ϐρίσκονται σε µεγαλύτερες ϑέσεις κατά µία ϑέση προς τα αριστερά. εν είναι επιθυµητό να υπάρχουν κενές ϑέσεις στον πίνακα είναι όµως δυνατό να υλοποιηθεί και µε αυτό τον τρόπο. Τελέλης οµές εδοµένων 7 / 48 Τελέλης οµές εδοµένων 8 / 48

Εισαγωγή Στοιχείου Αναζήτηση Στοιχείου Εστω πίνακας A χωρητικότητας 10 ϑέσεων Ενα νέο στοιχείο εισάγεται στο πρώτο κενό κελί Κρατάµε κάπου ξεχωριστά το τρέχον πλήθος των στοιχείων του πίνακα. Η αναζήτηση στοιχείου γίνεται µε ϐάση την τιµή του στοιχείου, έστω το 58. ιατρέχουµε τον πίνακα κελί-κελί από την πρώτη ϑέση µέχρι την τελευταία ϑέση στην οποία υπάρχει αποθηκευµένο στοιχείο. Εισαγωγή στοιχείου 37 στη ϑέση 0: a[0] = 37. Εισαγωγή στοιχείου 22 στη ϑέση 1: a[1] = 22. Εισαγωγή στοιχείου 99 στη ϑέση 2: a[2] = 99. Εάν συναντήσουµε το 58, σταµατάµε επιτυχής αναζήτηση. Μπορεί να µην το συναντήσουµε αποτυχηµένη αναζήτηση. Η εισαγωγή γίνεται σε σταθερό χρόνο O1. Η αναζήτηση εξετάζει στη χειρότερη περίπτωση όλα τα n στοιχεία = πολυπλοκότητα On. 0 1 2 3 4 5 6 7 8 9 37 22 99 0 1 2 3 4 5 6 7 8 9 37 22 99 42 11 58 67 71 Τελέλης οµές εδοµένων 9 / 48 Τελέλης οµές εδοµένων 10 / 48 ιαγραφή Στοιχείου Το Ζήτηµα των ιπλών Εγγραφών Η διαγραφή ενός στοιχείου απαιτεί πρώτα τον εντοπισµό του. Αφού εντοπιστεί το στοιχείο και διαγραφεί, όλα τα επόµενά του µεταφέρονται µία ϑέση κάτω, ώστε να καλυφθεί το κενό. Πολυπλοκότητα On, διότι: Κατά τη σχεδίαση δοµών δεδοµένων προαποφασίζουµε αν επιτρέπονται καταχωρήσεις διπλών εγγραφών = δύο στοιχείων µε ίδια τιµή. Οι διπλοεγγραφές περιπλέκουν την Αναζήτηση και τη ιαγραφή. Αναζήτηση χρόνου On. Είτε εύρεση διαγραφή όλων των στοιχείων µε τιµή X. Μετακίνηση On στοιχείων. Είτε τερµατισµός µετά την εύρεση διαγραφή του πρώτου. 0 1 2 3 4 5 6 7 8 9 37 22 99 42 11 58 67 71 27 16 0 1 2 3 4 5 6 7 8 9 37 22 99 42 11 67 71 27 16 Η Εισαγωγή δεν αλλάζει, όµως: αν δεν επιτρέπονται διπλοεγγραφές, τότε πρέπει ο αλγόριθµος Εισαγωγής να ελέγχει κάθε υπάρχον στοιχείο πριν την εισαγωγή. Τελέλης οµές εδοµένων 11 / 48 Τελέλης οµές εδοµένων 12 / 48

Πίνακες στη Java: ηµιουργία Πίνακα Πίνακες στη Java: Προσπέλαση Στοιχείων Πίνακα Με χρήση του τελεστή new. int[] intarray; // Define a reference to the array. intarray = new int[100] // Creates the array. Τα στοιχεία ενός πίνακα προσπελαύνονται µε δείκτη µέσα σε αγκύλες. tmp = intarray[3]; // Place content of the 4th cell in tmp. intarray[7] = 66; // Store 66 in the 8th cell. int[] intarray = new int[100]; // Can do both at once Εύρεση µεγέθους πίνακα µε χρήση του πεδίου length. int arraylength = intarray.length; Το πρώτο στοιχείο ενός πίνακα δεικτοδοτείται µε 0, όχι µε 1. Χρήση δείκτη < 0 ή µεγαλύτερού του µήκους του πίνακα µείον 1: java.lang.arrayindexoutofboundsexception Τελέλης οµές εδοµένων 13 / 48 Τελέλης οµές εδοµένων 14 / 48 Πίνακες στη Java: Αρχικοποίηση Μερικά Παραδείγµατα Ενας πίνακας ακεραίων αρχικοποιείται µε το 0 όταν δηµιουργείται. Αυτό µπορείτε να το αλλάξετε µε τον εξής τρόπο: int[] intarray = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27; Ενας πίνακας αντικειµένων περιέχει στοιχεία null, ώσπου αυτά να πάρουν τιµές AutoData[] cararray = new AutoData[4000]; int[] x, y, z; String[] a; x = new int[3]; y = x; a = new String[3]; x[1] = 2; y[1] = 3; a[1] = "Hello"; int[] q; q = new int[] {1, 2, 3; // Short form for declarations: int[] r = {7, 8, 9; Τελέλης οµές εδοµένων 15 / 48 Τελέλης οµές εδοµένων 16 / 48

Μια εφαρµογή Πινάκων class ArrayApp { public static void mainstring[] args { long[] arr; arr = new long[100]; int nelems = 0; int j; long searchkey; // reference to array // make array // number of items // loop counter // key of items to search for -- arr[0] = 77; arr[1] = 99; arr[2] = 44; arr[3] = 55; arr[4] = 22; arr[5] = 88; arr[6] = 11; arr[7] = 00; arr[8] = 66; arr[9] = 33; nelems = 10;......... Τελέλης οµές εδοµένων 17 / 48 -- forj = 0; j < nelems; j++ // display items System.out.printarr[j] + " "; System.out.println""; -- searchkey = 66; // find item with key 66 forj = 0; j < nelems; j++ // for each element, if arr[j] == searchkey break; // found item? if j == nelems System.out.println"Can t find" + searchkey; else System.out.println"Found " + searchkey; -- searchkey = 55; // delete item with key 55 forj = 0; j < nelems; j++ // look for it first if arr[j] == searchkey break; forint k = j; k < nelems; k++ // shift elements arr[k] = arr[k+1]; nelems--; End of ArrayApp class // decrement size Τελέλης οµές εδοµένων 18 / 48 Καλύτερη Οργάνωση του Προγράµµατος σε Κλάσεις Ενσωµάτωση του πίνακα σε µία κλάση. Η κλάση αυτή ϑα παρέχει µια διεπαφή µεθόδων υψηλού επιπέδου: insertint elem findint elem class HighArray { private long[] a; private int nelems; // reference to array, a // number of data items public HighArrayint max { a = new long[max]; nelems = 0; deleteint elem ε χρειάζεται ο χρήστης να ασχολείται µε το δείκτη του πίνακα. Αρα, ο χρήστης επικεντρώνεται στο τι όχι στο πώς πρόκειται να εισαχθεί, διαγραφεί και αναζητηθεί. public boolean findlong searchkey { int j; forj = 0; j < nelems; j++ if a[j] == searchkey break; if j == nelems return false; else return true; Τελέλης οµές εδοµένων 19 / 48 Τελέλης οµές εδοµένων 20 / 48

public void insertlong value { a[nelems] = value; nelems++; public boolean deletelong value { int j; forj = 0; j < nelems; j++ if value == a[j] break; if j == nelems return false; else { forint k = j; k < nelems; k++ a[k] = a[k+1]; nelems--; return true; public void display { forint j = 0; j < nelems; j++ System.out.printa[j] + " "; System.out.println""; // End of HighArray class Τελέλης οµές εδοµένων 21 / 48 class HighArrayApp { public static void mainstring[] args { int maxsize = 100; HighArray arr = new HighArraymaxSize; arr.insert77; arr.insert99; arr.insert44; arr.insert55; arr.insert22; arr.insert88; arr.insert11; arr.insert00; arr.insert66; arr.insert33; arr.display; Τελέλης οµές εδοµένων 22 / 48 int searchkey = 35; if arr.findsearchkey System.out.println"Found " + searchkey; else System.out.println"Can t find " + searchkey; arr.delete00; arr.delete55; arr.delete99; Ταξινοµηµένοι Πίνακες arr.display; // End of HighArrayApp class Τελέλης οµές εδοµένων 23 / 48 Τελέλης οµές εδοµένων 24 / 48

Ταξινοµηµένοι Πίνακες Γραµµική Αναζήτηση Ενας πίνακας στον οποίο τα δεδοµένα διευθετούνται σε αύξουσα σειρά κλειδιού ή και ϕθίνουσα. Η µικρότερη τιµή κλειδιού ϐρίσκεται στο κελί µε δείκτη 0. Κάθε κελί περιέχει τιµή µεγαλύτερη από το προηγούµενο κελί. 0 1 2 3 4 5 6 7 8 9 11 22 37 42 58 67 71 83 Πώς γίνεται η αναζήτηση σε έναν ταξινοµηµένο πίνακα; Μπορώ να εφαρµόσω την αναζήτηση όπως ακριβώς στην περίπτωση του µη ταξινοµηµένου πίνακα. ιατρέχω τον πίνακα κελί-κελί από την πρώτη ϑέση µέχρι την τελευταία ϑέση στην οποία υπάρχει αποθηκευµένο στοιχείο. Εάν συναντήσουµε το 58, σταµατάµε επιτυχής αναζήτηση. Μπορεί να µην το συναντήσουµε αποτυχηµένη αναζήτηση. Λέγεται και «γραµµική αναζήτηση» και έχει πολυπλοκότητα On, όπου n το πλήθος στοιχείων του πίνακα. Ποτέ δεν εκτελώ γραµµική αναζήτηση σε ταξινοµηµένο πίνακα. ιότι υπάρχει πιο αποδοτική µέθοδος αναζήτησης δυαδική αναζήτηση. Τελέλης οµές εδοµένων 25 / 48 Τελέλης οµές εδοµένων 26 / 48 υαδική Αναζήτηση Παράδειγµα υαδικής Αναζήτησης Εφαρµόσιµη µόνο σε ταξινοµηµένους πίνακες. Πολύ ταχύτερη από τη γραµµική αναζήτηση ειδικά για µεγάλους πίνακες. Πώς λειτουργεί η εύρεση του στοιχείου µε τιµή X; Χωρίζει τον πίνακα στη µέση, σε αριστερό και δεξιό κοµµάτι, ελέγχει το κλειδί M που περιέχεται στο µεσαίο κελί, αν X = M, τότε η αναζήτηση είναι επιτυχής. Αναζήτηση του στοιχείου 71: Είσοδος: 11 22 37 42 58 67 71 83 1η Επανάληψη: 11 22 37 42 58 67 71 83 2η Επανάληψη: 11 22 37 42 58 67 71 83 3η Επανάληψη: 11 22 37 42 58 67 71 83 αν X < M επαναλαµβάνει τη διαδικασία στο αριστερό κοµµάτι, Τερµατισµός: 11 22 37 42 58 67 71 83 αν X > M επαναλαµβάνει τη διαδικασία στο δεξιό κοµµάτι, Τελέλης οµές εδοµένων 27 / 48 Τελέλης οµές εδοµένων 28 / 48

υαδική Αναζήτηση Τυπική Απόδειξη Εστω ταξινοµηµένος πίνακας π.χ., ακεραίων µήκους L0 = n. Σε µια δυαδική αναζήτηση κάθε επανάληψη χωρίζει το εύρος των πιθανών τιµών στη µέση. Σε κάθε ϐήµα, υποδιπλασιάζεται το µέγεθος του πίνακα στο οποίο πρέπει να γίνει η αναζήτηση. Η πολυπλοκότητα της δυαδικής αναζήτησης είναι Olog n. Εκθετικά ταχύτερη από τη γραµµική αναζήτηση που απαιτεί χρόνο On. Εκτελούµε δυαδική αναζήτηση, που διαρκεί k επαναληπτικά ϐήµατα. Στο i-οστό επαναληπτικό ϐήµα εκτελούµε σταθερό αριθµό στοιχειωδών πράξεων: O1 σύγκρισεις του στοιχείου προς αναζήτηση µε τα άκρα δύο υποπινάκων, µήκους Li 1/2. Στο i-οστό ϐήµα εξετάζουµε υποπίνακα µε µήκος Li 1/2: [ ] Li = Li 1/2 = Li 2/2 / 2 = Li 3/2 / 2 / 2 = = n/2 i 1 Ο αλγόριθµος τερµατίζει το πολύ όταν το µήκος του πίνακα που εξετάζουµε σε κάποιο ϐήµα είναι 1: δηλαδή όταν Lk = 1 = n/2 k 1. Τότε: 2 k 1 = n = log2 k 1 = log n = k 1 = log n = k = 1 + log n Τελέλης οµές εδοµένων 29 / 48 Τελέλης οµές εδοµένων 30 / 48 // OrderedArray.java // demonstrates ordered array class // to run this program: C>java OrderedApp class OrderedArray { private long[] a; private int nelems; Υλοποίηση υαδικής Αναζήτησης public int findlong searchkey { int lowerbound = 0; int upperbound = nbelems-1; int curin; public OrderedArrayint max { a = new long[max]; nelems = 0; public int size { return nelems; whiletrue { curin = lowerbound + upperbound / 2; if a[curin] == searchkey return curin; else if lowerbound > upperbound return nelems; else if a[curin] < searchkey lowerbound = curin + 1; else upperbound = curin - 1; Τελέλης οµές εδοµένων 31 / 48 Τελέλης οµές εδοµένων 32 / 48

public void insertlong value { int j; forj = 0; j < nelems; j++ if a[j] > value break; forint k = nelems; k > j; k-- a[k] = a[k-1]; a[j] = value; nelems++; public boolean deletelong value { int j = findvalue; if j == nelems return false; else { forint k = j; k < nelems; k++ a[k] = a[k+1]; nelems--; return true; public void display { forint j = 0; j < nelems; j++ System.out.printa[j] + " "; System.out.println""; // End of OrderedArray class Τελέλης οµές εδοµένων 33 / 48 Τελέλης οµές εδοµένων 34 / 48 class OrderedApp { public static void mainstring[] args { int maxsize = 100; // array size OrderedArray arr = new OrderedArraymaxSize; arr.insert77; arr.insert99; arr.insert44; arr.insert55; arr.insert22; arr.insert88; arr.insert11; arr.insert00; arr.insert66; arr.insert33; Χαρακτηριστικά Ταξινοµηµένων Πινάκων Εκθετικά ταχύτερη αναζήτηση από ότι σε µη ταξινοµηµένο πίνακα. Τίµηµα: ακριβή εισαγωγή, On χρόνου, για τη διατήρηση της ταξινόµησης. Αν a είναι η τιµή του εισαγόµενου κλειδιού, int searchkey = 55; if arr.findsearchkey!= arr.size System.out.println"Found " + searchkey; else System.out.println"Can t find " + searchkey; απαιτείται µετακίνηση κατά µία ϑέση όλων των στοιχείων µε υψηλότερη τιµή κλειδιού, για να δηµιουργηθεί χώρος για το στοιχείο µε τιµή a. arr.display; arr.delete00; arr.delete55; arr.delete99; arr.display; ιαγραφή αργή, On χρόνο σε ταξινοµηµένους ή µη πίνακες. Οι ταξινοµηµένοι πίνακες είναι χρήσιµοι όταν οι αναζητήσεις είναι σηµαντικά συχνότερες από εισαγωγές και διαγραφές. Τελέλης οµές εδοµένων 35 / 48 Τελέλης οµές εδοµένων 36 / 48

Σύνοψη Πολυπλοκότητας Γιατί δε Χρησιµοποιούµε τους Πίνακες για όλα; Αλγόριθµος Χρόνος Εκτέλεσης Γραµµική Αναζήτηση On υαδική Αναζήτηση Olog n Εισαγωγή σε µη ταξινοµηµένο πίνακα O1 Θέµατα απόδοσης. Μη ταξινοµηµένοι πίνακες. Γρήγορη εισαγωγή O1, όµως αργή αναζήτηση ON Ταξινοµηµένοι πίνακες. Γρήγορη αναζήτηση Olog N, όµως αργή εισαγωγή ON Εισαγωγή σε ταξινοµηµένο πίνακα ιαγραφή σε µη ταξινοµηµένο πίνακα ιαγραφή σε ταξινοµηµένο πίνακα On On On Σταθερό µέγεθος πινάκων κατά τη δηµιουργία. Πρέπει να εκτιµήσουµε το πλήθος των στοιχείων που ϑα αποθηκευθούν, πριν τη χρήση του πίνακα. Υπερεκτίµηση µεγέθους = κατανάλωση µνήµης άσκοπα. Υποτίµηση µεγέθους = ο πίνακας δεν µπορεί να καλύψει τις ανάγκες αποθήκευσης στοιχείων. Τελέλης οµές εδοµένων 37 / 48 Τελέλης οµές εδοµένων 38 / 48 Πρόβληµα 1: Αναπαράσταση Υποσυνόλων του {0,..., n 1 Πρόβληµα 1: Αναπαράσταση Υποσυνόλων του {0,..., n 1 Θέλουµε µια οµή εδοµένων για την αποθήκευση οποιυδήποτε υποσυνόλου του {0, 1,..., n 1. Χρησιµοποιούµε πίνακα n δυαδικών στοιχείων µε τιµές true/false Θέλουµε να υποστηρίξουµε τις εξής ϐασικές πράξεις: Εισαγωγή στοιχείου a {0,..., n 1 στο τρέχον υποσύνολο. ιαγραφή στοιχείου a {0,..., n 1 από το τρέχον υποσύνολο. Εισαγωγή του a { 0,..., n 1 : A[a] = true ιαγραφή του a { 0,..., n 1 : A[a] = false χρόνος O1 χρόνος O1 Ερώτηση αν το στοιχείο a {0,..., n 1 ανήκει στο τρέχον υποσύνολο. Αναζήτηση του a { 0,..., n 1 : return A[a]; χρόνος O1 Πόσο αποδοτικά µπορούµε να τις υλοποιήσουµε µε χρήση πίνακα; Τελέλης οµές εδοµένων 39 / 48 Τελέλης οµές εδοµένων 40 / 48

Πρόβληµα 2: Πιο αποδοτικοί πίνακες Πρόβληµα 2: Πιο αποδοτικοί πίνακες Θέλουµε να υλοποιήσουµε την Τυφλή ιαγραφή σε πίνακα: ίνεται απλώς µια ϑέση i του πίνακα και όχι ένα στοιχείο/κλειδί. Απάντηση στην πρώτη ερώτηση: Οχι. ιαγράφουµε το στοιχείο στη ϑέση i ϑέτοντας απλώς A[i] = null. Μπορούµε να έχουµε ταυτόχρονα Εισαγωγή και Τυφλή ιαγραφή σε χρόνο O1 δίχως χρήση επιπλέον δοµής/µνήµης; Με έναν µόνο πίνακα στον οποίο αποθηκεύουµε δεδοµένα και «Τυφλή ιαγραφή», ϑα πρέπει να κάνουµε Αναζήτηση πριν από κάθε Εισαγωγή, για «κενές» ϑέσεις, µε τιµή null. Εποµένως, η Εισαγωγή ϑα έχει πλέον χρόνο χειρότερης περίπτωσης On. Είναι εφικτό εν γένει π.χ., µε χρήση δεύτερου πίνακα; Τελέλης οµές εδοµένων 41 / 48 Τελέλης οµές εδοµένων 42 / 48 Πρόβληµα 2: Πιο αποδοτικοί πίνακες Πρόβληµα 3: Κατασκευή Οµοιόµορφα Τυχαίας Μετάθεσης Απάντηση στη δεύτερη ερώτηση: Ναι! Χρησιµοποιούµε έναν ϐοηθητικό πίνακα ακεραίων, B, και έναν µετρητή last, που αρχικοποιείται στο 0. Υλοποιούµε την «Τυφλή ιαγραφή» στη ϑέση i ως εξής: ίνεται πίνακας A µε n στοιχεία. Ζητείται αλγόριθµος που: έχεται σαν είσοδο τον πίνακα A, A[i] = null; B[last] = i; last++; // O1 time «ανακατεύει» τη σειρά των στοιχείων στον A, ώστε: Υλοποιούµε την Εισαγωγή στοιχείου a ως εξής: A[B[last-1]] = a; last--; // O1 time Και οι δύο πράξεις σε χρόνο χειρότερης περίπτωσης O1. η τελική σειρά να είναι οποιαδήποτε από τις n! µεταθέσεις των στοιχείων, µε πιθανότητα 1 n!. εδοµένο: µπορούµε να επιλέξουµε έναν τυχαίο αριθµό από το {0, 1,..., k 1 µε πιθανότητα 1 k. Τελέλης οµές εδοµένων 43 / 48 Τελέλης οµές εδοµένων 44 / 48

Κατασκευή Οµοιόµορφα Τυχαίας ιάταξης Υλοποίηση σε Java Ενας αλγόριθµος µε ϐέλτιστη πολυπλοκότητα Donald Knuth Knuth Shuffle Algorithm import java.util.random; // Permutes the array "A" uniformly at random. public void shuffleint[] A { Είσοδος: πίνακας A 1. για i = 0,..., n 1 εκτέλεσε: 1.1 επίλεξε µια ϑέση j {i,..., n 1 τυχαία και οµοιόµορφα 1.2 αντάλλαξε τα περιεχόµενα των A[i] και A[j]. 2. επίστρεψε A Πολυπλοκότητα: On. ίνει τυχαία επιλεγµένη µετάθεση των περιεχοµένων του A, µε πιθανότητα 1 n!. Γιατί; Random rndgen = new RandomSystem.currentTimeMillis; forint i = 0; i < A.length; i++ { // Random position in {i, i+1,..., n-1 int pos = i+rndgen.nextinta.length-i; // Swap int tmp = A[i]; A[i] = A[pos]; A[pos] = tmp; Τελέλης οµές εδοµένων 45 / 48 Τελέλης οµές εδοµένων 46 / 48 Ανάλυση Κατασκευής Οµοιόµορφα Τυχαίας Μετάθεσης Ανάλυση Κατασκευής Οµοιόµορφα Τυχαίας Μετάθεσης Η πιθανότητα του A[1] να έχει στην έξοδο την τιµή που παρατηρούµε, είναι Pr A[1] = 1 n. Η πιθανότητα του A[2] να έχει στην έξοδο την τιµή που παρατηρούµε, δεδοµένου του A[1] είναι Pr A[2] A[1] = 1 n 1. Η πιθανότητα του A[3] να έχει στην έξοδο την τιµή που παρατηρούµε, δεδοµένων των A[1], A[2], είναι Pr A[3] A[1] A[2] = 1 n 2................ Η πιθανότητα του A[i] να έχει στην έξοδο την τιµή που παρατηρούµε, δεδοµένων των A[1], A[2],..., A[i 1] είναι: 1 Pr A[i] A[1] A[2] A[i 1] = n i + 1 Η πιθανότητα να δούµε στην έξοδο τη διάταξη A που υποθέσαµε είναι: Pr A = Pr A[1] A[2] A[n] = Pr A[n] A[1] A[2] A[n 1] = Pr A[n] A[1] A[2] A[n 1] Pr A[1] A[2] A[n 2] = n Pr A[i] A[1] A[2] A[i 1] i=1 = 1 1 2 1 3 1 n = 1 n! Pr A[1] A[2] A[n 1] Pr A[n 1] A[1] A[2] A[n 2] Τελέλης οµές εδοµένων 47 / 48 Τελέλης οµές εδοµένων 48 / 48