You are on page 1of 70

Δομές Δεδομένων – Εισαγωγή

Ορέστης Τελέλης
telelis@unipi.gr

Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς

Ο. Τελέλης Δομές Δεδομένων 1 / 70


Γνωριμία

• Διδάσκων:
▶ Ορέστης Τελέλης
▶ e-mail: telelis@unipi.gr

• Ωρες γραφείου (502, Γρ.Λαμπράκη 126):


▶ Πέμπτη 14:00 – 16:00
▶ Παρασκευή 11:30 - 13:30
▶ Και κατόπιν συνεννόησης

• Ημέρα/Ωρα μαθήματος (Επώνυμα από Α – Λ): Πέμπτη 11:15 – 14:00

• Αίθουσα: 002

Ο. Τελέλης Δομές Δεδομένων 2 / 70


Επικοινωνία

• Ιστοσελίδα μαθήματος:
https://aristarchus.ds.unipi.gr/courses/DS-COURSES-SEM113/
• Θέματα και υλικό σχετικά με το μάθημα
▶ ΔΙΑΛΕΞΕΙΣ
▶ ΑΝΑΚΟΙΝΩΣΕΙΣ
▶ ΕΚΦΩΝΗΣΕΙΣ ΕΡΓΑΣΙΩΝ
▶ ΠΑΡΑΔΟΣΗ ΕΡΓΑΣΙΩΝ
▶ ΒΟΗΘΗΤΙΚΟ ΥΛΙΚΟ
▶ …

Εγγραφείτε άμεσα στο μάθημα!

Ο. Τελέλης Δομές Δεδομένων 3 / 70


Βιβλία Μαθήματος

Π. Δ. Μποζάνης (2016): Δομές Δεδομένων, Εκδό-


σεις ΤΖΙΟΛΑ & ΥΙΟΙ, 2η Εκδοση.

Sedgewick R. (2005): Αλγόριθμοι σε Java,Τόμοι 1-4,


3η αμερικάνικη έκδοση (μεταφρασμένο), Εκδόσεις
Κλειδάριθμος.

Λ. Γεωργιάδης, Σ. Νικολόπουλος, Λ. Παληός (2016):


Δομές Δεδομένων. Ελεύθερα διαθέσιμο online:
https://repository.kallipos.gr/handle/11419/6217

Διαβάστε το βιβλίο, οι διαφάνειες δεν αρκούν!


Ο. Τελέλης Δομές Δεδομένων 4 / 70
Επιπλέον Πηγές

T. H. Cormen, C. E. Leiserson, R. Rivest, C. Stein.


Εισαγωγή στους Αλγορίθμους. Τόμος Ι (Μεταφρα-
σμένος). Πανεπιστημιακές Εκδόσεις Κρήτης, 2006.

M. Goodrich, R. Tamassia (2013): Δομές Δεδομένων


και Αλγόριθμοι σε Java, (μεταφρ. Μ. Χατζόπουλος),
Εκδόσεις Δίαυλος.

Ο. Τελέλης Δομές Δεδομένων 5 / 70


Βαθμολόγηση (ίδια σε όλες τις Εξεταστικές Περιόδους)

• Δύο (2) Προγραμματιστικές Εργασίες ( Π1, Π2 ). ( 20% έκαστη )

• Γραπτή Εξέταση ( E ). ( 70% )

Βαθμολόγηση ( Β ):

B0 = 0.7 · Ε + 0.2 · (Π1 + Π2)


