Με βάση τον αφηρημένο αυτό τύπο να υλοποιηθεί πρόγραμμα το οποίο να
διαβάζει μια σειρά χαρακτήρων μέχρι να συναντήσει μια τελεία και στη
συνέχεια να τυπώνει τους χαρακτήρες αυτούς με την αντίστροφη σειρά.
Παράδειγμα:
L
I
V
E
.
E
V
I
L
Περισσότερες λεπτομέρειες για τις ασκήσεις
Δένδρα
Ορισμοί
Ιδιότητες
- Δύο κόμβοι ενώνονται από ένα ακριβώς μονοπάτι
- Ένα δένδρο με Ν κόμβους έχει Ν - 1 ακμές
- Ένα δένδρο βαθμού d και ύψους h μπορεί να έχει sum(0, h-1, d^i) κόμβους.
- Ένα πλήρες δυαδικό δένδρο ύψους h θα έχει 2^h - 1 κόμβους.
- Ένα πλήρες δυαδικό δένδρο με n κόμβους θα έχει log n ύψος.
Υλοποίηση σε Pascal
- Οι ακμές υλοποιούνται με τη χρήση δεικτών της Pascal.
- Τα στοιχεία ομαδοποιούνται με τους δείκτες ως μια εγγραφή.
- Οι εξωτερικοί κόμβοι συμβολίζονται με την ειδική τιμή δείκτη της
Pascal
nil
.
- Μνήμη για κάθε στοιχείο αποκτούμε με τη χρήση της διαδικασίας
new
.
Παράδειγμα:
program bintree;
type
binTree = ^binTreeElem;
binTreeElem = record
val : integer;
left : binTree;
right : binTree;
end;
var
theTree, node : binTree;
begin
new(node);
node^.val := 5;
node^.left := nil;
node^.right := nil;
theTree := node;
new(node);
node^.val := 12;
node^.left := nil;
node^.right := nil;
theTree^.right = node;
end.
Δένδρα αναζήτησης
- Διατεταγμένο είναι ένα δένδρο στο οποίο η διάταξη των κόμβων έχει σημασία
- Σε ένα δυαδικό δένδρο αναζήτησης η τιμή κάθε κόμβου είναι μεγαλύτερη ή
ίση από τις τιμές των κόμβων του αριστερού υποδένδρου και μικρότερη ή
ίση από τις τιμές των κόμβων του δεξιού υποδένδρου.
- Σε ένα τέτοιο δένδρο η αναζήτηση για μια τιμή απαιτεί τόσες συγκρίσεις
όσο είναι και το μέγιστο μήκος μονοπατιού.
Διάσχιση δένδρων
Η διάσχιση ενός δένδρου μπορεί να γίνει με τους παρακάτω τρόπους ανάλογα
με τη σειρά επίσκεψης των κόμβων:
- Προδιαταγμένη διάσχιση (preorder traversal)
-
- επίσκεψη της ρίζας
- επίσκεψη του αριστερού υποδένδρου
- επίσκεψη του δεξιού υποδένδρου
- Μεταδιαταγμένη διάσχιση (postorder traversal)
-
- επίσκεψη του αριστερού υποδένδρου
- επίσκεψη του δεξιού υποδένδρου
- επίσκεψη της ρίζας
- Ενδοδιαταγμένη διάσχιση (inorder traversal)
-
- επίσκεψη του αριστερού υποδένδρου
- επίσκεψη της ρίζας
- επίσκεψη του δεξιού υποδένδρου
- Επίπεδοδιαταγμένη διάσχιση (level order traversal)
-
- επίσκεψη των κόμβων από πάνω προς τα κάτω
Εφαρμογές
- Υλοποίηση δομών αναζήτησης
- Παράσταση συντακτικών δομών (γλώσσες προγραμματισμού και φυσικές γλώσσες)
- Παράσταση ιεραρχικών δομών (κατανεμημένες βάσεις, μοντελοποίηση)
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 81-97
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Alfred V. Aho, John E.
Hopcroft, and Jeffrey D. Ullman.
Data Structures and Algorithms, pages 75–106.
Addison-Wesley, 1983.
- Donald E. Knuth.
The Art of Computer Programming, volume 1 / Fundamental
Algorithms, pages 305–422.
Addison-Wesley, second edition, 1973.
- Robert Sedgewick.
Algorithms in C, pages 35–49.
Addison-Wesley, 1990.
- Niklaus Wirth.
Algorithms and Data Structures, pages 196–217.
Prentice–Hall, 1986.
Ασκήσεις
Άσκηση ADS05
- Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο με τη
χρήση διατεταγμένου δυαδικού δένδρου διαβάζει από το
χρήστη μια σειρά από ονόματα μέχρι να συναντήσει τελεία
και τα εκτυπώνει με αλφαβητική σειρά.
Παράδειγμα:
Pascal
Gauss
Newton
Einstein
.
Einstein
Gauss
Newton
Pascal
Περισσότερες λεπτομέρειες για τις ασκήσεις
Γράφοι
Ορισμοί
- Ένας γράφος (graph) είναι ένα σύνολο από
κόμβους που ενώνονται με ακμές.
- Ο γράφος ορίζεται πλήρως από τους κόμβους και τη συνδεσμολογία τους.
- Αν οι ακμές είναι προσανατολισμένες (ορίζονται δηλαδή από διατεταγμένα
ζεύγη κόμβων) τότε ο γράφος λέγεται κατευθυνόμενος (directed).
- Αν οι ακμές δεν είναι προσανατολισμένες (ορίζονται δηλαδή από μη διατεταγμένα
ζεύγη κόμβων) τότε ο γράφος λέγεται μη κατευθυνόμενος (undirected).
- Αν οι ακμές είναι συνδεδεμένς με κάποια αξία (βάρος)
τότε ο γράφος λέγεται σταθμισμένος (weighted).
- Πλήρης (Complete) ορίζεται ο μη κατευθυνόμενος γράφος
που περιέχει ακμές που ενώνουν κάθε ζεύγος κόμβων.
- Αραιός καλείται ο γράφος που περιέχει λίγες
σχετικά ακμές (λ.χ. για ν κόμβους ο αριθμός των ακμών < ν log ν).
- Πυκνός (Dense) καλείται ο γράφος από τον οποίο
απουσιάζουν λίγες σχετικά ακμές.
Παράσταση
Ένας γράφος μπορεί εύκολα να παρασταθεί με δύο διαφορετικούς τρόπους:
- πίνακα γειτνίασης (adjacency matrix).
- λίστα γειτνίασης (adjacency list).
Και οι δύο τρόποι προϋποθέτουν ένα μονοσήμαντο σύστημα αρίθμησης των κόμβων.
Πίνακας γειτνίασης
Σε έναν γράφο με ν κόμβους ο πίνακας ν*ν γειτνίασης περιέχει 1 στις θέσεις
(κ,λ) όπου υπάρχει ακμή από τον κόμβο κ στον κόμβο λ.
Λίστα γειτνίασης
Κάθε κόμβος συσχετίζεται με μια συνδεδεμένη λίστα γειτνίασης η οποία
περιέχει τα ονόματα των άλλων κόμβων με τους οποίους συνδέεται ο
συγκεκριμένος κόμβος.
Οι λίστες για όλους τους κόμβους ν μπορούν να ξεκινούν από έναν μονοδιάστατο
πίνακα μήκους ν ή από μια άλλη συνδεδεμένη λίστα.
Υλοποίηση σε Pascal
Πίνακας γειτνίασης
program matrixGraph;
const
n = 10; (* Number of nodes *)
var
graph = array [1..n,1..n] of boolean;
...
Λίστα γειτνίασης
program listGraph;
const
n = 10; (* Number of nodes *)
type
adjList = ^adjListElem;
adjListElem = record
node : integer;
next : adjList;
end;
var
graph = array [1..n] of adjList;
...
Πρόσθετοι ορισμοί
- Διαδρομή (path) καλείται μια διάταξη κόμβων οι
οποίοι ενώνονται με ακμές.
- Απλή διαδρομή (simple path) καλείται η παραπάνω
διάταξη όταν κάθε κόμβος εμφανίζεται μια μόνο φορά.
- Κύκλος (cycle) καλείται η διαδρομή δύο ή
περισσοτέρων κόμβων που καταλήγει στον κόμβο αρχής.
- Απόσταση (distance) μεταξύ δύο κόμβων καλείται
το μήκος της συντομότερης διαδρομής που τους ενώνει.
- Διαδρομή Euler (Euler path) καλείται η διαδρομή
ή οποία περνάει από όλες τις ακμές του γράφου ακριβώς μια φορά.
- Διαδρομή Hamilton (Hamilton path) καλείται η διαδρομή
ή οποία περνάει από όλους τους κόμβους του γράφου ακριβώς μια φορά.
- Γράφοι που περιέχουν τις παραπάνω διαδρομές ονομάζονται αντίστοιχα.
- Συνεκτικός (connected) ονομάζεται ο γράφος για τον
οποίο υπάρχει διαδρομή από κάθε κόμβο σε κάθε άλλο κόμβο.
- Βαθμός ενός κόμβου σε έναν μη κατευθυνόμενο γράφο καλείται ο αριθμός
των συνδεδεμένων με αυτόν ακμών.
- Βαθμός εισόδου (in-degree) σε έναν κατευθυνόμενο
γράφο καλείται ο αριθμός των ακμών που καταλήγουν σε αυτόν.
- Βαθμός εξόδου (out-degree) σε έναν κατευθυνόμενο
γράφο καλείται ο αριθμός των ακμών που ξεκινούν από αυτόν.
- Υπογράφος (subgraph) Β ενός γράφου Α καλείται ο
γράφος του οποίου όλες οι ακμές και οι κόμβοι περιέχονται στον Α.
- Δένδρο σκελετός (spanning tree) ενός γράφου καλείται
ο υπογράφος που περιέχει όλους του κόμβους αλλά μόνο όσες ακμές απαιτούνται
για να σχηματιστεί δένδρο.
Προτάσεις σε συνεκτικούς μη κυκλικούς γράφους
Οι παρακάτω προτάσεις είναι ισοδύναμες για πεπερασμένους γράφους με ν > 0
κόμβους:
- Ο γράφος Γ είναι συνεκτικός και μη κυκλικός.
- Αν διαγραφεί οποιαδήποτε ακμή ο γράφος θα πάψει να είναι συνεκτικός.
- Δύο διαφορετικοί κόμβοι συνδέονται από μια και μόνο μια απλή διαδρομή.
- Ο γράφος είναι μη κυκλικός και περιέχει ν - 1 ακμές.
- Ο γράφος είναι συνεκτικός και περιέχει ν - 1 ακμές.
Ψάξιμο κατά βάθος
Για να επισκευθούμε όλους τους κόμβους ενός γράφου με ν κόμβους χρειαζόμαστε
έναν πίνακα λογικών μεταβλητών μιας διάστασης και μήκους ν ο οποίος περιέχει
την τιμή "αληθές" για τους κόμβους τους οποίους έχουμε επισκευθεί.
Η συστηματική επίσκεψη όλων των κόμβων γίνεται σύμφωνα με τα παρακάτω
βήματα:
- Φυλάμε την τιμή "ψευδές" στον πίνακα επισκέψεων.
- Επισκεπτόμαστε όλους τους κόμβους που δεν έχουμε επισκευτεί.
Η επίσκεψη ενός κόμβου γίνεται σύμφωνα με τα παρακάτω βήματα:
- Σημειώνουμε στον πίνακα ότι έχουμε επισκευθεί τον κόμβο.
- Επισκεπτόμαστε όλους τους συνδεδεμένους κόμβους που δεν έχουμε επισκευθεί.
Ο παραπάνω αλγόριμος για γράφο Κ κόμβων και Α ακμών απαιτεί:
- Για γράφο που παριστάνουμε με πίνακα γειτνίασης χρόνο ανάλογο με Κ * Κ.
- Για γράφο που παριστάνουμε με λίστα γειτνίασης χρόνο ανάλογο με Κ + Α.
Εφαρμογές
- Παράσταση διασυνδέσεων ανάμεσα σε αντικείμενα
- Ταξίδια ανάμεσα σε πόλεις
- Συνδέσεις υπολογιστών σε δίκτυο
- Συνδέσεις σελίδων σε υπερκείμενο
- Ανθρώπινες σχέσεις
- Παράσταση ηλεκτρονικών διαγραμμάτων
- Προγραμματισμός εργασιών
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 98-105
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Alfred V. Aho, John E.
Hopcroft, and Jeffrey D. Ullman.
The
Design and Analysis of Computer Algorithms, pages 172–309.
Addison-Wesley, 1974.
- Alfred V. Aho, John E.
Hopcroft, and Jeffrey D. Ullman.
Data Structures and Algorithms, pages 198–252.
Addison-Wesley, 1983.
- Donald E. Knuth.
The Art of Computer Programming, volume 1 / Fundamental
Algorithms, pages 362–378.
Addison-Wesley, second edition, 1973.
- Robert Sedgewick.
Algorithms in C, pages 415–508.
Addison-Wesley, 1990.
Ασκήσεις
Άσκηση ADS06
- Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο
διαβάζει ζεύγη συνδεδεμένων κόμβων ενός γράφου ακεραίων
μέχρι να συναντήσει το ζεύγος (0,0) και στη συνέχεια επισκέπτεται
κατά βάθος όλους τους κόμβους και τυπώνει τον αριθμό τους
στο τέλος της διαδικασίας επίσκεψης.
Παράδειγμα:
5 3
5 2
0 2
4 0
0 5
1 6
1 5
0 0
2
3
5
0
6
1
Αριθμήστε στην τύχη όλα τα ρούχα σας (π.χ. παπούτσια = 1, κάλτσες = 6) και
εκφράστε την έννοια ότι για να φορέσετε το Α πρέπει να έχετε φορέσει το Β
ως ένα ζεύγος (Α, Β) (π.χ. 1 6). Δώστε όλα τα ζεύγη που εκφράζουν τις ανάγκες
σας για να ντυθείτε με λογικό τρόπο και ελέγξτε την σειρά ενδυμασίας που
προτείνει το πρόγραμμα.
(Η ταξινόμιση αυτή ονομάζεται
τοπολογική ταξινόμιση (topological sorting)).
Περισσότερες λεπτομέρειες για τις ασκήσεις
Αναζήτηση
Εισαγωγή
- Οι αλγόριθμοι αναζήτησης (searching algorithms)
επιτρέπουν την εύρεση ενός στοιχείου σε μια δομή δεδομένων με βάση
ένα χαρακτηριστικό του.
- Αν τα στοιχεία είναι οργανωμένα σε
εγγραφές (records) και κάθε μια από αυτές απαρτίζεται από
πεδία (fields) τότε το πεδίο με βάση το οποίο γίνεται
η αναζήτηση ονομάζεται κλειδί (key) της αναζήτησης.
- Το κόστος μιας αναζήτησης εκφράζεται ανάλογα με τον αριθμό συγκρίσεων
που απαιτούνται κατά μέσο όρο για την εύρεση της αναζητούμενης εγγραφής.
Σειριακή αναζήτηση
- Στη σειριακή αναζήτηση (sequential search) η εύρεση
της εγγραφής στον πίνακα γίνεται ελέγχοντας μια-μια τις εγγραφές από
την αρχή μέχρι το τέλος του πίνακα.
- Αν ο πίνακας έχει Ν στοιχεία θα απαιτηθούν κατά μέσο όρο N / 2 συγκρίσεις.
Αναζήτηση κατά ομάδες
- Στην αναζήτηση κατά ομάδες (group search) η εύρεση
της εγγραφής στον πίνακα γίνεται χωρίζοντας τον (ταξινομημένο)
πίνακα σε Μ ομάδες και ελέγχοντας πρώτα σε ποια ομάδα ανήκει η εγγραφή
και στη συνέχει ελέγχοντας μια-μια τις εγγραφές από
την αρχή μέχρι το τέλος της συγκεκριμένης ομάδας.
- Ο βέλτιστος αριθμός ομάδων είναι sqrt(N).
- Αν ο πίνακας έχει Ν στοιχεία και Μ ομάδες θα απαιτηθούν κατά μέσο όρο
Ν/(2Μ) + Μ / 2 συγκρίσεις.
Δυαδική αναζήτηση
- Στη δυαδική αναζήτηση (binary search) η εύρεση
της εγγραφής στον (ταξινομημένο) πίνακα γίνεται αναζητώντας το στοιχείο
στη μέση του πίνακα, στη συνέχεια στη μέση της μέσης κ.ο.κ.
- Αν ο πίνακας έχει Ν στοιχεία θα απαιτηθούν κατά μέσο όρο
log2 N συγκρίσεις.
Αναζήτηση παρεμβολής
- Στη αναζήτηση παρεμβολής (interpolation search) η εύρεση
της εγγραφής στον (ταξινομημένο) πίνακα γίνεται υπολογίζοντας την
πιθανή θέση της εγγραφής σε σχέση με τις τιμές των στοιχείων στα άκρα
της περιοχής αναζήτησης.
Ανάλογα με τη σύγκριση της τιμής της εγραφής με την εγγραφή στην
πιθανή θέση αναπροσαρμόζεται το αντίστοιχο άκρο.
- Αν ο πίνακας έχει στοιχεία ομοιόμορφα κατανεμημένα θα απαιτηθούν
O(log log n) συγκρίσεις.
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 107-118
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Donald E. Knuth.
The Art of Computer Programming, volume 3 / Searching
and Sorting.
Addison-Wesley, second edition, 1973.
- Niklaus Wirth.
Algorithms + Datastructures = Programs. p. 56-72.
Prentice-Hall, 1976.
Ασκήσεις
Άσκηση ADS07
- Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο
με δυαδική αναζήτηση σε πίνακα που περιέχει
όλα τα φωνήεντα να εκτυπώνει αν ένα γράμμα που έδωσε ο χρήστης
είναι φωνήεν ή σύμφωνο.
Παράδειγμα:
A
FONIEN
G
SYMFONO
Περισσότερες λεπτομέρειες για τις ασκήσεις
Ταξινόμηση
Εισαγωγή
- Οι αλγόριθμοι ταξινόμησης (sorting algorithms)
θέτουν τα στοιχεία μιας δομής δεδομένων σε σειρά σύμφωνα με μια
ορισμένη σχέση διάταξης.
- Αν τα στοιχεία είναι οργανωμένα σε
εγγραφές (records) και κάθε μια από αυτές απαρτίζεται από
πεδία (fields) τότε το πεδίο με βάση το οποίο γίνεται
η ταξινόμηση ονομάζεται κλειδί (key) της ταξινόμησης.
- Το κόστος μιας ταξινόμησης εκφράζεται ανάλογα με τον αριθμό συγκρίσεων
και μετακινήσεων που απαιτούνται κατ' ελάχιστο, μέγιστο και κατά μέσο όρο.
- Συχνά για να αποφευχθεί το κόστος των μετακινήσεων αντί για τα
στοιχεία, ταξινομήται ένας πίνακας με δείκτες στα αντίστοιχα στοιχεία.
Ταξινόμηση με παρεμβολή
- Στη ταξινόμηση με παρεμβολή (insertion sort) τα
στοιχεία χωρίζονται σε:
- αυτά τα οποία έχουν ταξινομηθεί,
- αυτό τα οποία θα ταξινομηθεί, και
- αυτά τα οποία δεν έχουν ταξινομηθεί.
- Σε κάθε βήμα το στοιχείο που πρέπει να ταξινομηθεί εισάγεται στη
σωστή θέση αυτών που έχουν ταξινομηθεί.
- Για την εύρεση του σημείου εισαγωγής μπορεί να χρησιμοποιηθεί και ο
αλγόριθμος της δυαδικής αναζήτησης.
- Οι συγκρίσεις που απαιτούνται είνα n-1 ... n*log(n)-exp(n-1) ... (n*n+n)/2-1
- Οι μετακινήσεις που απαιτούνται είναι n ... 1/4(n*n+n+2) ... (n*n+n)/2
Ταξινόμηση με επιλογή
- Στη ταξινόμηση με επιλογή (selection sort) τα
στοιχεία χωρίζονται σε:
- αυτά τα οποία έχουν ταξινομηθεί,
- αυτά τα οποία δεν έχουν ταξινομηθεί.
- Σε κάθε βήμα επιλέγεται το ελάχιστο στοιχείο από αυτά τα οποία
δεν έχουν ταξινομηθεί και εισάγεται στο τέλος των στοιχείων που έχουν
ταξινομηθεί.
- Οι συγκρίσεις που απαιτούνται είνα (n*n-n)/2
- Οι μετακινήσεις που απαιτούνται είναι (n-1)/3 ... n*n/4 + (n-1)/3
Ταξινόμηση με αντιμετάθεση
- Στη ταξινόμηση με αντιμετάθεση (exchange sort) τα
στοιχεία ταξινομούνται με διαδοχική αντιμετάθεση ζευγών που δεν ακολουθούν
τη διάταξη της ταξινόμησης.
- Ο αλγόριθμος μπορεί να βελιτωθεί εναλλάσσοντας σε κάθε πέρασμα
τη φορά του ελέγχου.
- Στην πρώτη περίπτωση ονομάζεται bubble sort (ταξινόμηση
φυσαλίδας), στη δεύτερη shake sort.
Ταξινόμηση με διαμερισμό και αντιμετάθεση
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 119-132
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Donald E. Knuth.
The Art of Computer Programming, volume 3 / Searching
and Sorting.
Addison-Wesley, second edition, 1973.
- Niklaus Wirth.
Algorithms + Datastructures = Programs. p. 73-134.
Prentice-Hall, 1976.
- Sarwar, S. Mansoor, Sarwar, Syed Aqeel, and Brandeburg, Jesse.
Engineering Quicksort.
Computer Languages, 22(1), 1996.
Ασκήσεις
Άσκηση ADS08
- Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο διαβάζει σειρά
από ακεραίους μέχρι να συνατήσει την τιμή 0 και
με ταξινόμηση διαμερισμού τους τυπώνει με αριθμητική σειρά.
Παράδειγμα:
4
6
1
3
0
1
3
4
6
Περισσότερες λεπτομέρειες για τις ασκήσεις
Κατακερματισμός
Εισαγωγή
- Ο κατακερματισμός (hashing) είναι μια
μέθοδος για τη φύλαξη στοιχείων με βάση ένα κλειδί σε γραμμικές δομές
δεδομένων (πίνακες, αρχεία) με στόχο τη γρήγορη ανεύρεσή τους.
- Βασίζεται στη χρήση μιας συνάρτησης απεικόνισης με πεδίο ορισμού
το κλειδί των στοιχείων και πεδίο τιμών τους δείκτες της αντίστοιχης
δομής δεδομένων (λ.χ. ακέραιοι δείκτες σε πίνακα ή δείκτες θέσης σε
αρχείο).
- Σε κάθε σύστημα κατακερματισμού πρέπει να λαμβάνουμε μέριμνα για
την περίπτωση όπου δύο κλειδιά θα συμπίπτουν στην ίδια θέση της δομής μας.
Ορισμοί
Σε ένα σύστημα κατακερματισμού μπορούμε να ορίσουμε τα παρακάτω:
- Ονομάζουμε πυκνότητα κλειδιών (key density) το
λόγο του πληθαρίθμου του συνόλου του πεδίου τιμών
προς τον πληθάριθμο του συνόλου του πεδίου ορισμού της συνάρτησης
κατακερματισμού.
- Η διεύθυνση στην οποία απεικονίζει η συνάρτηση κατακερματισμού το
κλειδί ονομάζεται βασική διεύθυνση (hash address).
- Ονομάζουμε συντελεστή φόρτισης (loading factor) το
λόγο των στοιχείων της δομής που έχουν καταληφθεί προς τα στοιχεία
της δομής που παραμένουν ελεύθερα.
- Συνώνυμα (Synonyms) είναι δύο κλειδιά για τα οποία
η συνάρτηση κατακερματισμού δίνει την ίδια τιμή.
- Η παραπάνω κατάσταση ονομάζεται σύγκρουση (collision).
- Υπερχείλιση (Overflow) είναι η διαδικασία που
εκτελείται για να υπερβούμε το πρόβλημα που δημιουργεί μια σύγκρουση.
- Η συνάρτηση κατακερματισμού καλείται
ομοιόμορφη (uniform) αν είναι ίσες οι πιθανότητες απεικόνισης
κάθε πιθανής τιμής του κλειδιού.
- Τέλος, η συνάρτηση κατακερματισμού καλείται
τέλεια (perfect) αν ο αριθμός των δυνατών κλειδιών ταυτίζεται
με τον πληθάριθμο του πεδίου τιμών της συνάρτησης χωρίς τη δημιουργία
συγκρούσεων.
Συναρτήσεις κατακερματισμού
Η συνάρτηση κατακερματισμού πρέπει να εκτελείται γρήγορα και να είναι
κατά το δυνατό ομοιόμορφη.
Οι παρακάτω είναι μερικές ενδεικτικές μέθοδοι υλοποίησης:
- Λογικές μέθοδοι βασισμένες σε συναρτήσεις όπως η αποκλειστική διάζευξη.
- Πολλαπλασιαστικές μέθοδοι βασισμένες στον πολλαπλασιασμό.
- Χρήση του υπολοίπου.
- Χρήση του μέσου του τετραγώνου.
- Μετατροπή βάσης.
- Διάσπαση του κλειδιού και πρόσθεση των τμημάτων.
- Αναδίπλωση των άκρων.
Οι παραπάνω μέθοδοι μπορούν να χρησιμοποιηθούν και σε συνδυασμό.
Διαχείριση συγκρούσεων
Σε περίπτωση που σημειωθεί μια σύγκρουση υπάρχουν οι παρακάτω επιλογές:
- Απευθείας σύνδεση του στοιχείου που καταλαβάνει τη θέση με το
νέο στοιχείο το οποίο φυλάσσεται σε μια άλλη περιοχή.
- Γραμμική εξέταση: το στοιχείο φυλάσσεται στην πρώτη επόμενη
κενή θέση του αρχείου.
- Δευτεροβάθμια εξέταση: αν η θέση κ είναι γεμάτη το στοιχείο
φυλάσσεται σε κάποια θέση (κ+i*i) mod β όπου i = 1 ...
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 208-221
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Donald E. Knuth.
The Art of Computer Programming, volume 3 / Searching
and Sorting.
Addison-Wesley, second edition, 1973.
- Niklaus Wirth.
Algorithms + Datastructures = Programs. p. 169-280.
Prentice-Hall, 1976.
Ασκήσεις
Άσκηση ADS09 (προαιρετική)
- Να υλοποιηθεί σε Pascal πρόγραμμα το οποίο διαβάζει 5 ακεραίους
και τους αποθηκεύει με κατακερματισμό σε πίνακα 50 θέσεων.
Στην συνέχεια ζητάει κατ' εξακολούθηση από το χρήστη να δώσει έναν ακέραιο
αριθμό και τυπώνει στην οθόνη αν ο αριθμός αυτός ήταν ανάμεσα στους 5 ή όχι.
Το ενδεχόμενο της υπερχείλισης να μην εξεταστεί.
Παράδειγμα:
454
3466
456
23
199
Give number: 123
Not known
Give number: 456
Known
Περισσότερες λεπτομέρειες για τις ασκήσεις
Τεχνικές αρχείων
Εισαγωγή
- Τα δεδομένα στη βοηθητική μνήμη φυλάσσονται ομαδοποιημένα σε
αρχεία (files).
- Η οργάνωση των αρχείων εξαρτάται από την εφαρμογή που τα
δημιουργεί και τα διαβάζει.
Τα παρακάτω αποτελούν παραδείγματα περιεχομένου ενός αρχείου:
- Αδόμητο κείμενο
- Πηγαίος κώδικας (λ.χ. Pascal)
- Εκτελέσιμο πρόγραμμα
- Αρχείο βάσης δεδομένων
- Αρχείο δεδομένων εφαρμογής (λ.χ. Word, Excel)
- Αρχεία τα οποία περιέχουν ομοειδή στοιχεία οργανώνονται με βάση τις
εγγραφές.
- Κάθε εγγραφή περιέχει έναν αριθμό από πεδία τα οποία χαρακτηρίζονται
από το μήκος τους και τον τύπο των δεδομένων που περιέχουν.
Για λόγους ευκολίας αναφερόμαστε στα πεδία με βάση κάποιο όνομα ανάλογα με
τα δεδομένα που περιέχουν (π.χ. ΟΝΟΜΑ, ΥΠΟΛΟΙΠΟ).
- Η διάταξη των πεδίων στην εγγραφή καθώς και το είδος των πεδίων
ενός αρχείου καλείται γραμμογράφηση (layout) του αρχείου.
Βοηθητική μνήμη
- Βασικές τεχνολογίες βοηθητικής μνήμης είναι:
- οι μαγνητικές ταινίες,
- οι μαγνητικοί δίσκοι,
- οι οπτικοί δίσκοι (CD-ROM, DVD),
- οι μαγνητο-οπτικοί δίσκοι.
- Ανάλογα με την τεχνολογία βοηθητικής μνήμης στα
δεδομένα των αρχείων μπορούμε να έχουμε
σειριακή προσπέλαση (serial access) (λ.χ. μαγνητική ταινία) ή
τυχαία προσπέλαση (random access) (λ.χ. μαγνητικός δίσκος).
- Τα δεδομένα στο μαγνητικό δίσκο είναι οργανωμένα σε
κυλίνδρους, (cylinders)
αυλάκια (tracks),
και
τομείς (sectors).
- Πρόσβαση στα στοιχεία ενός αρχείου γίνεται μέσω μιας ιεραρχίας
λογισμικού που μπορεί να περιλαμβάνει:
- το λογισμικό της εφαρμογής,
- το ενδιάμεσο λογισμικό (middleware),
- το λογισμικό της βάσης δεδομένων ή αντίστοιχες βιβλιοθήκες,
- το λειτουργικό σύστημα και συγκεκριμένα το σύστημα αρχείων,
- τον οδηγό συσκευής,
- το λογισμικό ελέγχου της συσκευής (firmware).
- Σημασία στην υλοποίηση του τρόπου χειρισμού των αρχείων έχει η ταχύτητα
των μονάδων βοηθητικής μνήμης.
Αυτή είναι της τάξης των ms σε αντιπαράθεση με την ταχύτητα
της κύριας μνήμης η οποία είναι της τάξης των δεκάδων ns.
Επεξεργασία σειριακών αρχείων
- Εφαρμογές που επεξεργάζονται σειριακά αρχεία (λ.χ. αρχεία που
φυλάσσονται σε μαγνητικές ταινίες) είναι δομημένες με βάση διεργασίες
που διαβάζουν σειριακά ένα ή περισσότερα αρχεία και παράγουν,
σειριακά, νέα αρχεία.
- Ο όγκος των στοιχείων στις εφαρμογές αυτές φυλάσσεται στο
κύριο αρχείο (master file)
ενώ οι συναλλαγές κάθε ημέρας ή περιόδου φυλάσσονται στο
αρχείο μεταβολών (transaction file)
- Στα αρχεία αυτά διακρίνουμε τις παρακάτω διεργασίες:
- Σύζευξη (merge):
ένωση δύο σειριακών ταξινομημένων αρχείων σε τρίτο ταξινομημένο.
- Ταξινόμηση (sort): Ταξινόμηση των εγγραφών του
αρχείου με βάση κάποιο κλειδί της εγγραφής.
Η ταξινόμηση πραγματοποιείται συνήθως στην κύρια μνήμη.
Αν τα δεδομένα δε χωράνε στην κύρια μνήμη ταξινομείται το αρχείο
ανά τμήματα τα οποία στη συνέχεια ενώνονται με σύζευξη.
- Ενημέρωση (update):
ενημέρωση του ταξινομημένου κυρίου αρχείου με βάση το αρχείο μεταβολών.
- Ερώτηση (query)
δημιουργία αρχείου που περιέχει τα δεδομένα που ικανοποιούν κάποιο κριτήριο.
- Αναφορά (report):
δημιουργία μιας διαμορφωμένης αναφοράς από τα στοιχεία του αρχείου.
Αρχεία τυχαίας προσπέλασης
- Τα αρχεία τυχαίας προσπέλασης είναι συνήθως οργανωμένα σε
πίνακες με βάση το σχεσιακό μοντέλο.
- Τα προγράμματα βάσεων δεδομένων επιτρέπουν την οργάνωση μη
προκαθορισμένων στοιχείων σε αρχεία τυχαίας προσπέλασης.
- Για γρήγορη πρόσβαση στα στοιχεία κάθε πίνακα χρησιμοποιούνται
βοηθητικές δομές αναζήτησης με δείκτες στους κυρίους πίνακες.
- Τέτοιες δομές μπορεί να είναι:
- ταξινομημένοι πίνακες για στοιχεία που δε μεταβάλλονται,
- πίνακες κατακερματισμού,
- δένδρα.
- Στα αρχεία αυτά υπάρχει συνήθως σύστημα το οποίο οργανώνει τη
διάθεση του ελεύθερου χώρου που προέρχεται από διαγραφές.
- Οι αλλαγές στο κύριο αρχείο γίνονται συνήθως άμεσα.
Παράλληλα ενημερώνεται και ένα αρχείο συναλλαγών το οποίο επιτρέπει
την ακύρωση συναλλαγών ή την επανεκτέλεσή τους σε παλαιότερο αρχείο
συναλλαγών.
Βιβλιογραφία
- Χρήστος Κοίλιας
Δομές Δεδομένων και Οργανώσεις Αρχείων. σ. 208-221
Εκδόσεις Νέων Τεχνολογιών, 1993.
- Peter Pin-Shan Chen.
The entity-relationship model --- toward a unified view of data.
ACM Transactions on Database Systems, 1(1):9-36, March 1976.
- Henry F. Korth and Abraham Silberschatz.
Database System Concepts.
McGraw-Hill, second edition, 1991.
Θέματα εξετάσεων
Εργαστήριο αυτοαξιολόγησης
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
ΑΛΓΟΡΙΘΜΟΙ
ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
(Εργαστήριο
αυτοαξιολόγησης)
Διδάσκων: Διομήδης Σπινέλλης
| 15 Απριλίου 1997
|
Θέμα
1ο:
- Για
κάθε ένα από
τα παρακάτω
είδη πινάκων
να γραφεί
σε ψευδοκώδικα
μια συνάρτηση
η οποία δέ÷εται
ως όρισμα
έναν πίνακα
Ν*Ν και να επιστρέφει
αληθές η ψευδές
ανάλογα με
τον αν ο πίνακας
ανήκει στο
συγκεκριμένο
είδος:
- Συμμετρικός
- Τριγωνικός
- Τριδιαγώνιος
- Αραιός
(πλήρης κατά
λιγότερο από
10%)
Θέμα
2ο:
- Ορίστε
σε Pascal τις διαδικασίες
και συναρτήσεις
πρόσβασης
σε μια στοίβα
συμβολοσειρών
ως αφηρημένο
τύπο (μην τις
υλοποιήσετε!)
- Με δεδομένες
τις παραπάνω
να γραφεί
πρόγραμμα
το οποίο να
διαβάζει μια
σειρά από λέξεις
από το ÷ρήστη
μέ÷ρι να συναντήσει
τελεία και
να τις τυπώνει
με ανάποδη
σειρά.
Θέμα
3ο:
- Ορίστε
μια συνδεδεμένη
λίστα ÷αρακτήρων
σε Pascal.
- Υλοποιήστε
συνάρτηση
η οποία δέ÷εται
ως όρισμα
την παραπάνω
συνδεδεμένη
λίστα και επιστρέφει
τον αριθμό
των στοι÷είων
που την απαρτίζουν.
Θέμα
4ο:
- Ορίστε
ένα δυαδικό
δένδρο ακεραίων
σε Pascal.
- Υλοποιήστε
συνάρτηση
η οποία να δέ÷εται
ως όρισμα
τον παραπάνω
δένδρο και
έναν ακέραιο
και να επιστρέφει
αληθές αν
ο ακέραιος
αυτός αποτελεί
στοι÷είο του
δένδρου.
- Υπολογίστε
πόσους το πολύ
κόμβους μπορεί
να έ÷ει ένα
δένδρο βαθμού
d και ύψους
h.
Διάρκεια εξέτασης 1.5 ώρα.
| Καλή επιτυ÷ία!
|
Εξεταστική περιόδος Ιουνίου 1997
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
Διδάσκων: Διομήδης Σπινέλλης
| Εξεταστική περίοδος
Ιουνίου 1997
|
Θέμα
1ο:
Να υλοποιηθεί
σε Pascal ο αφηρημένος
τύπος της στοίβας
λογικών τιμών
σύμφωνα
με τις παρακάτω
συναρτήσεις:
{ Αρχικοποιείται η στοίβα }
procedure stackInitialize;
{ Το στοιχείο i εισάγεται στην κορυφή της στοίβας }
procedure stackPush(i :boolean);
{ Το στοιχείο από την κορυφή της στοίβας αφαιρείται και επιστρέφεται }
function stackPop : boolean;
{ Επιστρέφεται αληθές αν η στοίβα είναι κενή }
function stackIsEmpty : bool;
Η στοίβα
να φυλάσσεται
σε πίνακα 2000
θέσεων.
Θέμα
2ο:
- Ορίστε
ποιο γράφο ονομάζουμε
συνεκτικό
και ποιο μη
κυκλικό.
- Σχεδιάστε
γραφικά ένα
συνεκτικό,
μη κυκλικό
γράφο με 8 κόμβους
και 7 ακμές.
- Ποιες
από τις παρακάτω
προτάσεις
είναι αληθείς
για έναν συνεκτικό
μη κυκλικό
γράφο με ν >
0 κόμβους:
- Αν διαγραφεί
οποιαδήποτε
ακμή ο γράφος
θα πάψει να
είναι συνεκτικός.
- Δύο διαφορετικοί
κόμβοι συνδέονται
από τουλάχιστον
μια απλή διαδρομή.
- Ο γράφος
περιέχει ν
+ 1 ακμές.
- Αν προστεθεί
οποιαδήποτε
ακμή ο γράφος
θα αποκτήσει
μια τουλάχιστον
κυκλική διαδρομή.
- Ο γράφος
περιέχει λιγότερες
από 2ν ακμές.
- Αν προστεθεί
οποιαδήποτε
ακμή ο γράφος
θα πάψει να
είναι συνεκτικός.
- Δύο διαφορετικοί
κόμβοι συνδέονται
από μια και
μόνο μια απλή
διαδρομή.
- Ο γράφος
περιέχει ν
- 1 ακμές.
- Αν διαγραφεί
οποιαδήποτε
ακμή ο γράφος
θα αποκτήσει
μια τουλάχιστον
κυκλική διαδρομή.
Θέμα
3ο:
- Ορίστε
μια διπλά συνδεδεμένη
λίστα ακεραίων
σε Pascal.
- Υλοποιήστε
συνάρτηση
η οποία δέχεται
ως όρισμα
την παραπάνω
διπλά συνδεδεμένη
λίστα και ένα
ακέραιο αριθμό
που υπάρχει
στη λίστα και
επιστρέφει
το μέσο όρο:
του αριθμού
αυτού, του αριθμού
που προηγείται
από αυτόν στη
λίστα και του
αριθμού που
τον ακολουθεί.
Αν δεν υπάρχει
προηγούμενος
ή επόμενος
αριθμός ο
μέσος όρος
να υπολογιστεί
από τους υπόλοιπους
αριθμούς.
Θέμα
4ο:
Τα ονόματα
των κατόχων
και τα αντίστοιχα
τηλέφωνα των
5.328.690 συνδέσεων
που παρέχει
ο ΟΤΕ πρέπει
να καταχωρηθούν
σε δομή δεδομένων
που να επιτρέπει
την ταχύτερη
δυνατή εύρεση
του τηλεφώνου
με βάση το όνομα.
Ποια δομή δεδομένων
θα χρησιμοποιήσετε;
Ποια δομή δεδομένων
θα χρησιμοποιήσετε
αν επιπλέον
απαιτείται
η άμεση ταξινομημένη
ανάκτηση των
ονομάτων για
την εκτύπωση
των τηλεφωνικών
καταλόγων.
Διάρκεια εξέτασης 2 ώρες
| Καλή επιτυχία!
|
Εξεταστική περιόδος Σεπτεμβρίου 1997
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
Διδάσκων: Διομήδης Σπινέλλης
| Εξεταστική περίοδος
Σεπτεμβρίου 1997
|
Θέμα
1ο:
Να υλοποιηθεί
σε Pascal ο αφηρημένος
τύπος της συνδεδεμένης
λίστας χαρακτήρων
σύμφωνα με
τις παρακάτω
συναρτήσεις:
{ Ορισμός του τύπου της συνδεδεμένης λίστας }
type
charList = ...
{ Επιστρέφεται μια άδεια συνδεδεμένη λίστα }
function newCharList : charList;
{ Επιστρέφεται μια συνδεδεμένη λίστα με το στοιχείο c στην αρχή της }
function addCharList(l : charList; c : char) : charList;
{ Επιστρέφεται μια συνδεδεμένη λίστα με το πρώτο στοιχείο διαγραμμένο. Κατά
την επιστροφή η μεταβλητή c περιέχει την τιμή του. }
function delCharListHead(l : charList; var c : char) : charList;
{ Επιστρέφεται ένας δείκτης στο στοιχείο της λίστας που έχει την τιμή c }
function searchCharList(l : charList; c : char) : charList;
{ Επιστρέφεται αληθές αν η λίστα είναι κενή }
function isEmtyCharList(l : charList) : boolean;
Θέμα
2ο:
- Τι ονομάζουμε
βαθμό και
τι ύψος ενός
δένδρου;
- Πότε
ένα δένδρο
καλείται πλήρες;
- Αποδείξτε
τις παρακάτω
προτάσεις.
Στην απόδειξη
μπορεί να σας
φανεί χρήσιμη
η μέθοδος της
επαγωγής.
- Ένα
πλήρες δένδρο
βαθμού d και
ύψους h θα
έχει κόμβους.
- Ένα
πλήρες δυαδικό
δένδρο ύψους
h θα έχει κόμβους.
- Ένα
πλήρες δυαδικό
δένδρο με n
κόμβους θα
έχει ύψος.
Θέμα
3ο:
- Περιγράψτε
με πληρότητα
έναν αποδοτικό
τρόπο ταξινόμησης
αρχείου του
οποίου τα στοιχεία
δε χωράνε στην
κεντρική μνήμη.
- Περιγράψτε
περιληπτικά
δομές αναζήτησης
που μπορούν
να χρησιμοποιηθούν
για γρήγορη
πρόσβαση στα
στοιχεία ενός
αρχείου που
φυλάσσεται
σε βοηθητική
μνήμη.
Θέμα
4ο:
- Περιγράψτε
με ψευδοκώδικα
τη διαδικασία
της δυαδικής
αναζήτησης
για την εύρεση
μιας εγγραφής
σε ταξινομημένο
πίνακα.
- Αν ο
πίνακας έχει
Ν στοιχεία
δώστε τον ελάχιστο
και το μέγιστο
αριθμό συγκρίσεων
που μπορεί
να απαιτηθούν
για την παραπάνω
διαδικασία
αναζήτησης.
.
Διάρκεια εξέτασης 2.5 ώρες
| Καλή επιτυχία!
|