You are on page 1of 31

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

Δεδομένων
Σωροί, Ουρές, & Λίστες
Αποσβένουσα Ανάλυση
Δέντρα

Οι διαφάνειες είναι βασισμένες στο βιβλίο "Data Structures and Algorithms in C++" των Michael T. Goodrich, Roberto Tamassia και David M. Mount
Ο ADT Σωρός (§4.2.1)
O ADT Σωρός αποθηκεύει
αυθαίρετα αντικείμενα
Βοηθητικές λειτουργίες
Οι εισαγωγές και
του σωρού:
διαγραφές ακολουθούν το  top(): επιστρέφει το
last-in first-out μοντέλο τελευταία εισαγμένο
στοιχείο χωρίς να το
Βασικές λειτουργίες του αφαιρεί
σωρού:  size(): επιστρέφει τον
 push(Object o): εισάγει το αριθμό τον
στοιχείο o αποθηκευμένων
στοιχείων
 pop(): αφαιρεί και
επιστρέφει το τελευταία
 isEmpty(): Boolean τιμή
που δείχνει αν υπάρχουν
εισαγμένο στοιχείο
αποθηκευμένα στοιχεία
Στοιχειώδεις Δομές Δεδομένων 2
Εφαρμογές των Σωρών
Άμεσες εφαρμογές
 Ιστορικό σελίδων σε Web browser
 Ακολουθία undo σε επεξεργαστή κειμένου
Έμμεσες εφαρμογές
 Βοηθητική δομή δεδομένων για
αλγόριθμους
 Συστατικό άλλων δομών δεδομένων

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


Array-based Σωρός (§4.2.2)
Algorithm pop():
if isEmpty() then
Ένας απλός τρόπος throw EmptyStackException
για την υλοποίηση
else
ADT σωρού με χρήση
πινάκων tt1
Προσθέτουμε στοιχεία return S[t + 1]
από αριστερά προς τα Algorithm push(o)
δεξιά if t = S.length  1 then
Η μεταβλητή t δείχνει throw FullStackException
το κορυφαίο στοιχείο else
(μέγεθος t+1)
tt+1
S[t]  o

S
0 1 2 t
Στοιχειώδεις Δομές Δεδομένων 4
Επεκτεινόμενος Array-
based Σωρός
Σε μια push λειτουργία, όταν ο
πίνακας είναι γεμάτος, αντί για
δημιουργία exception, Algorithm push(o)
μπορούμε να αντικαταστήσουμε if t = S.length  1 then
τον πίνακα με έναν μεγαλύτερο A  new array of
Πόσο μεγάλος πρέπει να είναι ο size …
νέος πίνακας; for i  0 to t do
 αυξητική στρατηγική: αύξηση A[i]  S[i]
μεγέθους με σταθερά c SA
 στρατηγική διπλασιασμού: tt+1
διπλασιασμός του μεγέθους S[t]  o

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


Σύγκριση
Στρατηγικών

Συγκρίνουμε την αυξητική στρατηγική και


την στρατηγική διπλασιασμού αναλύοντας
τον συνολικό χρόνο T(n) που χρειάζεται για
να εκτελεστεί μια σειρά από n λειτουργίες
push
Υποθέτουμε ότι ξεκινάμε με ένα άδειο σωρό
που αναπαριστάται με πίνακα μεγέθους 1
Ονομάζουμε αποσβενούμενο χρόνο μίας
push λειτουργίας τον μέσο χρόνο T(n)/n
Στοιχειώδεις Δομές Δεδομένων 6
Ανάλυση της Αυξητικής
Στρατηγικής
Αντικαθιστούμε τον πίνακα k = n/c φορές
Ο συνολικός χρόνος T(n) μιας σειράς από n push
λειτουργίες είναι ανάλογος με
n + c + 2c + 3c + 4c + … + kc =
n + c(1 + 2 + 3 + … + k) =
n + ck(k + 1)/2
Αφού το c είναι σταθερά, ο T(n) είναι O(n + k2),
π.χ., O(n2)
Ο αποσβενούμενος χρόνος της push λειτουργίας
είναι O(n)

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


Άμεση Ανάλυση της
Στρατηγικής Διπλασιασμού
Αντικαθιστούμε τον πίνακα k =
log2 n φορές
γεωμετρική σειρά
Ο συνολικός χρόνος T(n) μιας
σειράς από n push λειτουργίες 2
είναι ανάλογος με 4
n + 1 + 2 + 4 + 8 + …+ 2k = 1 1
n  2k + 1 1 = 2n 1
8
T(n) είναι O(n)
Ο αποσβενούμενος χρόνος της
push λειτουργίας είναι O(1)
Στοιχειώδεις Δομές Δεδομένων 8
Accounting Method Analysis
της Στρατηγικής Διπλασιασμού
Η accounting method καθορίζει τον αποσβενούμενο τρέχοντα
χρόνο με ένα σύστημα πιστώσεων και χρεώσεων
Θεωρούμε τον υπολογιστή σαν μία coin-operated συσκευή που
απαιτεί ένα 1 cyber-δολάριο για ένα σταθερό ποσό υπολογισμού.

 Δημιουργούμε ένα σχήμα για να χρεώνονται οι