{
min{ 10, B0 }, αν Ε ⩾ 4
Τελικός Βαθμός: Β =
min{ 4, B0 }, αν Ε < 4

Αρα: αν Ε < 4, τελικός βαθμός μη προβιβάσιμος (ακόμη και με εργασίες).

ΠΡΟΣΟΧΗ !!!
Οι εργασίες του μαθήματος παραδίδονται ΜΟΝΟ στην περίοδο της
διδασκαλίας του. ΟΧΙ το Σεπτέμβριο (ΟΧΙ τον Ιούνιο, αν υπάρξει εξέταση).
Αν δεν παραδοθούν, ο βαθμός τους εκλαμβάνεται ίσος με 0.
Ο. Τελέλης Δομές Δεδομένων 6 / 70
Εργαστήρια

• Προαιρετικά 3-4
▶ Ενίσχυση κατανόησης δομών και σχετικών αλγορίθμων.
▶ Για την εμπειρία υλοποίησης αλγοριθμικών κατασκευών.
▶ Σας μένει ο κώδικας που θα γράψουμε στα εργαστήρια.

• Τόπος, Χρόνος, Τμήματα/Ομάδες: θα ανακοινωθούν.

• Απευθύνονται κατά προτεραιότητα στους φοιτητές του 2ου Ετους

Ο. Τελέλης Δομές Δεδομένων 7 / 70


Σκοπός Μαθήματος

• Παρουσίαση βασικών δομών δεδομένων.

• Η χρήση τους στην ανάπτυξη προγραμμάτων.

• Υλοποίηση δομών με χρήση της γλώσσας προγραμματισμού Java.

Βασικές γνώσεις της Java θεωρούνται προαπαιτούμενο.

Ο. Τελέλης Δομές Δεδομένων 8 / 70


Περιεχόμενα Μαθήματος

• Ανάλυση Αλγορίθμων. • Δυαδικά Δέντρα Αναζήτησης.


• Πίνακες. • Δέντρα AVL.
• Ουρές και Στοίβες. • Δέντρα Πολλαπλών Δρόμων.
• Συνδεδεμένες Λίστες. • Κοκκινό-μαυρα Δέντρα.
▶ Απλά Συνδεδεμένες.
▶ Διπλά Συνδεδεμένες.
• Δέντρα 234.
▶ Κυκλικά Συνδεδεμένες. • Σωροί/Ουρές Προτεραιότητας.
• Αναδρομή. • Πίνακες Κατακερματισμού.
• Ταξινόμηση. • Γραφήματα.

Ο. Τελέλης Δομές Δεδομένων 9 / 70


Εισαγωγικές Εννοιες

Ο. Τελέλης Δομές Δεδομένων 10 / 70


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

Δομές Δεδομένων
• Διευθέτηση ή οργάνωση δεδομένων στη μνήμη (ή στο δίσκο).
• Πίνακες, Συνδεδεμένες Λίστες, Ουρές, Στοίβες.
• Δυαδικά Δέντρα, Σωροί.
• Πίνακες Κατακερματισμού, Γραφήματα.

Αλγόριθμοι
• Διαδικασίες εκτέλεσης συγκεκριμένης εργασίας.
• Χειρίζονται τα δεδομένα αποθηκευμένα σε δομές.
• Εισάγοντας, Διαγράφοντας, Αναζητώντας, Ταξινομώντας.

Ο. Τελέλης Δομές Δεδομένων 11 / 70


Χρησιμότητα Δομών Δεδομένων

• Αποθήκευση πραγματικών δεδομένων


• Παραδείγματα:
▶ Σύστημα κράτησης εισιτηρίων
▶ Βάση δεδομένων αδειών οδήγησης
▶ …

• Προγραμματιστικά Εργαλεία:
▶ Για τη διεκπεραίωση μιας πιο σύνθετης λειτουργίας
▶ Μοντελοποίηση πραγματικού κόσμου
▶ Παράδειγμα:
- Γραφήματα για αναπαράσταση δρομολογίων αεροπλάνων μεταξύ πόλεων
- Γραφήματα για αναπαράσταση σχέσεων σε ένα κοινωνικό δίκτυο

• Σωστή επιλογή δομής δεδομένων δημιουργεί προϋποθέσεις


σημαντικών βελτιώσεων στην επίδοση ενός προγράμματος.

Ο. Τελέλης Δομές Δεδομένων 12 / 70


Αλγόριθμοι

• Πολλοί αλγόριθμοι διαχειρίζονται απευθείας συγκεκριμένες δομές.

• Για κάθε δομή, πρέπει να γνωρίζουμε την υλοποίηση λειτουργιών:


▶ Εισαγωγής νέων δεδομένων
▶ Αναζήτησης συγκεκριμένου στοιχείου
▶ Διαγραφής συγκεκριμένου στοιχείου

• Οι επιδόσεις τους επηρεάζουν την επίδοση του αλγορίθμου.

Ο. Τελέλης Δομές Δεδομένων 13 / 70


Παραδείγματα Δομών

Δομή δεδομένων Δομή δεδομένων


Πίνακας Συνδεδεμένη λίστα

45 23 28 95 71 19 a b c

Αλγόριθμος / Βασική Πράξη Αλγόριθμος / Βασική Πράξη


• Αναζήτηση • Αναζήτηση
• Εισαγωγή • Εισαγωγή
• Διαγραφή • Διαγραφή

Ο. Τελέλης Δομές Δεδομένων 14 / 70


Ανάλυση Αλγορίθμων

Ο. Τελέλης Δομές Δεδομένων 15 / 70


Αλγόριθμοι

«Μια πεπερασμένη ακολουθία σαφών οδηγιών (βημάτων) για την εκτέλεση


ενός υπολογισμού ή την επίλυση ενός προβλήματος.»

• Είσοδος: από ένα προδιαγεγραμμένο σύνολο τιμών εισόδου.

• Εξοδος: από ένα προδιαγεγραμμένο σύνολο τιμών εξόδου.

• Ορθότητα: παραγωγή ορθής εξόδου για δεδομένη είσοδο.

• Πεπερασμένο Πλήθος Βημάτων: εκτελέσιμων σε πεπερασμένο χρόνο.

• Γενικότητα: Ενας αλγόριθμος επιλύει ορθά όλα τα «στιγμιότυπα» ενός


προβλήματος και όχι μόνο ένα συγκεκριμένο (για συγκεκριμένη είσοδο).

Ο. Τελέλης Δομές Δεδομένων 16 / 70


Υλοποίηση Αλγορίθμων

Πρόγραμμα (Υλοποίηση):
Τυπική περιγραφή αλγόριθμου σε μία γλώσσα προγραμματισμού.

Ροή Εργασίας:
1. Διατύπωση Προβλήματος.
2. Διατύπωση Αλγορίθμου Επίλυσης.
3. Ελεγχος Ορθότητας.
4. Ανάλυση Απόδοσης.
5. Καθορισμός Πόρων.

Ο. Τελέλης Δομές Δεδομένων 17 / 70


Ανάλυση Αλγορίθμων: Κριτήρια

• Ορθότητα. Απαιτεί σαφή διατύπωση της αναμενόμενης λειτουργίας.


▶ Προδιαγραφή των δεδομένων εισόδου.
▶ Προφιαγραφή αναμενόμενων αποτελεσμάτων.
▶ Οταν τα δεδομένα εισόδου ικανοποιούν τις αναγκαίες συνθήκες: ο
αλγόριθμος τερματίζει παράγοντας τα αναμενόμενα αποτελέσματα.

• Απαιτήσεις Μνήμης. Απαιτούμενο μέγεθος μνήμης για αποθήκευση:


▶ Δεδομένων εισόδου.
▶ Ενδιάμεσων δεδομένων που δημιουργεί/χρησιμοποιεί ο αλγόριθμος.

• Χρόνος εκτέλεσης.
▶ Ταχύτητα εκτέλεσης των λειτουργιών για την ολοκλήρωση υπολογισμών.
▶ Εξαρτάται από: αλγόριθμο, δομές, γλώσσα, μεταγλωττιστή/διερμηνευτή.
▶ Επίσης από: υλικό, λειτουργικό σύστημα, ταυτόχρονα εκτελούμενες
διεργασίες κ.λ.π.

Ο. Τελέλης Δομές Δεδομένων 18 / 70


Πειραματική Ανάλυση Αλγορίθμων

• Γράψε ένα πρόγραμμα που να


υλοποιεί τον αλγόριθμο.

• «Τρέξε» τον αλγόριθμο


χρησιμοποιώντας δεδομένα
εισόδου διαφορετικού μεγέθους
και σύνθεσης.

• Μέτρησε το χρόνο εκτέλεσης


(run me).

• Σχεδίασε τη γραφική παράσταση


των αποτελεσμάτων.

Ο. Τελέλης Δομές Δεδομένων 19 / 70


Περιορισμοί Πειραματικής Μελέτης

• Απαραίτητη η (τυπική) υλοποίηση του αλγόριθμου:


▶ μπορεί να έχει τεχνικές δυσκολίες (σε σχέση με την άτυπη περιγραφή),
▶ μπορεί να είναι χρονοβόρα (π.χ., πολλαπλές μικρότερες διαδικασίες)

• Καλή κλιμάκωση των δεδομένων εισόδου?

• Σύγκριση δύο αλγορίθμων απαιτεί:


▶ Ιδιο μηχανικό εξοπλισμό (hardware)
▶ Ιδιο λογισμικό (so ware).

• Τα αποτελέσματα πρέπει να είναι αναπαράξιμα!

Ο. Τελέλης Δομές Δεδομένων 20 / 70


Θεωρητική Ανάλυση Αλγορίθμων

• Χρήση υψηλού επιπέδου περιγραφής του αλγορίθμου:


▶ όχι αναγκαστικά της τυπικής περιγραφής σε γλώσσα προγραμματισμού.

• Χρόνος εκτέλεσης ως συνάρτηση του μεγέθους της εισόδου ( n ).


▶ Ενδιαφέρει η συμπεριφορά της συνάρτησης καθώς το n αυξάνει.

• Ανω φράγμα χρόνου «χειρότερης περίπτωσης» (για κάθε είσοδο).

• Αξιολόγηση αλγορίθμου ανεξάρτητα από εξοπλισμό, υλοποίηση, κ.λ.π.

• Μετρά στοιχειώδεις λειτουργίες (βήματα) και όχι πραγματικό χρόνο.

Ο. Τελέλης Δομές Δεδομένων 21 / 70


Υπολογιστική Πολυπλοκότητα Αλγορίθμου

• Ανω φράγμα πλήθους στοιχειωδών πράξεων του αλγoρίθμου.

• Χειρότερη περίπτωση χρόνου εκτέλεσης, για όλες τις εισόδους.

• Η πολυπλοκότητα (χρόνος χειρότερης περίπτωσης) του αλγορίθμου:


▶ είναι συνάρτηση f(n) του μεγέθους n των δεδομένων εισόδου,
▶ εκφράζεται από την τάξη O(g(n)) της συνάρτησης αυτής.

• Λέμε ότι ο αλγόριθμος:


▶ έχει πολυπλοκότητα O(g(n)), ή είναι χρόνου O(g(n))
▶ ή έχει χρόνο (εκτέλεσης) χειρότερης περίπτωσης O(g(n)).

Ο. Τελέλης Δομές Δεδομένων 22 / 70


Υπενθύμιση: Ανω Φράγμα στην Τάξη των Συναρτήσεων
Ορισμός. Εστω συναρτήσεις: f : N 7→ R και g : N 7→ R

η τάξη της f(n) είναι O( g(n) ) αν υπάρχουν σταθερές C και n0 , τέτοιες ώστε:

| f(n) | ⩽ C · | g(n) | για κάθε n ⩾ n0

• O( g(n) ) είναι σύνολο συναρτήσεων:


{ }
|f (n)| ⩽ C · |g(n)| για κάθε n ⩾ n0 , για
O( g(n) ) = f (n) :
σταθερές C, n0 που εξαρτώνται από την f .

• Είναι επίσης σωστό να γράφουμε f ∈ O( g(n) ).

• Εχει επικρατήσει να γράφουμε απλώς f(n) = O( g(n) ).


▶ Ομως δεν εννοούμε ισότητα! Δε γράφουμε: O( g(n) ) = f (n)

Ο. Τελέλης Δομές Δεδομένων 23 / 70


Φυσική Ερμηνεία

cg(n)

f (n)

n0
f = O(g)

H f (n) μεγαλώνει το πολύ τόσο γρήγορα όσο ένα σταθερό πολλαπλάσιο της
g(n), καθώς το n πηγαίνει στο άπειρο.

Ο. Τελέλης Δομές Δεδομένων 24 / 70


O( )-Ιεραρχία Απλών Συναρτήσεων
Ενδεικτικοί Χρόνοι Εκτέλεσης Αλγορίθμων
σταθερού χρόνου (constant me) O(1)
λογαριθμικός (logarithmic) O(logn)
γραμμικός (linear) O(n)
nlogn O(nlogn)
τετραγωνικός (quadra c) O(n2 )
κυβικός (cubic) O(n3 )
πολυωνυμικός (polynomial) O(nk ), k > 1
εκθετικός (exponen al) O(an ), n > 1

O(1) ⊂ O(log n) ⊂ O(n) ⊂ O(n log n) ⊂ O(n2 ) ⊂ O(n3 ) ⊂ O(2n )


Ο. Τελέλης Δομές Δεδομένων 25 / 70
O( )-Ιεραρχία Απλών Συναρτήσεων
Στον άξονα y απεικονίζεται η τιμή log[f (n)], για κάθε συνάρτηση f (n)

105
n! n
104 102

103
2n √
102 n
n2 101
log n
n log n
101 n log log n
log n
100 1
100 1
2 4 6 8 10
50 100 150 200

O(1) ⊂ O(log log n) ⊂ O(log n) ⊂ O((log n)2 )



⊂ O( n) ⊂ O(n) ⊂ O(n2 ) ⊂ O(2n ) ⊂ O(n!)

Ο. Τελέλης Δομές Δεδομένων 26 / 70


Βασικές Ιδιότητες του O( )

Πολυώνυμα:
f(n) = ap np + · · · + a1 n + a0 , για p ∈ N, =⇒ f(n) = O(np ).

}
f1 (n) = O( g1 (n) ) ( { })
=⇒ (f1 +f2 )(n) = O max g1 (n), g2 (n)
f2 (n) = O( g2 (n) )

}
f1 (n) = O( g(n) )
=⇒ (f1 + f2 )(n) = O( g(n) )
f2 (n) = O( g(n) )
}
f1 (n) = O( g1 (n) )
=⇒ (f1 · f2 )(n) = O( g1 (n)g2 (n) )
f2 (n) = O( g2 (n) )
Ανατρέξετε στην αντίστοιχη ενότητα των Διακριτών Μαθηματικών.

Ο. Τελέλης Δομές Δεδομένων 27 / 70


Γιατί Χρησιμοποιούμε το Συμβολισμό O( )?

• Για να φράξουμε το σφάλμα που κάνουμε όταν αγνοούμε μικρούς


όρους στους μαθηματικούς τύπους.

• Για να φράξουμε το σφάλμα που κάνουμε όταν αγνοούμε μέρη ενός


προγράμματος τα οποία συμβάλλουν κατά ένα μικρό ποσοστό στο
συνολικό πρόγραμμα που αναλύουμε.

• Για να μπορούμε να ταξινομήσουμε τους αλγορίθμους με βάση τα άνω


φράγματα των συνολικών χρονων εκτέλεσής τους.

Ο. Τελέλης Δομές Δεδομένων 28 / 70


Μέση vs. Χειρότερη Περίπτωση Χρόνου Εκτέλεσης

• Από τις πιο συνηθισμένες συναρτήσεις που συναντώνται στην ανάλυση


αλγορίθμων, η γραμμική αντιστοιχεί στον πιο αποδοτικό αλγόριθμο
(γιατί?)

• Ενας αλγόριθμος μπορεί να εκτελείται γρηγορότερα με συγκεκριμένα


σύνολα δεδομένων από ότι με κάποια άλλα.