λειτουργίες, γνωστό ώς σχήμα απόσβεσης.
 Το σχήμα πρέπει να δίνει συνεχώς αρκετά λεφτά για

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


 Το συνολικό κόστος μιας σειράς λειτουργιών δεν είναι

μεγαλύτερο από το συνολικό ποσό που χρεώνεται.


(χρόνος απόσβεσης)  (σύνολο $) / (# λειτουργιών)

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


Σχήμα Απόσβεσης για την
Στρατηγική Διπλασιασμού
Θεωρούμε ξανά k φάσεις, όπου κάθε φάση αποτελείται από τα διπλάσια
pushes από την προηγούμενη.
Στο τέλος μιας φάσης πρέπει να έχουμε αρκετά για να πληρώσουμε για το
push της επόμενης φάσης.
Στο τέλος της φάσης i θέλουμε να έχουμε κρατήσει i cyber-δολάρια, για
να πληρώσουμε για την αύξηση του πίνακα για το ξεκίνημα της επόμενης
φάσης.
$ $ $ $
$
$ $ $ $
$

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

• Χρεώνουμε $3 για ένα push. Τα $2 που κρατάμε για ένα


κανονικό push φυλάσσονται στο δεύτερο μισό του πίνακα.
Συνεπώς θα έχουμε 2(i/2)=i cyber-δολάρια στο τέλος της φάσης i.
• Άρα, κάθε push τρέχει σε O(1) χρόνο απόσβεσης. Τα n pushes
τρέχουν σε O(n) χρόνο.
Στοιχειώδεις Δομές Δεδομένων 10
Η Ουρά ADT (§4.3.1)
Η ADT Ουρά αποθηκεύει Βοηθητικές λειτουργίες της
αυθαίρετα αντικείμενα ουράς:
Οι εισαγωγές και διαγραφές  front(): επιστρέφει το στοιχείο
ακολουθούν το first-in first- στην αρχή χωρίς να το
out μοντέλο αφαιρεί
Οι εισαγωγές είναι στο πίσω  size(): επιστρέφει τον αριθμό
της ουράς και οι διαγραφές των στοιχείων
στην αρχή της ουράς  isEmpty(): επιστρέφει μια
Βασικές λειτουργίες της Boolean τιμή που δείχνει αν
ουράς: υπάρχουν στοιχεία
 enqueue(object o): εισαγωγή
στοιχείου o στο τέλος της
Exceptions
ουράς  Η εκτέλεση μιας dequeue ή
 dequeue(): αφαίρεση και front λειτουργίας σε μια άδεια
επιστροφή του στοιχείου ουρά προκαλεί
στην αρχή της ουράς EmptyQueueException

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


Εφαρμογές των Ουρών
Άμεσες εφαρμογές
 Σειρές αναμονής
 Πρόσβαση σε μοιραζόμενους πόρους (π.χ.,
εκτυπωτής)
 Πολυπρογραμματισμός
Έμμεσες εφαρμογές
 Βοηθητική δομή δεδομένων για αλγόριθμους
 Συστατικό άλλων δομών δεδομένων

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


Μονά Διασυνδεδεμένη Λίστα
Μία μονά διασυνδεδεμένη λίστα
είναι μία συμπαγής δομή επόμενο
δεδομένων που αποτελείται
από μία ακολουθία κόμβων
Κάθε κόμβος περιέχει
 στοιχείο

 σύνδεσμο προς τον επόμενο στοιχείο κόμβος


κόμβο

A B C D

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


Ουρά με Μονά Διασυνδεδεμένη Λίστα
Μπορούμε να υλοποιήσουμε μια ουρά με μία μονά
διασυνδεδεμένη λίστα
 Το μπροστινό στοιχείο αποθηκεύεται στον πρώτο κόμβο
 Το πίσω στοιχείο αποθηκεύεται στον τελευταίο κόμβο
Ο χώρος που χρησιμοποιείται είναι O(n) και κάθε διεργασία της
Ουράς ADT παίρνει χρόνο O(1) r
κόμβοι

f 

στοιχεία
Στοιχειώδεις Δομές Δεδομένων 14
List ADT (§5.2.2)

Το List ADT μοντέλο Μέθοδοι πρόσβασης:


μοντελοποιεί μια  first(), last()
ακολουθία από θέσεις  before(p), after(p)
που αποθηκεύουν Μέθοδοι ενημέρωσης:
αυθαίρετα αντικείμενα  replaceElement(p, o),
Εγκαθιστά μία πριν/μετά swapElements(p, q)
σχέση μεταξύ των  insertBefore(p, o),
θέσεων insertAfter(p, o),
 insertFirst(o),
Μέθοδοι ερωτήσεων: insertLast(o)
 isFirst(p), isLast(p)  remove(p)

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


Διπλά Διασυνδεδεμένη Λίστα
Μία διπλά διασυνδεδεμένη λίστα παρέχει
μια φυσική υλοποίηση της List ADT prev next
Οι κόμβοι υλοποιούν την θέση και
περιέχουν:
 στοιχείο
 σύνδεσμο στον προηγούμενο κόμβο
elem κόμβος
 σύνδεσμο στον επόμενο κόμβο
Ειδικοί κόμβοι header και trailer

header κόμβοι/θέσεις trailer

στοιχεία
Στοιχειώδεις Δομές Δεδομένων 16
Δέντρα (§6.1)
Ένα δέντρο είναι ένα
αφηρημένο μοντέλο μιας Computers”R”Us
ιεραρχικής δομής
Ένα δέντρο αποτελείται
από κόμβους με μια Sales Manufacturing R&D
σχέση parent-child
Εφαρμογές:
US International Laptops Desktops
 Διαγράμματα
οργάνωσης
 Συστήματα αρχείων
Europe Asia Canada
 Προγραμματιστικά
περιβάλλοντα

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


ADT Δέντρο (§6.1.2)
Χρησιμοποιούμε positions Μέθοδοι αναζήτησης:
για την «αφαίρεση» των  boolean isInternal(p)
κόμβων  boolean isExternal(p)
Γενικές μέθοδοι:  boolean isRoot(p)
 integer size() Μέθοδοι ενημέρωσης:
 boolean isEmpty()  swapElements(p, q)
 objectIterator elements()  object replaceElement(p, o)
 positionIterator positions()
Πρόσθετες μέθοδοι:
 position root()
 position parent(p)
 positionIterator children(p)

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


Preorder Διάσχιση (§6.2.3)
Μια διάσχιση επισκέπτεται τους
κόμβους του δέντρου με
Algorithm preOrder(v)
συστηματικό τρόπο visit(v)
Στην preorder διάσχιση, ένας for each child w of v
κόμβος επισκέπτεται πριν τους
απογόνους του preorder (w)
Εφαρμογή: εκτύπωση δομημένου
κειμένου
1
Make Money Fast!

2 5 9
1. Motivations 2. Methods References

6 7 8
3 4
2.1 Stock 2.2 Ponzi 2.3 Bank
1.1 Greed 1.2 Avidity
Fraud Scheme Robbery

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


Postorder Διάσχιση (§6.2.4)
Στην postorder διάσχιση, ένας Algorithm postOrder(v)
κόμβος επισκέπτεται μετά από
τους απογόνους του for each child w of v
Εφαρμογή: ο χώρος που postOrder (w)
χρησιμοποιείται από αρχεία σε
ένα κατάλογο και τους visit(v)
υποκαταλόγους του
9
cs16/

8
3 7
todo.txt
homeworks/ programs/
1K

1 2 4 5 6
h1c.doc h1nc.doc DDR.java Stocks.java Robot.java
3K 2K 10K 25K 20K

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


Αποσβενούμενη Ανάλυση
μιας Διάσχισης Δέντρου
Ο χρόνος που χρειάζεται στην preorder ή
postorder διάσχιση ενός n-κόμβων δέντρο είναι
ανάλογος με το σύνολο, για κάθε κόμβο v του
δέντρου, του χρόνου που χρειάζεται για την
αναδρομική κλήση του v.
 Η κλήση του v κοστίζει $(cv + 1), όπου cv είναι ο
αριθμός των παιδιών του v
 Για την κλήση του v, χρεώνεται ένα cyber-δολάριο στο
v και ένα cyber-δολάριο για κάθε παιδί του v.
 Κάθε κόμβος (εκτός της ρίζας) χρεώνεται διπλά: μία για
την κλήση του και μία για την κλήση του γονέα του.
 Άρα, ο χρόνος διάσχισης είναι O(n).

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


Δυαδικά Δέντρα (§6.3)
Ένα δυαδικό δέντρο είναι ένα δέντρο Εφαρμογές:
με τις εξής ιδιότητες:  Αριθμητικές εκφράσεις
 Κάθε εσωτερικός κόμβος έχει δύο
παιδιά
 Διαδικασίες απόφασης
 Τα παιδιά ενός κόμβου είναι ένα  Αναζήτηση
διατεταγμένο ζεύγος
A
Ονομάζουμε τα παιδιά ενός
εσωτερικού κόμβου αριστερό παιδί
και δεξιό παιδί
Εναλλακτικός αναδρομικός ορισμός: B C
ένα δυαδικό δέντρο είναι είτε
 ένα δέντρο με ένα κόμβο, ή
 ένα δέντρο που η ρίζα του έχει ένα D E F G
διατεταγμένο ζεύγος παιδιών, το
καθένα από τα οποία είναι δυαδικό
δέντρο
H I

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


Δέντρο Αριθμητικών
Εκφράσεων
Δυαδικό δέντρο σχετικό με μια αριθμητική έκφραση
 εσωτερικοί κόμβοι: τελεστές
 εξωτερικοί κόμβοι: τελεστέοι
Παράδειγμα: δέντρο αριθμητικής έκφρασης για την
έκφραση (2 (a  1)  (3 b))


 

2  3 b

a 1

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


Δέντρο Απόφασης
Δυαδικό δέντρο σχετικό με μια διαδικασία απόφασης
 εσωτερικοί κόμβοι: ερωτήσεις με yes/no απαντήσεις

 εξωτερικοί κόμβοι: αποφάσεις

Παράδειγμα: απόφαση δείπνου

Want a fast meal?


Yes No

How about coffee? On expense account?


Yes No Yes No

Starbucks In ‘N Out Antoine's Denny’s


Στοιχειώδεις Δομές Δεδομένων 24
Ιδιότητες Δυαδικών Δέντρων
Σημειογραφία Ιδιότητες:
n αριθμός κόμβων  e  i  1

e αριθμός εξωτερικών  n  2e  1
κόμβων
 h i
i αριθμός
εσωτερικών κόμβων  h (n  1)2

h ύψος  e  2h

 h  log e
2

 h  log2 (n  1)  1

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


Inorder Διάσχιση
Σε μια inorder διάσχιση ένας Algorithm inOrder(v)
κόμβος επισκέπτεται μετά το
αριστερό υποδέντρο του και if isInternal (v)
πριν το δεξιό υποδέντρο του inOrder (leftChild (v))
Εφαρμογή: σχεδιασμός
δυαδικού δέντρου
visit(v)
 x(v) = inorder κατάταξη του if isInternal (v)
v
 y(v) = βάθος του v 6 inOrder (rightChild (v))

2 8

1 4 7 9

3 5

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


Euler Tour Διάσχιση
Γενική διάσχιση ενός δυαδικού δέντρου
Περιέχει τις preorder, postorder και inorder διασχίσεις
Περιηγήσου στο δέντρο και επισκέψου κάθε κόμβο τρεις φορές:
 Στα αριστερά (preorder)

 Από κάτω (inorder)

 Στα δεξιά (postorder)

L  R 
B
2  3 2

5 1

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


Εκτύπωση Αριθμητικών Εκφράσεων
Εξειδίκευση μιας inorder διάσχισης Algorithm printExpression(v)
εκτύπωση τελεστή ή τελεστέου
if isInternal (v)

όταν επισκέπτεται ο κόμβος


 εκτύπωση “(” πριν την διάσχιση print(“(’’)
του αριστερού υποδέντρου
 εκτύπωση “)” μετά την διάσχιση inOrder (leftChild (v))
του δεξιού υποδέντρου
print(v.element ())
if isInternal (v)
 inOrder (rightChild (v))
  print (“)’’)

2  3 b
((2 (a  1))  (3 b))
a 1
Στοιχειώδεις Δομές Δεδομένων 28
Διασυνδεδεμένη Δομή Δεδομένων για
Αναπαράσταση Δέντρων (§6.4.3)
Ένας κόμβος αναπαρίσταται
από ένα αντικείμενο που
περιέχει 
 Element
 Parent node B
 Sequence of children nodes
Οι κόμβοι υλοποιούν το
Position ADT  
A D F
B

A D F

C E  
C E
Στοιχειώδεις Δομές Δεδομένων 29
Διασυνδεδεμένη Δομή Δεδομένων για
Δυαδικά Δέντρα (§6.4.2)
Ένας κόμβος
αναπαρίσταται από ένα 
αντικείμενο που περιέχει
 Element
 Parent node
 Left child node B
 Right child node
Οι κόμβοι υλοποιούν το  
Position ADT

B A D

A D    

C E C E

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


Array-Based Αναπαράσταση
Δυαδικών Δέντρων (§6.4.1)
Οι κόμβοι αποθηκεύονται σε ένα πίνακα

1
A

2 3
B D

 έστω rank(node) ορίζεται ως εξής:


 rank(root) = 1 4 5 6 7
 E
αν ο κόμβος είναι το αριστερό παιδί του parent(node), F C J
rank(node) = 2*rank(parent(node))
 αν ο κόμβος είναι το δεξιό παιδί του parent(node),
rank(node) = 2*rank(parent(node))+1 10 11
G H
Στοιχειώδεις Δομές Δεδομένων 31

You might also like