• Η εύρεση της μέσης περίπτωσης μπορεί να είναι πολύ δύσκολη, έτσι οι


αλγόριθμοι τυπικά μετρώνται με βάση τη χειρότερη περίπτωση
πολυπλοκότητας.

• Σε συγκεκριμένα πεδία εφαρμογής (π.χ. air traffic control) η γνώση της


χειρότερης περίπτωσης πολυπλοκότητας είναι πολύ σημαντική.

Ο. Τελέλης Δομές Δεδομένων 29 / 70


Σχόλια

• Η σύγκριση συναρτήσεων για μικρά σύνολα εισόδου είναι δύσκολη .


▶ Οι σταθερές φαίνεται να επηρεάζουν σημαντικά τη συνάρτηση.

• Οι διαφορές ανάμεσα στις καμπύλες που αντιπροσωπεύουν την


αύξηση της συνάρτησης χρόνου εκτέλεσης αλγορίθμων είναι
ευδιάκριτες για μεγάλα σύνολα δεδομένων. Γενικά:

▶ Οι δευτεροβάθμιας πολυπλοκότητας ( O(N 2 ) ) αλγόριθμοι δεν είναι


πρακτικοί για δεδομένα εισόδου που ξεπερνούν τις μερικές χιλιάδες.

▶ Οι κυβικής πολυπλοκότητας ( O(N 3 ) ) αλγόριθμοι γίνονται μη πρακτικοί


για μεγέθη δεδομένων εισόδου τόσο μικρά, όσο μερικές εκατοντάδες.

Ο. Τελέλης Δομές Δεδομένων 30 / 70


Παραδείγματα Ανάλυσης Πολυπλοκότητας

Ο. Τελέλης Δομές Δεδομένων 31 / 70


Παράδειγμα 1
int k = 0;
for ( i n t i = 0; i < n ; i ++)
k += i ;

Παράδειγμα 2
i n t sum = 0 ;
for ( i = 0; i < n ; i ++)
for ( j = 0; j < n ; j ++)
sum + + ;

Παράδειγμα 3
i n t sum = 0 ;
f o r ( i = 1 ; i <= n ; i + + )
f o r ( j = 1 ; j <= i * i ; j + + )
sum + + ;

Ο. Τελέλης Δομές Δεδομένων 32 / 70


Παράδειγμα 4
i n t sum = 0 ;
f o r ( i = 0 ; i <n ; i + + )
i f ( ( n % 2 ) == 0 ) / / n even
f o r ( j = 0 ; j <n ; j + + )
sum + + ;
else / / n odd
sum−−;

Ο. Τελέλης Δομές Δεδομένων 33 / 70


Παράδειγμα 1

int k = 0;
for ( i n t i = 0; i < n ; i ++)
k += i ;

Ανάλυση
• H στοιχειώδης πράξη k+=i; αποτελεί ένα (1) βήμα (χρόνου O(1) ).

• Ο αλγόριθμος εκτελεί τη βασική πράξη n φορές.



1=n
0⩽i<n

• O αλγόριθμος έχει πολυπλοκότητα O(n).

Ο. Τελέλης Δομές Δεδομένων 34 / 70


Παράδειγμα 2
i n t sum = 0 ;
for ( i = 0; i < n ; i ++) / / E x t e r n a l Loop
for ( j = 0; j < n ; j ++) / / I n t e r n a l Loop
sum + + ;

Ανάλυση
• Εξωτερικός Βρόχος:
∑ ( ) ( )
χρόνος εσωτερικού βρόχου = n× χρόνος εσωτερικού βρόχου
0⩽i<n

• Εσωτερικός Βρόχος: 1=n
0⩽i<n

∑ n−1
n−1 ∑
• Ολικός χρόνος εκτέλεσης: 1 = n × n = O(n2 )
j=0 i=0

Ο. Τελέλης Δομές Δεδομένων 35 / 70


Παράδειγμα 3

f o r ( i = 1 ; i <= n ; i + + )
f o r ( j = 1 ; j <= i * i ; j + + )
sum + + ;

Ανάλυση
n (
∑ )
• Εξωτερικός Βρόχος: χρόνος εσωτερικού βρόχου(i)
i=1


i·i
• Εσωτερικός βρόχος: 1 = i2 .
j=1


n ∑
i·i ∑
n
n(n + 1)(2n + 1)
• Συνολικά: 1= i2 = = O(n3 )
6
i=1 j=1 i=1

Ο. Τελέλης Δομές Δεδομένων 36 / 70


Παράδειγμα 4

i n t sum = 0 ;
f o r ( i = 0 ; i <n ; i + + )
i f ( ( n mod 2 ) == 0 ) / / n even
f o r ( j = 0 ; j <n ; j + + )
sum + + ;
else / / n odd
sum−−;

Ανάλυση
1 Εξωτερικός βρόχος: n επαναλήψεις

2 Εσωτερικός βρόχος: n επαναλήψεις – εκτελείται μόνο αν n άρτιος !


…, αλλιώς (αν n περιττός), O(1) χρόνος.

3 Επομένως, ολικός χρόνος: αν n άρτιος O(n2 ), αν n περιττός, O(n).

4 Χρόνος Χειρότερης Περίπτωσης: O(n2 ).

Ο. Τελέλης Δομές Δεδομένων 37 / 70


Παράδειγμα 5
Αλγόριθμος υπολογισμού προθεματικών μέσων

Είσοδος: πίνακας n αριθμητικών στοιχείων.

Εξοδος: πίνακας n αριθμών όπου A[i] μέσος όρος των X[0], . . . , X[i].

for ( i n t i = 0; i < n ; i ++) {

int a = 0;

f o r ( i n t j = 0 ; j <= i ; j + + ) { a = a + X [ j ] ; }

A[ i ] = a /( i +1) ;
}

return A;

Στοιχειώδεις πράξεις: πρόσθεση, διαίρεση, ανάθεση τιμής, ανάγνωση τιμής.


Ο. Τελέλης Δομές Δεδομένων 38 / 70
Παράδειγμα 5 (Ανάλυση)

• Ο εξωτερικός βρόχος εκτελείται n φορές (για i = 0, . . . , n − 1).

• Εντός του (και εκτός του εσωτερικού): O(1) στοιχειώδες πράξεις.

• Ο εσωτερικός βρόχος εκτελείται i + 1 φορές, για i = 0, . . . , n − 1.


▶ Αρα, εκτελείται το πολύ n φορές, για i = 0, . . . , n − 1.

• Εντός του εωτερικού βρόχου συμβαίνουν O(1) στοιχειώδεις πράξεις.

• Συνολικά: n · (O(1) + n · O(1)) = O(n2 ).

Ο. Τελέλης Δομές Δεδομένων 39 / 70


Παράδειγμα 6

Βελτιωμένος Aλγόριθμος υπολογισμού προθεματικών μέσων

Είσοδος: πίνακας n αριθμητικών στοιχείων.

Εξοδος: πίνακας n αριθμών όπου ο A[i] είναι ο μέσος όρος των


X[0], . . . , X[i].

int s = 0;
for ( i n t i = 0; i < n ; i ++) {
s = s + X[ i ];
A[ i ] = s /( i +1) ;
}
return A;

Πολυπλοκότητα?

Ο. Τελέλης Δομές Δεδομένων 40 / 70


Πίνακες (Arrays)

Ο. Τελέλης Δομές Δεδομένων 41 / 70


Πίνακες (Arrays)

• Aποθήκευση δεδομένων σε συνεχόμενες θέσεις στη μνήμη.


▶ Ολα τα δεδομένα είναι ίδιου τύπου και ίσου μεγέθους.
▶ Ολες οι συνεχόμενες θέσεις μνήμης του πίνακα είναι ίσου μεγέθους.

• Προσπέλαση δεδομένων με βάση τη θέση τους στη μνήμη.


▶ Το i-οστό στοιχείο ενός πίνακα A προσπελαύνεται με A[i ] .
▶ Εγγράφουμε ένα δεδομένο στη θέση i με ανάθεση τιμής, π.χ.: A[i ] = 77;
▶ Το σύμβολο A αποθηκεύει τη διεύθυνση της 1ης θέσης του πίνακα, A[0].
▶ Η διεύθυνση της i-οστής θέσης υπολογίζεται ως: A + i · size ,
όπου size είναι το μέγεθος κάθε στοιχείου του πίνακα.

• Διδιάστατος Πίνακας m × n, με m γραμμές και n στήλες.


▶ Υλοποιείται ως πίνακας (array) m πινάκων (arrays) μεγέθους n.
▶ Αν απαιτείται, μπορεί να χρησιμοποιούνται πολυδιάστατοι πίνακες.

Ο. Τελέλης Δομές Δεδομένων 42 / 70


Μερικά Παραδείγματα

int [] x , y , z ;
String [] a;

x = new i n t [ 3 ] ;
y = x;
a = new S t r i n g [ 3 ] ;

x [1] = 2;
y [1] = 3;
a [1] = ” Hello ” ;

int [] q;
q = new i n t [ ] { 1 , 2 , 3 } ;

/ / S h o r t form f o r d e c l a r a t i o n s :
int [ ] r = {7 , 8 , 9};

Ο. Τελέλης Δομές Δεδομένων 43 / 70


Εισαγωγή Στοιχείου
• Ενα νέο στοιχείο εισάγεται στο πρώτο ελεύθερο κελί.
• Αποθηκεύουμε το τρέχον πλήθος των ήδη εισηγμένων στοιχείων.
▶ Εισαγωγή στοιχείου 37 στη θέση 0: A[0] = 37;
▶ Εισαγωγή στοιχείου 22 στη θέση 1: A[1] = 22;
▶ Εισαγωγή στοιχείου 99 στη θέση 2: A[2] = 99;

Η εισαγωγή γίνεται σε σταθερό χρόνο O(1).


0 1 2 3 4 5 6 7 8 9
37 22 99
c l a s s MyArray {
private long [ ] a ; / / needs i n i t i a l i z a t i o n
p r i v a t e i n t nElems ; / / number o f d a t a i t e m s

p u b l i c boolean i n s e r t ( long value ) {


i f ( nElems >= a . l e n g t h ) r e t u r n ( f a l s e ) ;
a [ nElems + + ] = v a l u e ; r e t u r n ( t r u e ) ;
}
}
Ο. Τελέλης Δομές Δεδομένων 44 / 70
Γραμμική Αναζήτηση Στοιχείου
Η αναζήτηση γίνεται με βάση την τιμή του στοιχείου, έστω το 58.
• Διατρέχουμε τον πίνακα κελί-κελί από την πρώτη θέση μέχρι την
τελευταία θέση στην οποία υπάρχει αποθηκευμένο στοιχείο.
• Εάν συναντήσουμε το 58, σταματάμε (επιτυχής αναζήτηση).
• Μπορεί να μην το συναντήσουμε (αποτυχημένη αναζήτηση).
Στη χειρότερη περίπτωση εξετάζονται n στοιχεία =⇒ πολυπλοκότητα O(n).

0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 58 67 71

bo o l e a n f i n d ( l o n g s e a r c h K e y ) {
f o r ( i n t j = 0 ; j < nElems ; j + + )
i f ( a [ j ] == s e a r c h K e y ) r e t u r n t r u e ;
return false ;
}

Ο. Τελέλης Δομές Δεδομένων 45 / 70


Συνέπεια και Διπλές Εγγραφές

Μία Δομή Δεδομένων αναπαριστά εξ ορισμού σύνολο.

• Δεν προβλέπεται εν γένει να περιέχει το ίδιο στοιχείο ⩾ 2 φορές.

• Ο περιορισμός αυτός μπορεί να επιβληθεί από την υλοποίησή μας:


▶ Ελέγχουμε για κάθε εισαγόμενο στοιχείο αν είναι ήδη αποθηκευμένο.
▶ Ο έλεγχος απαιτεί αναζήτηση πριν από την εισαγωγή.

• Στην περίπτωση αυτή η εισαγωγή γίνεται πολυπλοκότητας O(n).

• Αρα: Εισαγωγή σε χρόνο O(1) ⇐⇒ επιτρέπονται διπλές εγγραφές.

Ο. Τελέλης Δομές Δεδομένων 46 / 70


Διαγραφή Στοιχείου
• Η διαγραφή στοιχείου απαιτεί πρώτα τον εντοπισμό του.
• Κατόπιν, όλα τα επόμενά του μεταφέρονται μία θέση αριστερά.
• Χρόνος O(n): αναζήτηση χρόνου O(n), ολίσθηση O(n) στοιχείων.

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 ⊗

p u b l i c boolean d e l e t e ( long value ) {


int j ;
f o r ( j = 0 ; j < nElems ; j + + ) i f ( v a l u e == a [ j ] ) b r e a k ;
i f ( j == nElems ) r e t u r n f a l s e ;
f o r ( i n t k = j ; k < nElems −1; k + + ) a [ k ] = a [ k + 1 ] ;
nElems −−; r e t u r n t r u e ;
}

Ο. Τελέλης Δομές Δεδομένων 47 / 70


Διαγραφή: Εναλλακτική Υλοποίηση

Αν δεν ενδιαφέρει η διατήρηση της σχετικής σειράς των στοιχείων:

• Αποφεύγουμε την ολίσθηση O(n) στοιχείων προς τα αριστερά.

• Το τελευταίο στοιχείο αντιγράφεται στη θέση του διαγραφόμενου.

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 16 67 71 27 ⊗

Προσοχή: Η υλοποίηση αυτή είναι επίσης χρόνου O(n).


• Εξαιτίας της αναζήτησης του στοιχείου προς διαγραφή.

Ο. Τελέλης Δομές Δεδομένων 48 / 70


Διαγραφή και Διπλές Εγγραφές

Εφόσον οι διπλές εγγραφές επιτρέπονται (από την πράξη εισαγωγής):

• Πρέπει να αποφασίσουμε συμπεριφορά αναζήτησης και διαγραφής.


▶ Αναζήτηση/Διαγραφή του πρώτου στοιχείου με τιμή X?
▶ Αναζήτηση/Διαγραφή του τελευταίου στοιχείου με τιμή X?
▶ Αναζήτηση/Διαγραφή όλων των στοιχείων με τιμή X?

• Η πρώτη είναι συνήθης επιλογή (τερματισμός στο πρώτο στοιχείο).

• Μπορούν να υλοποιηθούν όλες οι επιλογές ως χωριστές πράξεις.

Ο. Τελέλης Δομές Δεδομένων 49 / 70


Σχόλια: Πίνακες Δυναμικού Μεγέθους

Μπορούν να υποστηριχτούν, με επιβάρυνση της πράξης εισαγωγής:

• Οταν διαπιστώνεται ότι ο πίνακας είναι πλήρης.

• Δημιουργείται νέος πίνακας, μεγαλύτερου μεγέθους.

• Συνήθης Πρακτική: διπλασιασμός του μεγέθους.

• Αντιγράφεται όλος ο παλιός πίνακας στον νέο πίνακα.

• Πραγματοποιείται εισαγωγή του νέου στοιχείου.


• Η εισαγωγή γίνεται στην περίπτωση αυτή O(n) χρόνου.
▶ Λόγω της αντιγραφής όλων των στοιχείων του παλιού πίνακα.

Ο. Τελέλης Δομές Δεδομένων 50 / 70


Ταξινομημένοι Πίνακες

Ο. Τελέλης Δομές Δεδομένων 51 / 70


Ταξινομημένοι Πίνακες

• Ενας πίνακας στον οποίο τα δεδομένα διευθετούνται σε αύξουσα σειρά


κλειδιού (ή και φθίνουσα).

• Η μικρότερη τιμή κλειδιού βρίσκεται στο κελί με δείκτη 0.

• Κάθε κελί περιέχει τιμή μεγαλύτερη από το προηγούμενο κελί.

0 1 2 3 4 5 6 7 8 9
11 22 37 42 58 67 71 83 ⊗ ⊗

Πώς γίνεται η αναζήτηση σε έναν ταξινομημένο πίνακα?

Ποτέ δεν εκτελώ γραμμική αναζήτηση σε ταξινομημένο πίνακα.

Ο. Τελέλης Δομές Δεδομένων 52 / 70


Δυαδική Aναζήτηση

• Εφαρμόσιμη μόνο σε ταξινομημένους πίνακες.

• Πολύ ταχύτερη από τη γραμμική αναζήτηση.

• Πώς λειτουργεί η εύρεση του στοιχείου με τιμή X?

▶ Χωρίζει τον πίνακα στη μέση, σε αριστερό και δεξιό κομμάτι,

▶ ελέγχει το κλειδί M που περιέχεται στο μεσαίο κελί,

▶ αν X = M , τότε η αναζήτηση είναι επιτυχής.

▶ αν X < M επαναλαμβάνει τη διαδικασία στο αριστερό κομμάτι,

▶ αν X > M επαναλαμβάνει τη διαδικασία στο δεξιό κομμάτι,

Ο. Τελέλης Δομές Δεδομένων 53 / 70


Παράδειγμα Δυαδικής Aναζήτησης

Aναζήτηση του στοιχείου 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

Τερματισμός: 11 22 37 42 58 67 71 83

Ο. Τελέλης Δομές Δεδομένων 54 / 70


Δυαδική Aναζήτηση

• Κάθε επανάληψη χωρίζει το εύρος των πιθανών τιμών στη μέση.

• Σε κάθε επανάληψη, υποδιπλασιάζεται το μέγεθος του πίνακα στο


οποίο αναζητούμε.

• Η πολυπλοκότητα της δυαδικής αναζήτησης είναι O(log n).

• Εκθετικά ταχύτερη από γραμμική αναζήτηση που είναι χρόνου O(n).

Ο. Τελέλης Δομές Δεδομένων 55 / 70


Τυπική Απόδειξη
• Εστω ταξινομημένος πίνακας (π.χ., ακεραίων) μήκους L(0) = n.
• Εκτελούμε δυαδική αναζήτηση, που διαρκεί k επαναληπτικά βήματα.
• Στο i-οστό βήμα, εκτελούμε σταθερό αριθμό στοιχειωδών πράξεων:
▶ βρίσκουμε το μεσαίο στοιχείο ενός (υπο-)πίνακα,
▶ O(1) συγκρίσεις του στοιχείου προς αναζήτηση.

• Επίσης, στο i-οστό βήμα δουλεύουμε σε υποπίνακα μήκους L(i − 1)/2:


L(i − 1) L(i − 2) L(0) n
L(i) = = 2
= ··· = i = i
2 2 2 2
• Ο αλγόριθμος τερματίζει το πολύ όταν το μήκος του (υπο-)πίνακα που
εξετάζουμε σε κάποιο βήμα είναι 1: άρα, όταν L(k) = 1 = n/2k . Τότε:

2k = n =⇒ log(2k ) = log n =⇒ k = log n

Ο. Τελέλης Δομές Δεδομένων 56 / 70


Υλοποίηση Δυαδικής Αναζήτησης

c l a s s MyArray {
private long [ ] a ; // r e f e r e n c e to a r r a y a
p r i v a t e i n t nElems ; / / number o f d a t a i t e m s
// . . . ... ... ... ... ... ... ... ...
p u b l i c boolean b i n a r y S e a r c h ( long searchKey ) {
i n t lowerBound = 0 ; // lower index
i n t upperBound = nElems − 1 ; / / upper i n d e x
int curIn ; // middle index
while ( true ) {
c u r I n = ( lowerBound + upperBound ) / 2 ;
i f ( a [ c u r I n ] == s e a r c h K e y ) r e t u r n t r u e ;
e l s e i f ( lowerBound > upperBound )
return false ;
else i f ( a [ curIn ] < searchKey )
lowerBound = c u r I n + 1 ;
e l s e upperBound = c u r I n − 1 ;
}
}
}

Ο. Τελέλης Δομές Δεδομένων 57 / 70


Εισαγωγή, Διαγραφή σε Ταξινομημένο Πίνακα

Εισαγωγή: αναγκαστικά χρόνου O(n).


• Εντοπίζει πρώτα τη σωστή θέση εγγραφής του στοιχείου, O(log n)
▶ ώστε ο πίνακας να παραμείνει ταξινομημένος, κατόπιν της εισαγωγής.
• Ολισθαίνει O(n) στοιχεία προς τα δεξιά του πίνακα, O(n)
▶ ώστε να δημιουργήσει «ελεύθερη» θέση για την εγγραφή του στοιχείου.

Διαγραφή: παραμένει χρόνου O(n).


• Διότι ενδιαφέρει η διατήρηση της σχετικής διάταξης των στοιχείων.
• Εντοπίζει το στοιχείο προς διαγραφή σε χρόνο O(log n).
• Ολισθαίνει O(n) στοιχεία δεξιά αυτού, κατά μία θέση αριστερά.

Ο. Τελέλης Δομές Δεδομένων 58 / 70


Χαρακτηριστικά Ταξινομημένων Πινάκων

• Εκθετικά ταχύτερη αναζήτηση από ότι σε μη ταξινομημένο πίνακα.

• Τίμημα: ακριβή εισαγωγή O(n) χρόνου, για διατήρηση ταξινόμησης.


▶ Aν a είναι η τιμή του εισαγόμενου κλειδιού,
▶ απαιτείται ολίσθηση κατά 1 θέση των στοιχείων με μεγαλύτερα κλειδιά,
▶ για να δημιουργηθεί χώρος για το στοιχείο με τιμή a.

• Διαγραφή αργή, O(n) χρόνου σε ταξινομημένους ή μη πίνακες.

• Οι ταξινομημένοι πίνακες είναι χρήσιμοι όταν οι αναζητήσεις είναι


σημαντικά συχνότερες από εισαγωγές και διαγραφές.

Ο. Τελέλης Δομές Δεδομένων 59 / 70


Σύνοψη Πολυπλοκότητας

Aλγόριθμος Χρόνος Εκτέλεσης


Γραμμική Aναζήτηση O(n)

Δυαδική Aναζήτηση O(log n)

Εισαγωγή σε μη ταξινομημένο πίνακα O(1)

Εισαγωγή σε ταξινομημένο πίνακα O(n)

Διαγραφή σε μη ταξινομημένο πίνακα O(n)

Διαγραφή σε ταξινομημένο πίνακα O(n)

Ο. Τελέλης Δομές Δεδομένων 60 / 70


Γιατί δε Χρησιμοποιούμε τους Πίνακες για όλα?

• Θέματα απόδοσης.
▶ Μη ταξινομημένοι πίνακες.

Γρήγορη εισαγωγή O(1), όμως αργή αναζήτηση/διαγραφή O(n)

▶ Ταξινομημένοι πίνακες.

Γρήγορη αναζήτηση O(log n), όμως αργή εισαγωγή/διαγραφή O(n)

• Σταθερό μέγεθος πινάκων κατά τη δημιουργία.


• Πρέπει να εκτιμήσουμε από πριν το μέγιστο πλήθος των στοιχείων:
▶ Υπερεκτίμηση μεγέθους =⇒ κατανάλωση μνήμης άσκοπα.
▶ Υποτίμηση μεγέθους =⇒ ο πίνακας δεν επαρκεί.

Ο. Τελέλης Δομές Δεδομένων 61 / 70


(1) Aναπαράσταση Υποσυνόλων του {0, . . . , n − 1}

• Ζητείται δομή αναπαράστασης υποσυνόλων του {0, 1, . . . , n − 1}.

• Θέλουμε να υποστηρίξουμε τις εξής βασικές πράξεις:


▶ Εισαγωγή στοιχείου a ∈ {0, . . . , n − 1} στο τρέχον υποσύνολο.
▶ Διαγραφή στοιχείου a ∈ {0, . . . , n − 1} από το τρέχον υποσύνολο.
▶ Ερώτηση αν το στοιχείο a ∈ {0, . . . , n − 1} ανήκει στο υποσύνολο.

• Πόσο αποδοτικά μπορούμε να τις υλοποιήσουμε με χρήση πίνακα?

Ο. Τελέλης Δομές Δεδομένων 62 / 70


(1): Aναπαράσταση Υποσυνόλων του {0, . . . , n − 1}

Χρησιμοποιούμε πίνακα n δυαδικών στοιχείων (με τιμές true/false)

• Εισαγωγή του a ∈ { 0, . . . , n − 1 }: A[a] = true χρόνος O(1)

• Διαγραφή του a ∈ { 0, . . . , n − 1 }: A[a] = false χρόνος O(1)

• Aναζήτηση του a ∈ { 0, . . . , n − 1 }: return (A[a]) ; χρόνος O(1)

Ο. Τελέλης Δομές Δεδομένων 63 / 70


(2) Πιο αποδοτικοί πίνακες

• Θέλουμε να υλοποιήσουμε την Τυφλή Διαγραφή σε πίνακα:

▶ Δίνεται απλώς μια θέση i του πίνακα (και όχι ένα στοιχείο/κλειδί).

▶ Διαγράφουμε το στοιχείο στη θέση i θέτοντας απλώς A[i ] = null .

Υλοποίηση ταυτόχρονα Εισαγωγής και Τυφλής Διαγραφής σε χρόνο O(1)?

Ο. Τελέλης Δομές Δεδομένων 64 / 70


(2) Πιο αποδοτικοί πίνακες

• Χρησιμοποιούμε βοηθητικό πίνακα ακεραίων, B, και έναν μετρητή


last, που αρχικοποιείται στο 0.
• Υλοποιούμε την «Τυφλή Διαγραφή» στη θέση i ως εξής:
A [ i ] = n u l l ; B [ l a s t ] = i ; l a s t + + ; / / O ( 1 ) time

• Υλοποιούμε την Εισαγωγή στοιχείου a ως εξής:


A [ B [ l a s t −1]] = a ; l a s t −−; / / O ( 1 ) time

• Και οι δύο πράξεις σε χρόνο χειρότερης περίπτωσης O(1).

Ο. Τελέλης Δομές Δεδομένων 65 / 70


Πρόβλημα 3: Κατασκευή Ομοιόμορφα Τυχαίας Μετάθεσης

• Δίνεται πίνακας A με n στοιχεία.

• Ζητείται αλγόριθμος που:

▶ Δέχεται σαν είσοδο τον πίνακα A,

▶ «ανακατεύει» τη σειρά των στοιχείων στον A, ώστε:

▶ η τελική σειρά είναι οποιαδήποτε από τις n! μεταθέσεις των στοιχείων,

1
▶ με πιθανότητα .
n!

• Δεδομένο: μπορούμε να επιλέξουμε αριθμό στο {0, . . . , k − 1} με


πιθανότητα 1/k (τυχαία και ομοιόμορφα).

Ο. Τελέλης Δομές Δεδομένων 66 / 70


Κατασκευή Ομοιόμορφα Τυχαίας Διάταξης

Ενας αλγόριθμος με βέλτιστη πολυπλοκότητα (Donald Knuth)


Knuth Shuffle Algorithm
Είσοδος: πίνακας A
1. για i = 0, . . . , n − 1 εκτέλεσε:
1.1 επίλεξε μια θέση j ∈ {i, . . . , n − 1} τυχαία και ομοιόμορφα
1.2 αντάλλαξε τα περιεχόμενα των A[i] και A[j].

2. επίστρεψε A

Πολυπλοκότητα: O(n).
1
Δίνει τυχαία μετάθεση των περιεχομένων του A, με πιθανότητα n! . Γιατί?

Ο. Τελέλης Δομές Δεδομένων 67 / 70


Υλοποίηση σε Java

i m p o r t j a v a . u t i l . Random ;

/ / Permutes t h e a r r a y ”A” u n i f o r m l y a t random .


public void s h u f f l e ( i n t [ ] A) {

Random rndGen = new Random ( System . c u r r e n t T i m e M i l l i s ( ) ) ;

for ( i n t i = 0; i < A . length ; i ++) {

/ / Random p o s i t i o n i n { i , i + 1 , . . . , n−1}
i n t pos = i + rndGen . n e x t I n t ( A . l e n g t h −i ) ;

/ / Swap
i n t tmp = A [ i ] ;
A [ i ] = A [ pos ] ;
A [ pos ] = tmp ;
}
}

Ο. Τελέλης Δομές Δεδομένων 68 / 70


Aνάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης

• Η πιθανότητα του A[1] να έχει στην έξοδο την τιμή που παρατηρούμε,
είναι Pr( A[1] ) = n1 .

• Η πιθανότητα του A[2] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένου του A[1] είναι Pr( A[2] | A[1] ) = n−1
1
.

• Η πιθανότητα του A[3] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένων των A[1], A[2], είναι Pr( A[3] | A[1] ∧ A[2] ) = n−2
1
.

...............

• Η πιθανότητα του A[i] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένων των A[1], A[2], …, A[i − 1] είναι:
( )
1
Pr A[i] A[1] ∧ A[2] ∧ · · · ∧ A[i − 1] =
n−i+1

Ο. Τελέλης Δομές Δεδομένων 69 / 70


Aνάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης

Η πιθανότητα να δούμε στην έξοδο τη διάταξη A που υποθέσαμε είναι:

( )
Pr( A ) = Pr A[1] ∧ A[2] ∧ · · · ∧ A[n]
( ) ( )

= Pr A[n] A[1] ∧ A[2] ∧ · · · ∧ A[n − 1] × Pr A[1] ∧ A[2] ∧ · · · ∧ A[n − 1]
( ) ( )

= Pr A[n] A[1] ∧ A[2] ∧ · · · ∧ A[n − 1] × Pr A[n − 1] A[1] ∧ A[2] ∧ · · · ∧ A[n − 2]
( )
× Pr A[1] ∧ A[2] ∧ · · · ∧ A[n − 2]

n ( )

= Pr A[i] A[1] ∧ A[2] ∧ · · · ∧ A[i − 1]
i=1
1 1 1 1
=1× × × ··· × =
2 3 n n!

Ο. Τελέλης Δομές Δεδομένων 70 / 70

You might also like