YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

Transcript
Page 1: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ

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

ΣΗΜΕΙΩΣΕΙΣ ΜΑΘΗΜΑΤΟΣ &

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ

Επιμέλεια

Δρ Τσακνάκης Ιωάννης

Επίκουρος Καθηγητής

Ναύπακτος, 20 Φεβρουαρίου 2014

Page 2: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

2

ΠΕΡΙΕΧΟΜΕΝΑ

ΠΕΡΙΕΧΟΜΕΝΑ ......................................................................................................... 2

ΠΡΟΛΟΓΟΣ ................................................................................................................. 5

ΚΕΦΑΛΑΙΟ 1. ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ .............................. 7

1.1 Εισαγωγή ............................................................................................................. 7

1.2 Ορισμός του προβλήματος ................................................................................... 8

1.3 Επίλυση προβλημάτων – Ανάπτυξη αλγορίθμων ................................................ 8

1.3.1 Ορισμός αλγορίθμου .................................................................................. 8

1.3.2 Αναπαράσταση αλγορίθμων ....................................................................... 9

1.3.3 Παράδειγμα ανάπτυξης αλγορίθμου ........................................................ 11

1.3.4 Ανάλυση αλγορίθμων ............................................................................... 13

1.3.5 Μορφή ακολουθιών εντολών στους αλγορίθμους .................................... 14

1.3.6 Είδη αλγορίθμων ..................................................................................... 15

1.4 Δομές δεδομένων ............................................................................................... 15

1.4.1 Βασικά παραδείγματα δομών δεδομένων ................................................ 16

Πίνακες (Arrays) ........................................................................................ 16

Στοίβα (Stack) ............................................................................................ 16

Ουρά (Queue) ............................................................................................ 17

Γραμμικές Λίστες (Linear Lists) ................................................................ 17

Δέντρα (Trees) ........................................................................................... 17

Ουρά προτεραιότητας (Priority queue) ...................................................... 18

Γράφοι (graphs) ......................................................................................... 18

Ερωτήσεις- Ασκήσεις Κεφαλαίου ........................................................................... 18

ΚΕΦΑΛΑΙΟ 2. ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ...................................... 19

2.1 Πίνακες .............................................................................................................. 19

2.1.1 Μερικοί τύποι πινάκων ............................................................................ 20

2.1.2 Συμβολοσειρές ......................................................................................... 21

2.2 Στοίβες ............................................................................................................... 22

2.2.1 Αλγόριθμος υλοποίησης στοίβας .............................................................. 23

Πράξη Push ................................................................................................ 24

Πράξη Pop ................................................................................................. 24

2.2.2 Εφαρμογές Στοίβας – Πολωνικός συμβολισμός ...................................... 25

Μετατροπή ένθετης παράστασης χωρίς παρενθέσεις σε μεταθετική ........ 26

Μετατροπή ένθετης παράστασης με παρενθέσεις σε μεταθετική ............. 27

Υπολογισμός παραστάσεις μεταθετικής μορφής ....................................... 28

2.3 Ουρές ................................................................................................................. 29

2.3.1 Αλγόριθμοι υλοποίησης ουράς ................................................................. 30

Απλή μορφή υλοποίησης ουράς pipeline με χρήση πινάκων .................... 31

Ουρά δακτυλίου ......................................................................................... 34

2.4 Λίστες................................................................................................................. 34

2.4.1 Εφαρμογές ............................................................................................... 35

2.4.2 Κατηγορίες λιστών ................................................................................... 35

2.4.3 Βασικές πράξεις σε λίστες ........................................................................ 36

2.4.4 Υλοποίηση αλγορίθμων των βασικών πράξεων ....................................... 37

Εισαγωγή στοιχείου ................................................................................... 38

Διαγραφή στοιχείου. .................................................................................. 40

Page 3: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

3

Σάρωση λίστας ........................................................................................... 41

Αναζήτηση στοιχείου ................................................................................. 42

Συνένωση λιστών ....................................................................................... 42

Αντιστροφή λίστας..................................................................................... 43

Ερωτήσεις- Ασκήσεις Κεφαλαίου ........................................................................... 43

ΚΕΦΑΛΑΙΟ 3. ΜΗ ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ .............................. 45

3.1 Δένδρα ............................................................................................................... 45

3.1.1 Γενική περιγραφή - Ορισμοί .................................................................... 45

3.1.2 Υλοποίηση δένδρου .................................................................................. 47

Υλοποίηση με πίνακα ................................................................................ 47

Υλοποίηση με εγγραφές ............................................................................. 48

3.1.3 Μέθοδοι διάσχισης δένδρων .................................................................... 48

Προδιάταξη (preorder) ............................................................................... 48

Μεταδιάταξη (Postorder) ........................................................................... 49

Μεταδιάταξη (Postorder) ........................................................................... 49

Συμμετρική διάταξη (Symmetric order ή inorder)..................................... 49

Εφαρμογή μετατροπής παραστάσεων στον πολωνικό συμβολισμό .......... 50

3.1.4 Νηματοειδή δένδρα .................................................................................. 50

3.1.5 Υλοποίηση αλγορίθμων των βασικών πράξεων ....................................... 51

Εισαγωγή (insert) ....................................................................................... 52

Σάρωση δένδρου ........................................................................................ 54

Αναζήτηση (search) ................................................................................... 54

Διαγραφή (deletion) ................................................................................... 55

3.1.6 Ισοζυγισμένα δένδρα ................................................................................ 57

3.2 Γράφοι ................................................................................................................ 57

3.2.1 Τι είναι γράφος ........................................................................................ 57

3.2.2 Βασικοί κανόνες απεικόνισης γράφων..................................................... 57

3.2.3 Βασικές κατηγορίες γράφων .................................................................... 59

Πολλαπλοί γράφοι ..................................................................................... 59

Ισομορφικοί γράφοι ................................................................................... 60

Επίπεδοι γράφοι. ........................................................................................ 60

Πλήρης γράφος .......................................................................................... 61

Διμερής γράφος .......................................................................................... 61

Συμπληρωματικοί γράφοι .......................................................................... 61

3.2.4 Διαπερατότητα ......................................................................................... 62

Γράφος Euler .............................................................................................. 63

Γράφος Hamilton ....................................................................................... 63

Συνεκτικός γράφος ..................................................................................... 63

Κατευθυνόμενοι και μη κατευθυνόμενοι γράφοι ...................................... 64

3.2.5 Συνεκτικότητα .......................................................................................... 65

Ερωτήσεις- Ασκήσεις Κεφαλαίου ........................................................................... 65

ΚΕΦΑΛΑΙΟ 4. ΑΝΑΖΗΤΗΣΗ ΚΑΙ ΤΑΞΙΝΟΜΗΣΗ ΣΤΟΙΧΕΙΩΝ .................. 68

4.1 Αναζήτηση ......................................................................................................... 68

4.1.1 Γραμμική αναζήτηση (sequential search) ............................................... 68

4.1.2 Αναζήτηση κατά ομάδες (Block search) .................................................. 69

4.1.3 Δυαδική αναζήτηση (Binary search) ....................................................... 70

4.1.4 Αναζήτηση παρεμβολής (interpolation search) ....................................... 70

4.2 Ταξινόμηση ........................................................................................................ 71

Page 4: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

4

4.2.1 Ταξινόμηση Φυσαλίδας (Bubble Sort) ..................................................... 72

4.2.2 Ταξινόμηση με Εισαγωγή (Insertion Sort) ............................................... 73

4.2.3 Ταξινόμηση με Επιλογή (Selection Sort) ................................................. 74

4.2.4 Ταξινόμηση Σωρού (Heap Sort) .............................................................. 74

4.2.5 Ταξινόμηση με Συγχώνευση (Merge Sort) ............................................... 75

4.2.6 Γρήγορη Ταξινόμηση (Quick Sort) .......................................................... 75

4.2.7 Ταξινόμηση με Μέτρηση (Counting Sort) ................................................ 76

4.2.8 Radix Sort................................................................................................ 77

4.2.9 Εξωτερική Ταξινόμηση (External Sorting).............................................. 77

Ερωτήσεις- Ασκήσεις Κεφαλαίου ........................................................................... 77

ΠΑΡΑΡΤΗΜΑ Α. ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ............................................. 79

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 1.Αλγορίθμοι – Πίνακες ........................................... 80

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 2. Στοίβες ................................................................. 82

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 3. Εφαρμοφές Στοίβας ............................................. 83

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 4. Ουρές ................................................................... 84

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 5. Λίστες................................................................... 88

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 6. Δημιουργία δυαδικού κομβοπροσανατολισμένου

δένδρου αναζήτησης ................................................................................................ 90

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 7. Υλοποίηση βασικών πράξεων σε δυαδικό

κομβοπροσανατολισμένο δένδρο αναζήτησης ........................................................ 92

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 8. Δημιουργία ισοζυγισμένου δυαδικού

κομβοπροσανατολισμένου δένδρου αναζήτησης .................................................... 95

ΒΙΒΛΙΟΓΡΑΦΙΑ ....................................................................................................... 97

Page 5: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

5

ΠΡΟΛΟΓΟΣ

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

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

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

απαιτεί 3 στάδια, τον σαφή ορισμό του προβλήματος, την λύση του προβλήματος

μέσω μίας ακριβής ακολουθίας βημάτων και την εισαγωγή της επίλυσης του

προβλήματος (βημάτων) στον υπολογιστή και την επίλυση του (πρόγραμμα). Παρά

το γεγονός ότι ο προγραμματισμός αναφέρεται στο τρίτο στάδιο πρέπει να

κατανοηθεί ότι τα πρώτα δύο στάδια είναι εξίσου σημαντικά. Η μεθοδολογία

ανάπτυξης της επίλυσης του προβλήματος αποτελεί τον αλγόριθμο ενώ ο τρόπος με

τον οποίο οργανώνονται τα δεδομένα σε ομάδες ονομάζονται δομές δεδομένων. Οι

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

προγράμματος. Οι τεχνικές που θα χρησιμοποιηθούν στην υλοποίηση του αλγορίθμου

και η επιλογή των κατάλληλων δομών δεδομένων προδιαγράφουν ουσιαστικά την

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

Αντικείμενο των σημειώσεων αποτελεί η εισαγωγή των σπουδαστών στις

βασικές αρχές των Δομών Δεδομένων, να παρουσιάσει τις πιο βασικές από αυτές που

χρησιμοποιούνται τόσο στην κύρια όσο και στην δευτερεύουσα μνήμη. Ιδιαίτερα, οι

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

αλγορίθμους υλοποίησης τους.

Πιο συγκεκριμένα, στο Κεφάλαιο 1, γίνεται μία σύντομη παρουσίαση των

βασικών εννοιών των αλγορίθμων και των δομών δεδομένων. Αρχικά τονίζονται οι

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

ανάπτυξης της επίλυσης ενός προβλήματος εισάγοντας την έννοια του αλγορίθμου.

Δίνεται ως παράδειγμα ο αλγόριθμος επίλυσης του προβλήματος εύρεσης του

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

αλγορίθμων και της μέτρησης της απόδοσης/πολυπλοκότητας τους ενώ

παρουσιάζεται και η μορφή των ακολουθιών εντολών στους αλγορίθμους. Παρακάτω

περιγράφεται ο τρόπος με τον οποίο οργανώνονται τα δεδομένα σε ομάδες που

ονομάζονται δομές δεδομένων για την αποτελεσματική χρήση τους στην ανάπτυξη

των αλγορίθμων αλλά και στην διαδικασία του προγραμματισμού στη συνέχεια.

Αρχικά περιγράφονται οι συνηθισμένες λειτουργίες πάνω στις δομές δεδομένων και

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

Στο Κεφάλαιο 2, παρουσιάζονται οι πιο βασικές γραμμικές δομές δεδομένων

που χρησιμοποιούνται τόσο στην κύρια όσο και στην δευτερεύουσα μνήμη. Πιο

συγκεκριμένα, αρχικά περιγράφεται η πιο απλή και συχνά χρησιμοποιούμενη δομή, ο

πίνακας. Στη συνέχεια αναλύεται η στοίβα, οι βασικές αρχές λειτουργίας της και οι

βασικές πράξεις push και pop. Παράλληλα, περιγράφονται μερικές εφαρμογές της

στοίβας όπως είναι η μετατροπή παραστάσεων στον πολωνικό συμβολισμό. Αμέσως

μετά περιγράφεται η ουρά, οι διαφορές της με την στοίβα και οι βασικές της πράξεις

Dequeue και Enqueue. Τέλος, αναλύονται οι λίστες δίνοντας έμφαση στις πράξεις

εισαγωγής, αναζήτησης και διαγραφής σε απλή διασυνδεμένη λίστα. Σε όλες τις

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

Στο Κεφάλαιο 3, περιγράφονται οι μη γραμμικές δομές όπως τα δέντρα και οι

γράφοι. Αρχικά δίνεται ιδιαίτερη έμφαση στα δένδρα ως οι πιο βασικές δομές

δεδομένων στην υλοποίηση εφαρμογών λόγω της αποδοτικότητας τους στην

εκτέλεση πράξεων σε μεγάλου όγκου δεδομένα. Ιδιαίτερα παρουσιάζεται η

Page 6: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

6

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

αναζήτησης. Στη συνέχεια περιγράφονται οι βασικές κατηγορίες γράφων καθώς και

βασικές έννοιες τους όπως η διαπερατότητα και η συνεκτικότητα τους.

Στα προηγούμενα κεφάλαια περιγράψαμε τον τρόπο με τον οποίο τα δεδομένα

οργανώνονται μεταξύ τους και ομαδοποιούνται σε δομές δεδομένων ώστε στη

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

απαιτούμενες πράξεις. Στην περιγραφή κάθε δομής δεδομένων αναλύσαμε τις πράξεις

ένθεσης και απώθησης χωρίς να δώσουμε ιδιαίτερη βαρύτητα στις πράξεις

αναζήτησης και ταξινόμησης που αποτελούν και το αντικείμενο αυτού του

κεφαλαίου. Στο κεφάλαιο 4 αρχικά θα αναλύσουμε τις πιο βασικές μεθόδους

αναζήτησης που εφαρμόζονται τόσο στην κύρια μνήμη όσο και στην βοηθητική. Στη

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

χρησιμοποιούνται και χωρίζονται στις βασιζόμενες στις συγκρίσεις (comparison

based) και σε εκείνες που βασίζονται στην πληροφορία εισόδου.

Page 7: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

7

ΚΕΦΑΛΑΙΟ 1. ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ

ΔΕΔΟΜΕΝΩΝ

Σκοπός του κεφαλαίου αυτού είναι να γίνει μία σύντομη παρουσίαση των

σπουδαστών στις βασικές έννοιες των αλγορίθμων και των δομών δεδομένων.

Αρχικά τονίζονται οι βασικές αρχές ορισμού ενός προβλήματος. Στην συνέχεια

ορίζεται η μεθοδολογία ανάπτυξης της επίλυσης ενός προβλήματος εισάγοντας την

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

προβλήματος εύρεσης του μέγιστου κοινού διαιρέτη. Παράλληλα περιγράφεται ο

τρόπος ανάλυσης των αλγορίθμων και της μέτρησης της απόδοσης/πολυπλοκότητας

τους ενώ παρουσιάζεται και η μορφή των ακολουθιών εντολών στους αλγορίθμους.

Παρακάτω περιγράφεται ο τρόπος με τον οποίο οργανώνονται τα δεδομένα σε ομάδες

που ονομάζονται δομές δεδομένων για την αποτελεσματική χρήση τους στην

ανάπτυξη των αλγορίθμων αλλά και στην διαδικασία του προγραμματισμού στη

συνέχεια. Αρχικά περιγράφονται οι συνηθισμένες λειτουργίες πάνω στις δομές

δεδομένων και στη συνέχεια γίνεται μία συνοπτική παρουσίαση των σπουδαιότερων

από αυτές.

1.1 Εισαγωγή

Αρκετές φορές, στα προηγούμενα κεφάλαια, έχουν αναφερθεί οι όροι

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

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

υπολογιστές είναι η διαδικασία με την οποία ο χρήστης ορίζει στον υπολογιστή τον

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

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

τέτοιο τρόπο ώστε να μπορεί στη συνέχεια να εκτελέσει τα βήματα επίλυσης ο

υπολογιστής.

Γενικά θα μπορούσε να θεωρηθεί ότι η επίλυση ενός προβλήματος απαιτεί 3

στάδια:

1. Τον σαφή ορισμό του προβλήματος.

2. Την λύση του προβλήματος μέσω μίας ακριβής ακολουθίας βημάτων

3. Την εισαγωγή της επίλυσης του προβλήματος (βημάτων) στον υπολογιστή και

την επίλυση του

Ο προγραμματισμός επικεντρώνεται στο 3 στάδιο, δηλαδή στην μετατροπή της

επίλυσης του προβλήματος και της ακολουθίας βημάτων είτε σε μία ακολουθία

εντολών άμεσα αναγνωρίσιμη από τον υπολογιστή είτε σε μία ενδιάμεση γλώσσα

εύχρηστη και φιλική από τον χρήστη η οποία μπορεί στη συνέχεια να μεταγλωττισθεί

σε εντολές που αναγνωρίζει ο υπολογιστής και ανήκουν στην γλώσσα μηχανής του

συγκεκριμένου υπολογιστή.

Παρά το γεγονός ότι ο προγραμματισμός αναφέρεται στο τρίτο στάδιο πρέπει να

κατανοηθεί ότι τα πρώτα δύο στάδια είναι εξίσου σημαντικά. Έτσι στο κεφάλαιο

αυτό θα επικεντρωθούμε και στα τρία στάδια.

Αρχικά θα περιγραφούν οι βασικές αρχές με τις οποίες πρέπει να ορίζεται ένα

πρόβλημα. Στην συνέχεια θα οριστεί η μεθοδολογία ανάπτυξης της επίλυσης του

προβλήματος εισάγοντας την έννοια του αλγορίθμου. Παράλληλα θα περιγραφεί ο

Page 8: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

8

τρόπος με τον οποίο οργανώνονται τα δεδομένα σε ομάδες που ονομάζονται δομές

δεδομένων για την αποτελεσματική χρήση τους στην ανάπτυξη των αλγορίθμων

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

ιδιαίτερη σημασία στις γλώσσες προγραμματισμού που αποτελούν τη γλώσσα

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

1.2 Ορισμός του προβλήματος

Κάθε φορά που ο χρήστης καλείται να λύσει ένα πρόβλημα, δηλαδή μία

κατάσταση που απαιτεί λύση, πρέπει να ακολουθήσει μία σειρά κανόνων ή βημάτων.

Οι κανόνες αυτοί σκοπό έχουν την εξεύρεση της βέλτιστης λύσης και είναι

1. Κατανόηση του προβλήματος

Είναι σαφές ότι βασική παράμετρος σωστής λύσης του προβλήματος είναι η

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

σωστά και στη συνέχεια να το διατυπώσει προφορικά ή γραπτά με σαφήνεια

χρησιμοποιώντας σωστή ορολογία και σύνταξη.

2. Αποτύπωση δομής του προβλήματος

Μετά την κατανόηση του προβλήματος ο χρήστης πρέπει να το αναλύσει

βρίσκοντας τα συστατικά του μέρη και στη συνέχεια εξετάζοντας καθένα

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

ουσιαστικά απλοποιεί την επίλυση του προβλήματος αφού απαιτεί τη λύση

μικρότερων τμημάτων και την ένωση μετά όλων των λύσεων.

3. Καθορισμός απαιτήσεων

Στην περίπτωση αυτή καλείται ο χρήστης να προσδιορίζει τα δεδομένα του

προβλήματος καθώς και τα ζητούμενα του. Την είσοδο και την έξοδο του

προβλήματος.

Τα προβλήματα μπορούν να κατηγοριοποιηθούν σε πολλές κατηγορίες. Έτσι

μπορεί να είναι άλυτα, επιλύσιμα ή ανοιχτά ανάλογα με τη δυνατότητα επίλυσης τους

είτε δομημένα, ημιδομημένα ή αδόμητα ανάλογα με το βαθμό δόμησης τους. Το

σημαντικό όμως σε κάθε περίπτωση είναι ότι ο χρήστης – προγραμματιστής δεν

καλείται πάντα να επιλύσει ένα μαθηματικό ή στατιστικό πρόβλημα που έχει και μία

συγκεκριμένη μαθηματική επίλυση με πράξεις. Είναι σύνηθες ο χρήστης να καλείται

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

του. Στην περίπτωση αυτή πρέπει να ακολουθήσει όλους τους παραπάνω κανόνες

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

1.3 Επίλυση προβλημάτων – Ανάπτυξη αλγορίθμων

1.3.1 Ορισμός αλγορίθμου

Μετά τον ορισμό του προβλήματος ακολουθεί η επίλυση του. Αυτή

επιτυγχάνεται με τον ορισμό μία πεπερασμένης σειράς ενεργειών-βημάτων που

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

Η διαδικασία αυτή καλείται αλγόριθμος.

Σε κάθε αλγόριθμο πρέπει να καθορίζονται τα παρακάτω στοιχεία:

1. Είσοδος (input). Απεικονίζει τις τιμές των δεδομένων του προβλήματος που

δίνονται από την αρχή ή παράγονται από ενδιάμεσα τμήματα του και

Page 9: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

9

αποτελούν είσοδο για τα επόμενα (και ονομάζονται στιγμιότυπα). Όταν τα

δεδομένα εισόδου καλύπτουν κάθε φορά τις προδιαγραφές του συστήματος

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

2. Έξοδος (output). Η έξοδος του αλγορίθμου είναι η μερική ή τελική λύση του

προβλήματος.

3. Πεπερασμένα βήματα. Κάθε αλγόριθμος πρέπει να αποτελείται από

συγκεκριμένα βήματα και να ολοκληρώνεται μετά την εκτέλεση τους.

4. Σαφή απόδοση. Το γεγονός αυτό σημαίνει ότι ο χρήστης – προγραμματιστής

πρέπει να γνωρίζει την ταχύτητα εκτέλεσης του αλγορίθμου του. Δηλαδή το

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

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

πρόβλημα.

1.3.2 Αναπαράσταση αλγορίθμων

Κάθε αλγόριθμος πρέπει στο τέλος να εκφραστεί από τον προγραμματιστή σε μία

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

Η διαδικασία της άμεσης σύνταξης του αλγορίθμου στη γλώσσα

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

εμπειρίας του προγραμματιστή. Κάθε αλγόριθμος πρέπει να συνταχθεί και να

“περάσει” από πολλά στάδια μέχρι να εισαχθεί στον υπολογιστή. Ο τρόπος αυτός

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

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

ανάπτυξης του είναι:

1. Ελεύθερο κείμενο. Ο προγραμματιστής αρχικά καταγράφει τους συλλογισμούς

του σε φυσική γλώσσα.

2. Δομημένη φυσική γλώσσα. Στη συνέχεια γίνεται η δόμηση του κειμένου σε

βήματα ακολουθώντας την δόμηση της επίλυσης του προβλήματος (τα

τμήματα του).

3. Αναπαράσταση με διαγράμματα. Αμέσως μετά ο προγραμματιστής αναπαριστά

τα βήματα του αλγορίθμου του χρησιμοποιώντας διαγράμματα ροής (flow

charts) ή όπως αλλιώς ονομάζονται λογικά διαγράμματα. Η σχηματική αυτή

αναπαράσταση βοηθά τον προγραμματιστή να εξετάσει τις αλληλεπιδράσεις

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

αλγορίθμου του.

Σύμφωνα με μία κοινά αποδεκτή διαγραμματική τεχνική οι βασικές εντολές –

βήματα του αλγορίθμου αναπαρίστανται με γεωμετρικά σχήματα ως εξής:

Η έλλειψη δηλώνει την αρχή και το τέλος του αλγορίθμου

Το ορθογώνιο δηλώνει εντολές εκτέλεσης πράξεων

Το πλάγιο παραλληλόγραμμο δηλώνει την είσοδο δεδομένων ή την έξοδο

των αποτελεσμάτων των αλγορίθμων,

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

4. Ψευδοκώδικα ή ψευδογλώσσα. Αποτελείται από μία μίξη εντολών

υπαρχουσών γλωσσών προγραμματισμού και φυσικής γλώσσας χωρίς να

απαιτείται λεκτικός, συντακτικός και σημασιολογικός έλεγχος του κώδικα

Page 10: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

10

αυτού. Επικεντρώνεται κυρίως στην ανάπτυξη του αλγορίθμου

αναπαριστώντας με σαφή καθορισμένο τρόπο όλων των εντολών επίλυσης

του προβλήματος.

Ένας αλγόριθμος είναι σύνηθες να έχει την παρακάτω δομή:

Α. Αρχικά δίνεται το όνομα του αλγορίθμου:

Π.χ. Αλγόριθμος Επίλυση Προβλήματος.

B. Αμέσως μετά ορίζονται τα δεδομένα τα οποία αποθηκεύονται σε λογικές

μεταβλητές ή σταθερές όπως Boolean που παίρνουν τιμές σωστού ή

λάθους.

Π.χ. Δεδομένα //α,β : ακέραιοι αριθμοί; γ: ακέραια μεταβλητή//

Γ. Στη συνέχεια ξεκινά ο αλγόριθμος με μία λέξη όπως Αρχή και

ολοκληρώνεται μέχρι την λέξη – εντολή Τέλος. Κάθε αλγόριθμος

χρησιμοποιεί ένα πλήθος εντολών αλλά και τελεστών. Πιο

συγκεκριμένα:

Τελεστές. Οι τελεστές μπορεί να είναι τα αριθμητικά σύμβολα των

πράξεων όπως +, -, *, /, ^, συγκριτικοί όπως <, >, =, ≥, ≤, ≠ αλλά

και λογικοί όπως και (σύζευξη), ή (διάζευξη, όχι (άρνηση).

Λογικές υποθέσεις, δηλαδή εντολές της μορφής:

Π.χ. Αν Συνθήκη Τότε Α

Αλλιώς Β

Εντολές καταχώρησης, επανάληψης, επιλογής κ.α.

Π.χ. Επαναλάμβανε

Α

Μέχρι (συνθήκη)

ή Επαναλάμβανε

Αν Συνθήκη Έξοδος

ή Για μεταβλητή = αρχή Mέχρι μεταβλητή = τέλος Βήμα τιμή

Κάνε A

ή Επέλεξε (έκφραση)

Περίπτωση 1: A

Περίπτωση 2: B

……

Αλλιώς : X

Σε κάθε μία από τις παραπάνω εντολές απαιτείται στο τέλος τους η

λέξη : Τέλος (Εντολής)

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

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

τονιστεί η σπουδαιότητα τουλάχιστον του τελευταίου βήματος και της σύνταξης

ψευδοκώδικα πριν την μετατροπή του σε μια γλώσσα προγραμματισμού. Η

Page 11: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

11

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

γνωστικό αντικείμενο με θέμα “μηχανική των αλγορίθμων” (algorithm engineering).

1.3.3 Παράδειγμα ανάπτυξης αλγορίθμου

Έστω έχουμε το πρόβλημα:

«Δοθέντων 2 ακεραίων αριθμών x, y να βρεθεί ο Μέγιστος Κοινός Διαιρέτης

(ΜΚΔ) αυτών z»

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

συλλογισμούς σε φυσική γλώσσα. Βρίσκουμε λύσεις και εκτελούμε

παραδείγματα ώστε να δούμε αν αυτές είναι σωστές. Τέλος επιλέγουμε την

λύση που μαθηματικά ή έστω διαισθητικά καταλαβαίνουμε ότι είναι η

αποδοτικότερη.

Στο παράδειγμα επομένως μπορούμε να θεωρήσουμε τις εξής λύσεις:

1. Από τους δύο αριθμούς μπορούμε να επιλέξουμε τον μικρότερο έστω x

και να εξετάσουμε από το 1 έως το x, όλους τους αριθμούς κρατώντας

αυτούς που διαιρούν το y. O μεγαλύτερος από αυτούς είναι και ο

ζητούμενος.

Είναι σαφές ότι σε κάθε περίπτωση θα εκτελεστεί μία εντολή επανάληψης

για x φορές όπου κάθε φορά θα εξετάζεται αν ο τρέχον αριθμός διαιρεί

τον y, και αν ναι τον κρατούμε και πάμε στον επόμενο αριθμό.

2. Μία άλλη λύση είναι μία παραλλαγή της παραπάνω μόνο που μπορούμε

να ξεκινήσουμε την επανάληψη από τον αριθμό x κατεβαίνοντας μέχρι το

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

χειρότερης περίπτωσης όπως θα δούμε παρακάτω είναι ίδιος.

3. Μία Τρίτη λύση είναι η εξής: “Διαιρούμε το x με το y, και έστω z το

υπόλοιπο. Αν z = 0 τότε ο ΜΚΔ είναι ο y. Αν z ≠ 0 τότε επανάλαβε το βήμα

με τους ακεραίους y και z αντί για x και y”. Η λύση αυτή είναι γνωστή ως

αλγόριθμος του Ευκλείδη.

Για να κατανοήσουμε καλύτερα τη λύση αυτή και να ορίσουμε τα

πεπερασμένα βήματα του αλγορίθμου που προκύπτουν από αυτήν

μπορούμε να εκτελέσουμε βήμα - βήμα ένα συγκεκριμένο παράδειγμα.

Π.χ. Έστω έχουμε τους αριθμούς 26 και 65 και ψάχνουμε τον ΜΚΔ τους.

Έχουμε τον πίνακα που προκύπτει από την διαδοχική επίλυση του

αλγορίθμου.

Επανάληψη Εκτέλεση Βημάτων x y z

Αρχή 1. z = y άρα z = 65 26 65 65

1η 1. z = x mod y άρα z = 26

2. x = y άρα x = 65

3. y = z άρα y = 26

65 26 26

2η 1. z = x mod y άρα z = 13

2. x = y άρα x = 26

26 13 13

Page 12: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

12

3. y = z άρα y = 13

3η 1. z = x mod y άρα z = 0

2. x = y άρα x = 13

3. y = z άρα y = 0

13 0 0

Αποτέλεσμα

ΜΚΔ = x = 13

Στην αρχή βάζουμε z = y γεγονός που σημαίνει ότι αν μπούμε στην

επανάληψη για όσο το z ≠ 0 σημαίνει ότι τουλάχιστον στην αρχή y ≠ 0

άρα εκτελείται και η πράξη x mod y.

Είναι σαφές ότι η παραπάνω λύση είναι αποδοτικότερη από τις

προηγούμενες δύο.

Β. Σύμφωνα με την παράγραφο 6.3.2, το επόμενο βήμα είναι η αναπαράσταση

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

διάγραμμα ροής. Για το συγκεκριμένη λύση του παραδείγματος δίνεται το

παρακάτω διάγραμμα ροής:

ΑΡΧΗ

ΔΙΑΒΑΣΕ

Χ,Υ

Z = Y

Z = 0

Z = X MOD Y

X = Y

Y = Z

ΤΥΠΩΣΕ

Χ

ΤΕΛΟΣ

ΝΑΙ

ΟΧΙ

Γ. Το επόμενο βήμα είναι σύνταξη του αλγορίθμου με την μορφή ψευδοκώδικα

ή ψευδογλώσσας. Με τον τρόπο αυτό θα έχουμε τον παρακάτω αλγόριθμο:

Αλγόριθμος ΜΚΔ_Ευκλείδη

Page 13: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

13

Δεδομένα //x, y : ακέραιοι αριθμοί; z: ακέραια μεταβλητή//

Αρχή

z = y

Όσο z ≠ 0 εκτέλεσε

z = x mod y

x = y

y = z

Τελος_Επανάληψης

Τέλος

Αποτελέσματα // τύπωσε x : O x είναι ο ΜΚΔ//

Τέλος ΜΚΔ_Ευκλείδη

Δ. Το επόμενο και τελευταίο βήμα είναι η σύνταξη και μετατροπή του

αλγορίθμου σε μία γλώσσα προγραμματισμού υψηλού επιπέδου. Η υλοποίηση

του αφήνεται στον σπουδαστή κατά την πρώτη εργαστηριακή άσκηση

(Παράρτημα Α).

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

Όπως τονίστηκε παραπάνω, κάθε αλγόριθμος πρέπει να έχει πεπερασμένο αριθμό

βημάτων και μετρήσιμη απόδοση. Η απόδοση ενός αλγορίθμου εξαρτάται από τους

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

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

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

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

(time complexity) και χώρου (space complexity) ως δείκτες απόδοσης του

αλγορίθμου.

Για την μέτρηση των παραπάνω δεικτών έχουν οριστεί μοντέλα υπολογισμού τα

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

μηχανή. Βασικό παράδειγμα μοντέλου υπολογισμού αποτελεί η Μηχανή Turing

καθώς και το μοντέλο μηχανής τυχαίας προσπέλασης (RAM) που αναφέρεται σε

συστήματα του ενός επεξεργαστή γενικού σκοπού, δίχως τη δυνατότητα ταυτόχρονης

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

συγκεκριμένης εισόδου καλείται, αντιστοίχως, ο αριθμός των στοιχειωδών πράξεων ή

βημάτων που εκτελούνται και ο αριθμός των θέσεων μνήμης που απαιτούνται.

Μπορούμε εύκολα να καταλάβουμε τις πολυπλοκότητες ενός αλγορίθμου αφού:

1. Κάθε εντολή ανάθεσης τιμής, δήλωσης απλής μεταβλητής, η

λογική/αριθμητική πράξη κοστίζει σταθερό χρόνο που συμβολίζεται Ο(1).

2. Σε κάθε βρόγχο επιλογών σε κάθε επανάληψη έχουμε ανεξάρτητα το κόστος

όλων των πράξεων σ’ αυτές.

3. Η δέσμευση μεταβλητής απλού τύπου κοστίζει σταθερό χώρο Ο(1) ενώ η

δέσμευση ενός πίνακα κ θέσεων κοστίζει χρόνο και χώρο Ο(κ).

Αν n είναι το μέγεθος του προβλήματος (π.χ. ζητάτε να ταξινομηθούν n αριθμοί)

τότε η πολυπλοκότητα χρόνου ή και χώρου των αλγορίθμων θα έχουν μία μορφή σαν

τις επόμενες:

Page 14: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

14

O(1) : Σταθερή.

Ο(logn) : Λογαριθμική

Ο(n) : Γραμμική.

Ο(n2) : Τετραγωνική.

O(n3) : Κυβική.

O(2n) : Εκθετική.

κ.α.

Μία συνηθισμένη μονάδα μέτρησης των δεικτών είναι μέσω της ανάλυσης

χειρότερης περίπτωσης κατά την οποία ο χρόνος ή ο χώρος μπορεί να πάρει την

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

χρόνου ή χώρου στο σύνολο των στιγμιότυπων του αλγορίθμου έχουμε την ανάλυση

μέσης ή αναμενόμενης περίπτωσης (average, expected case analysis). Τέλος

συναντάται συχνά η ανάλυση επιμερισμένης περίπτωσης (amortized case analysis)

κατά την οποία ο χρόνος ή χώρος χειρότερης περίπτωσης κατανέμεται σε μία

ακολουθία πράξεων ή λειτουργιών.

1.3.5 Μορφή ακολουθιών εντολών στους αλγορίθμους

Ο τρόπος με τον οποίο δομούνται οι εντολές ενός αλγορίθμου και ορίζονται οι

αντίστοιχες ακολουθίες τους βασίζονται σε συγκεκριμένες τεχνικές είτε απλές, όπως

στην περίπτωση σειριακών εντολών είτε πολύπλοκες όπως στην περίπτωση

αναδρομών και εμφωλιασμού.

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

1. Σειριακή ακολουθία εντολών

Χρησιμοποιείται για την επίλυση απλών προβλημάτων

2. Επιλογή εντολών

Είναι πολύ συνηθισμένη η περίπτωση να πρέπει να εκτελεστεί μία εντολή

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

3. Πολλαπλές επιλογές

Στην περίπτωση αυτή με βάση μία τιμή ενός δεδομένου ο έλεγχος- εκτέλεση

του αλγορίθμου επιλέγεται να προχωρήσει από μία λίστα συγκεκριμένων

περιπτώσεων.

4. Εμφωλιασμένες εντολές

Είναι εντολές που ανήκουν σε μία ομάδα και καλούνται να εκτελεστούν σε

ένα επίπεδο πιο χαμηλά σε σχέση με ένα άλλο επίπεδο ομάδας εντολών.

5. Επανάληψη εντολών

Σε πολλές περιπτώσεις απαιτείται η εκτέλεση μίας ή περισσοτέρων εντολών

περισσότερες από μια φορά.

Page 15: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

15

1.3.6 Είδη αλγορίθμων

Οι αλγόριθμοι μπορούν να ταξινομηθούν σε πολλές κατηγορίες ανάλογα την

απόδοση της λύσης, των τεχνικών υλοποίησης που χρησιμοποιούν αλλά και της

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

Έτσι ένας αλγόριθμος μπορεί να είναι βέλτιστος (optimal) όταν επιτυγχάνει

βέλτιστη λύση πολυπλοκότητας επίλυσης του προβλήματος ενώ μπορεί να είναι

προσεγγιστικός ή ευριστικός (Approximation ή Heuristic) όταν αυτοί προσεγγίζουν

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

Επίσης ένας αλγόριθμος μπορεί να είναι αναδρομικός (recursive). Στην

περίπτωση αυτή ορίζεται μία αναδρομική σχέση και μία βάση. Π.χ. το παραγοντικό

ενός αριθμού n δίνεται από την αναδρομική σχέση n! = n(n-1)! για n≥1 ενώ η βάση

είναι 0! = 1.

Ο αλγόριθμος του Ευκλείδη για τον υπολογισμό του ΜΚΔ 2 ακεραίων αριθμών

όπως παρουσιάστηκε παραπάνω μπορεί να μετατραπεί σε αναδρομικό ως εξής:

Αλγόριθμος ΜΚΔ(x,y)

Δεδομένα //x, y : ακέραιοι αριθμοί//

Αρχή

Aν y>0 τότε εκτέλεσε ΜΚΔ(x, x mod y)

Τέλος

Αποτελέσματα // τύπωσε x : O x είναι ο ΜΚΔ//

Τέλος ΜΚΔ

Πολλές φορές οι αλγόριθμοι μπορούν να εκτελεστούν σε ένα υπολογιστή ο οποίος

έχει περισσότερες από μία ΚΜΕ αλλά και σε ένα σύνολο υπολογιστών με 1 ΚΜΕ.

Στις περιπτώσεις αυτές υλοποιούνται παράλληλοι αλγόριθμοι.

Επίσης συχνά ορίζονται οι αλγόριθμοι ανάλογα με την περιοχή των προβλημάτων

που επιλύουν. Έτσι υπάρχουν οι αριθμητικοί αλγόριθμοι σε προβλήματα

αριθμητικής ανάλυσης, οι συνδυαστικοί σε αντίστοιχα προβλήματα, οι στοχαστικοί

σε προβλήματα θεωρίας ουρών κ.α.

1.4 Δομές δεδομένων

Η διαχείριση των δεδομένων σε έναν υπολογιστή είναι μία πολύπλοκη

διαδικασία. Ο προγραμματιστής αρχικά πρέπει να οργανώσει τα δεδομένα του με

τέτοιο τρόπο ώστε να μπορεί στη συνέχεια με εύχρηστο τρόπο να εκτελέσει όλες τις

απαιτούμενες πράξεις σ’ αυτά. Έτσι τα δεδομένα δομούνται σε ομάδες που

ονομάζονται δομές δεδομένων Κάθε μία δομή δεδομένων έχει τα ιδιαίτερα της

χαρακτηριστικά ανάλογα με τον τρόπο που είναι αποθηκευμένα τα δεδομένα ή τον

τρόπο προγραμματισμού των λειτουργιών σ΄ αυτά.

Οι πιο συνηθισμένες λειτουργίες πάνω στις δομές δεδομένων είναι οι παρακάτω:

Προσπέλαση (access), για την ανάγνωση ενός ή περισσοτέρων δεδομένων της

δομής.

Εισαγωγή (insertion), για την εισαγωγή ενός ή περισσοτέρων δεδομένων στην

δομή.

Page 16: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

16

Διαγραφή (deletion), για την διαγραφή ενός ή περισσοτέρων δεδομένων από

την δομή.

Αντιγραφή (copying), για την αντιγραφή ενός ή περισσοτέρων δεδομένων από

την δομή σε μία άλλη δομή.

Αναζήτηση (searching), για την εύρεση ενός ή περισσοτέρων δεδομένων της

δομής.

Ταξινόμηση (sorting), για την ταξινόμηση των δεδομένων της δομής με βάση

κάποιο κριτήριο από τον χρήστη

Συγχώνευση (merging), για την συγχώνευση των δεδομένων δύο ή

περισσότερων δομών.

Οι δομές δεδομένων χωρίζονται σε δύο μεγάλες κατηγορίες ανάλογα με τον

τρόπο δέσμευσης της μνήμης που απαιτείται για την αποθήκευση των δεδομένων

τους, τις στατικές και τις δυναμικές. Οι στατικές δομές δεδομένων γνωρίζουν το

ακριβές μέγεθος των δεδομένων τους και δεσμεύουν εξ αρχής τον απαιτούμενο χώρο

μνήμης γι’ αυτά. Τα δεδομένα αποθηκεύονται με τον τρόπο αυτό σε συνεχόμενες

θέσεις μνήμης.

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

φορά που υπάρχει νέα εγγραφή – δεδομένο δεσμεύεται στην μνήμη ο απαραίτητος

χώρος. Η δέσμευση της μνήμης επομένως γίνεται με την τεχνικής της δυναμικής

παραχώρησης μνήμης. Τα δεδομένα δεν βρίσκονται επομένως σε συνεχόμενες θέσεις

μνήμης.

1.4.1 Βασικά παραδείγματα δομών δεδομένων

Στη συνέχεια της ενότητας αυτής θα περιγραφούν οι βασικές δομές δεδομένων

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

δοθούν αλγόριθμοι επίλυσης των λειτουργιών αναζήτησης και ταξινόμησης.

Πίνακες (Arrays)

Ο πίνακας είναι η πιο απλή και χρησιμοποιούμενη δομή δεδομένων. Είναι

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

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

πίνακα μπορεί να περιέχονται δεδομένα του ίδιου τύπου.

Στοίβα (Stack)

Η στοίβα είναι μία δομή δεδομένων στην οποία τα δεδομένα εισάγονται το ένα

μετά το άλλο ενώ ο χρήστης έχει τη δυνατότητα να προσπελάσει μόνο το τελευταίο

που έχει εισαχθεί ενώ το πρώτο στοιχείο που εισήχθη θα προσπελαστεί τελευταίο.

Είναι μία δομή LIFO (Last In First Out).

Η υλοποίηση μίας στοίβας μπορεί να γίνει με απλό τρόπο χρησιμοποιώντας έναν

μονοδιάστατο πίνακα χρησιμοποιώντας πάντοτε έναν δείκτη που να δείχνει το πρώτο

στοιχείο της στοίβας που είναι και το τελευταίο που εισήχθη σ’ αυτήν.

Οι βασικές πράξεις σε μία στοίβα είναι:

Empty (), η οποία επιστρέφει 1 αν η στοίβα είναι άδεια ή μηδέν στην αντίθετη

περίπτωση.

Page 17: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

17

Push (a), η οποία τοποθετεί το στοιχείο a στην κορυφή της στοίβας

Top (), προσπελαύνει το στοιχείο που βρίσκεται στην κορυφή της στοίβας.

Pop (), η οποία προσπελαύνει και παράλληλα διαγράφει το στοιχείο που

βρίσκεται στην κορυφή της στοίβας.

Ουρά (Queue)

Η ουρά είναι μία δομή δεδομένων στην οποία τα δεδομένα εισάγονται το ένα μετά

το άλλο ενώ ο χρήστης έχει τη δυνατότητα να προσπελάσει τα δεδομένα με την

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

ανθρώπων σε μια τράπεζα.

Είναι μία δομή FIFO (First In First Out).

Η υλοποίηση μίας ουράς μπορεί να γίνει με απλό τρόπο χρησιμοποιώντας έναν

μονοδιάστατο πίνακα χρησιμοποιώντας πάντοτε 2 δείκτες: έναν δείκτη που να δείχνει

στο πρώτο στοιχείο της ουράς και έναν στο τελευταίο.

Οι βασικές πράξεις σε μία ουρά είναι:

Enqueue (a), η οποία τοποθετεί το στοιχείο a στο τέλος της ουράς

Enqueue (), προσπελαύνει και παράλληλα διαγράφει το στοιχείο που

βρίσκεται στην κορυφή της ουράς.

Γραμμικές Λίστες (Linear Lists)

Στις γραμμικές λίστες τα δεδομένα ως εγγραφές βρίσκονται σε οποιαδήποτε θέση

ορίζοντας τους κόμβους της λίστας και η σύνδεση μεταξύ τους πραγματοποιείται με

δείκτες. Από κάθε κόμβο ένας δείκτης δείχνει στον επόμενο κ.ο.κ.

Οι βασικές λειτουργίες σε μία λίστα είναι οι παρακάτω:

First (), η οποία επιστρέφει τον δείκτη προς τον πρώτο κόμβο

Last (), η οποία επιστρέφει τον δείκτη προς τον τελευταίο κόμβο

Insert (x,y), Ενθέτει τον κόμβο x προ του κόμβου y

Delete (x), διαγράφει τον κόμβο x.

Δέντρα (Trees)

Αντίθετα με τις λίστες, στα δέντρα από κάθε κόμβο δεν ξεκινά ένας μόνο δείκτης

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

που ονομάζονται απόγονοι του αρχικού. Ο πρώτος κόμβος στο δέντρο ονομάζεται

ρίζα ενώ οι κόμβοι που δεν δείχνουν σε απόγονους ονομάζονται φύλλα.

Τα δέντρα διακρίνονται σε 3 κατηγορίες:

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

τα ημι-δυναμικά που παρέχουν κάποιες λειτουργίες τροποποίησης

και τα δυναμικά που δίνουν τη δυνατότητα μέσω των πράξεων σ’ αυτά να

μεταβάλλονται οι κόμβοι του δέντρου.

Page 18: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

18

Ουρά προτεραιότητας (Priority queue)

Στην δομή αυτή κυρίαρχο ρόλο έχει η προτεραιότητα που επισυνάπτεται σε κάθε

δεδομένο της. Η προτεραιότητα αυτή ουσιαστικά είναι ένας αριθμός ο οποίος

διατάσσει τα δεδομένα.

Γράφοι (graphs)

Η δομή αυτή δομείται με παρόμοιο τρόπο με τις προηγούμενες από κόμβους

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

αυτοί ενώνονται τυχαία μεταξύ τους με ένα σύνολο γραμμών.

Ερωτήσεις- Ασκήσεις Κεφαλαίου

1. Τι είναι ο αλγόριθμος; Ποια κριτήρια πρέπει να ικανοποιεί;

2. Με ποιους τρόπους αναπαρίστανται οι αλγόριθμοι;

3. Δώστε 2 μονάδες μέτρησης της απόδοσης ενός αλγορίθμου.

4. Ποιοι είναι οι βασικοί τύποι εντολών ενός αλγορίθμου;

5. Περιγράψτε τον αλγόριθμο του Ευκλείδη.

6. Τι είναι η δομή δεδομένων; Ποια η διαφορά της στατικής με την δυναμική

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

7. Δώστε τις βασικές πράξεις πάνω στα στοιχεία μιας δομής δεδομένων.

Page 19: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

19

ΚΕΦΑΛΑΙΟ 2. ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Σκοπός του κεφαλαίου αυτού είναι να παρουσιαστούν αναλυτικά οι πιο βασικές

δομές δεδομένων που χρησιμοποιούνται τόσο στην κύρια όσο και στην δευτερεύουσα

μνήμη. Αρχικά περιγράφονται οι γραμμικές δομές που χρησιμοποιούνται στην κύρια

μνήμη δηλαδή οι πίνακες, η στοίβα, η ουρά και οι λίστες. Στις δομές αυτές ορίζεται

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

Ουσιαστικά οι δομές αυτές είναι μονοδιάστατες. Στη συνέχεια περιγράφονται οι μη

γραμμικές δομές όπως τα δέντρα και οι γράφοι. Οι σχέσεις των δεδομένων μεταξύ

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

αναλύεται η δομή τους, η λειτουργία τους καθώς και οι πράξεις που εκτελούνται ενώ

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

2.1 Πίνακες

Ο πίνακας (array) είναι η πιο απλή και χρησιμοποιούμενη δομή δεδομένων. Οι

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

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

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

Καταρχήν ένας πίνακας μπορεί να είναι μιας διάστασης ή περισσοτέρων.

Παρακάτω δίνεται η εποπτική παράσταση ενός πίνακα μιας διάστασης και ενός 2

διαστάσεων.

3

1

2

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

N

31 2 ............................. N

31 2 ............................. N

Μονοδιάστατος πίνακας Ν

στοιχείων

Δύο διαστάσεων πίνακας

Ν x Ν στοιχείων

Σε ένα πίνακα μπορεί να περιέχονται δεδομένα του ίδιου τύπου. Είναι σημαντικό

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

δομές που υλοποιεί και στην συγκεκριμένη περίπτωση ένας πίνακας. Τα στοιχεία των

πινάκων αποθηκεύονται σε γειτονικές θέσεις μνήμης. Κάθε στοιχείο του πίνακα

καταλαμβάνει το ίδιο χώρο μνήμης. Αν έχουμε ένα μονοδιάστατο πίνακα Ν

στοιχείων και κάθε στοιχείο καταλαμβάνει μία λέξη μνήμης τότε όταν δηλώνεται ο

Page 20: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

20

πίνακας σε μία γλώσσα προγραμματισμού όπως η C τότε δεσμεύονται εξαρχής Ν

διαδοχικές θέσεις μνήμης για τον πίνακα.

Στη γενική περίπτωση κάθε στοιχείο ενός πίνακα καταλαμβάνει τόσες θέσεις

μνήμης ανάλογα με τον τύπο του και με την αρχιτεκτονική της κεντρικής μνήμης του

υπολογιστή. Έτσι σε υπολογιστές όπου η λέξη μνήμης είναι ισοδύναμη με το byte

τότε :

Aν ο πίνακας περιέχει προσημασμένους ή μη ακεραίους αριθμούς τότε κάθε

στοιχείο του καταλαμβάνει 1 byte και επομένως μία λέξη μνήμης.

Αν ο πίνακας περιέχει ακεραίους αριθμούς τότε κάθε στοιχείο του

καταλαμβάνει 2 bytes και επομένως δύο λέξεις μνήμης.

Αν ο πίνακας περιέχει μεγάλους ακεραίους ή αριθμούς κινητής υποδιαστολής

απλής ακρίβειας τότε κάθε στοιχείο του καταλαμβάνει 4 bytes και επομένως 4

λέξεις μνήμης.

Αν ο πίνακας περιέχει αριθμούς κινητής υποδιαστολής διπλής ακρίβειας τότε

κάθε στοιχείο του καταλαμβάνει 8 bytes και επομένως 8 λέξεις μνήμης.

Παρακάτω δίνονται μερικά παραδείγματα πινάκων σε γλώσσα C.

int num[100]. Στην περίπτωση αυτή ορίζεται ένας μονοδιάστατος πίνακας ο

οποίος περιέχει 100 ακέραιους διαδοχικούς αριθμούς.

char sympols[20]. Στην περίπτωση αυτή ορίζεται ένας μονοδιάστατος πίνακας

ο οποίος περιέχει μία σειρά 20 χαρακτήρων.

float num[100][100]. Στην περίπτωση αυτή ορίζεται ένας did;I;astatow

πίνακας 100 x 100 ο οποίος περιέχει συνολικά 10000 πραγματικούς αριθμούς.

2.1.1 Μερικοί τύποι πινάκων

Στην παράγραφο αυτή θα παρουσιάσουμε μερικούς τύπους πινάκων που

χρησιμοποιούνται συχνά στην επίλυση προβλημάτων.

1. Συμμετρικοί πίνακες. Ένα πίνακας είναι συμμετρικός όταν είναι δύο

διαστάσεων και τα στοιχεία του Αij ικανοποιούν την σχέση Αij = Aji για κάθε i

και j.

Π.χ. έστω έχουμε τον παρακάτω συμμετρικό πίνακα.

7 9 2 5 6

9 7 2 8 1

2 2 6 3 2

5 8 3 5 3

6 1 2 3 4

2. Τριγωνικοί πίνακες. Ένα πίνακας είναι τριγωνικός όταν είναι δύο

διαστάσεων και τα στοιχεία του Αij ικανοποιούν την σχέση Αij = 0 για i > j.

Π.χ. έστω έχουμε τον παρακάτω τριγωνικό πίνακα.

7 0 0 0 0

Page 21: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

21

9 7 0 0 0

2 2 6 0 0

5 8 3 5 0

6 1 2 3 4

3. Τριδιαγώνιοι πίνακες. Ένα πίνακας είναι τριδιαγώνιος όταν είναι δύο

διαστάσεων και όταν τα μόνα μη μηδενικά στοιχεία του Αij είναι αυτά που

ικανοποιούν την σχέσεις i = j ή i-j =1 ή j – i = 1. Στην περίπτωση αυτή τα

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

και τα γειτονικά της.

Π.χ. έστω έχουμε τον παρακάτω τριδιαγώνιο πίνακα.

7 9 2 0 0

9 7 2 8 0

2 2 6 3 2

0 8 3 5 3

0 0 2 3 4

4. Αραιοί πίνακες. Ένα πίνακας είναι αραιός όταν πάρα πολλά στοιχεία του

είναι 0.

Π.χ. έστω έχουμε τον παρακάτω αραιό πίνακα.

0 0 1 0 1

0 7 0 2 0

2 0 0 0 0

1 0 3 0 0

0 0 0 3 0

2.1.2 Συμβολοσειρές

Μία πολύ σημαντική κατηγορία μονοδιάστατων πινάκων είναι αυτοί στους

οποίους τα στοιχεία τους είναι χαρακτήρες και ονομάζονται συμβολοσειρές (strings).

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

και της ευρείας τους χρήσης σε εφαρμογές κάθε γλώσσα προγραμματισμού

προσφέρει ένα σύνολο συναρτήσεων οι οποίοι έχουν σκοπό να εκτελέσουν

συγκεκριμένες λειτουργίες πάνω σε συμβολοσειρές όπως συνέλιξη συμβολοσειρών,

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

Βασικό στοιχείο που πρέπει να τονιστεί είναι το γεγονός ότι κάθε στοιχείου του

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

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

Στην πρώτη περίπτωση κατά τον ορισμό του πίνακα δεσμεύεται ο συνολικός

απαραίτητος χώρος μνήμης για την αποθήκευση των στοιχείων του. Δηλαδή αν ο

Page 22: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

22

πίνακας είναι ΝxΝ τότε στην κάθε γραμμή δεσμεύεται χώρος για συμβολοσειρά Ν

χαρακτήρων ανεξάρτητα από το πραγματικό μέγεθος της. Αυτό έχει σαν αποτέλεσμα

να σπαταλείται αρκετός χώρος.

Στην δεύτερη περίπτωση συμβολοσειρών μεταβλητού μεγέθους σε κάθε γραμμή

δεν δεσμεύεται χώρος Ν χαρακτήρων αλλά μόνο 2 στοιχείων. Το πρώτο περιέχει τον

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

γραμμής δηλαδή το μήκος της ενώ το δεύτερο στοιχείο είναι ένας δείκτης που δείχνει

στην διεύθυνση μνήμης που περιέχεται ο πρώτος χαρακτήρας της συμβολοσειράς.

Έτσι το πρόγραμμα κατά την εκτέλεση του όταν θέλει έστω την πρώτη συμβολοσειρά

του πίνακα πηγαίνει στην διεύθυνση που μνήμης που είναι καταχωρημένος ο πρώτος

χαρακτήρας και ανακτά στη συνέχεια το περιεχόμενο των συνεχόμενων θέσεων

μνήμης όσον ορίζεται από το αριθμό που δίνει το μήκος της συμβολοσειράς.

2.2 Στοίβες

Μία ακόμα γραμμική δομή δεδομένων είναι η στοίβα (stack) στην οποία τα

δεδομένα της αποθηκεύονται διαδοχικά, το ένα μετά το άλλο. Όταν ο χρήστης εισάγει

ένα στοιχείο αυτό αποθηκεύεται στο τέλος της στοίβας. Όταν όμως θέλει να εξάγει

ένα στοιχείο της στοίβας τότε έχει τη δυνατότητα να προσπελάσει μόνο το τελευταίο

στοιχείο που έχει εισαχθεί. Αυτό σημαίνει ότι το πρώτο στοιχείο που εισήχθη στη

στοίβα θα προσπελαστεί τελευταίο. Η λειτουργία της αυτή την κατατάσσει στις δομές

LIFO (Last In First Out).

Συχνά στην καθημερινή μας ζωή συναντάμε περιπτώσεις ή προβλήματα που

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

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

η στοίβα αποτελεί μία βασική δομή δεδομένων η οποία χρησιμοποιείται συχνά στην

επιστήμη των υπολογιστών. ¨Έτσι όταν στον προγραμματισμό καλείται μία

συνάρτηση και στην συνέχεια μία άλλη κ.ο.κ. τότε η διαδρομή αυτή «κρατείται» σε

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

Ποιες λειτουργίες όμως εφαρμόζονται σε μία στοίβα;

Έστω έχουμε μία στοίβα στην οποία έχουμε αποθηκευμένα τα στοιχεία X, Y, Z

και V όπως φαίνεται στο παρακάτω σχήμα.

X

Y

Z

V

Εισαγωγή

στοιχείωνΕξαγωγή

στοιχείων

Στη στοίβα αυτή υπάρχουν δύο βασικές επιλογές λειτουργιών.

Ένας χρήστης μπορεί να ενθέσει ένα στοιχείο στη στοίβα, έστω P και εκτελείται

η πράξη push(P). Τότε η στοίβα αποκτά την ακόλουθη μορφή:

Page 23: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

23

X

Y

Z

V

P

Επίσης ένας χρήστης μπορεί να απωθήσει ένα στοιχείο από τη στοίβα και

εκτελείται η πράξη pop(). Ουσιαστικά η πράξη pop προσπελαύνει το τελευταίο

στοιχείο της στοίβας και στη συνέχεια το σβήνει από τη στοίβα. Τότε η στοίβα

αποκτά την ακόλουθη μορφή:

X

Y

Z

Υπάρχουν βέβαια και άλλες πράξεις που εφαρμόζονται σε μία στοίβα, όχι βέβαια

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

πράξεις σε μία στοίβα είναι:

Push (a), η οποία τοποθετεί το στοιχείο a στην κορυφή της στοίβας

Pop (), η οποία προσπελαύνει και παράλληλα διαγράφει το στοιχείο που

βρίσκεται στην κορυφή της στοίβας.

Top (), προσπελαύνει το στοιχείο που βρίσκεται στην κορυφή της στοίβας.

Empty (), η οποία επιστρέφει 1 αν η στοίβα είναι άδεια ή μηδέν στην αντίθετη

περίπτωση.

2.2.1 Αλγόριθμος υλοποίησης στοίβας

Η υλοποίηση μίας στοίβας ουσιαστικά σημαίνει τον ορισμό της μνήμης που

δεσμεύεται για αυτήν καθώς και την υλοποίηση των πράξεων της.

Μία στοίβα μπορεί να υλοποιηθεί ως ένας πίνακας ορισμένου ή μη μεγέθους ή

μιας απλής λίστας. Αυτό σημαίνει ότι η στοίβα μπορεί να είναι τόσο μία στατική

δομή όσο και μία δυναμική ανάλογα τον τρόπο υλοποίησης της.

Η πιο συνηθισμένη μορφή μιας στοίβας είναι ένας πίνακας περιορισμένου

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

Page 24: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

24

έναν μονοδιάστατο πίνακα μεγέθους έστω Array[N] χρησιμοποιώντας πάντοτε έναν

δείκτη που να δείχνει το πρώτο στοιχείο της στοίβας που είναι και το τελευταίο που

εισήχθη σ’ αυτήν και ονομάζεται κεφαλή της στοίβας (μεταβλητή Head). Κατά την

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

Boolean η οποία ενημερώνει πάντοτε μετά την αίτηση εκτέλεσης πράξης αν αυτήν

εκτελέστηκε επιτυχώς ή όχι (έστω μεταβλητή check).

Πράξη Push

Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N]

δηλώνεται ως ακέραιος) τότε η πράξη ένθεσης καλείται όταν θέλουμε να εισάγουμε

ένα στοιχείο στη στοίβα έστω num (μεταβλητή num τύπου ακεραίου). Η Push είναι

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

να εισάγουμε ένα στοιχείο στη στοίβα. Συντάσσεται επομένως ως μία συνάρτηση

στην περίπτωση μας τύπου ακεραίου στην οποία μεταφέρεται μαζί ως αρχικά

δεδομένα και η τιμή του στοιχείου num. Όταν καλείται η push επομένως έχει την

μορφή push(num).

Όταν γίνει αίτηση για ένθεση (push(num)) πρέπει να εξεταστεί αρχικά το γεγονός

αν υπάρχει διαθέσιμος χώρος στη στοίβα για να εισαχθεί το στοιχείο num. Τονίσαμε

ότι η μεταβλητή Head δείχνει στο τελευταίο στοιχείο της στοίβας (κεφαλή της). Αν

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

χώρος στη στοίβα. Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την

μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχει χώρος για το στοιχείο

num και τότε η μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη

θέση της στοίβας που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση

που δείχνει η head. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως

αληθής.

Παρακάτω δίνεται ο αλγόριθμος υλοποίησης της πράξης push σε ψευδοκώδικα.

Αλγόριθμος Push

Δεδομένα //num : ακέραιος αριθμός//

Αρχή

Aν Head<N τότε

Head= Head+1;

Array[Head]=num;

Check=αληθής;

Αλλιώς Check=ψευδής;

Τέλος Αν

Αποτελέσματα // Check //

Τέλος Push

Πράξη Pop

Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N]

δηλώνεται ως ακέραιος) τότε η πράξη απώθησης καλείται όταν θέλουμε να

Page 25: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

25

διαβάσουμε και να σβήσουμε παράλληλα το στοιχείο κεφαλή της στοίβας έστω num

(μεταβλητή num τύπου ακεραίου). Η Pop είναι μία ανεξάρτητη διαδικασία και

συντάσσεται ως μία συνάρτηση στην περίπτωση μας τύπου ακεραίου. Όταν καλείται

η pop επομένως έχει την μορφή push() και επιστρέφει την κεφαλή της στοίβας (αν

εκτελεστεί επιτυχώς).

Όταν γίνει αίτηση για απώθηση (pop()) πρέπει να εξεταστεί αρχικά το γεγονός αν

υπάρχουν στοιχεία της στοίβας.. Τονίσαμε ότι η μεταβλητή Head δείχνει στο

τελευταίο στοιχείο της στοίβας (κεφαλή της). Αν επομένως η head έχει την τιμή 0

σημαίνει ότι η στοίβα είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται

η μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στη

στοίβα και η pop επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η

μεταβλητή head μειώνεται κατά ένα ώστε να δείχνει στο προηγούμενο στοιχείο της

στοίβας που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται

επιτυχώς και ορίζεται η μεταβλητή check ως αληθής.

Παρακάτω δίνεται ο αλγόριθμος υλοποίησης της πράξης pop σε ψευδοκώδικα.

Αλγόριθμος Pop

Αρχή

Aν Head>0 τότε

Num=Array[Head]

Head= Head-1;

check=αληθής;

Αλλιώς Check=ψευδής;

Τέλος Αν

Αποτελέσματα // Check, num//

Τέλος Pop

2.2.2 Εφαρμογές Στοίβας – Πολωνικός συμβολισμός

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

χρήση ενός συμβολισμού για τις αριθμητικές και λογικές παραστάσεις στον οποίο δεν

χρησιμοποιούνται παρενθέσεις. Για το λόγο αυτό ο πολωνός μαθηματικός, το 1951,

Jan Lukasiewicz παρουσίασε έναν συμβολισμό ο οποίος προς τιμή του ονομάστηκε

πολωνικός.

Οι παραστάσεις τις οποίες χρησιμοποιεί ο άνθρωπος αποτελούνται από τους

τελεστέους, τους τελεστές καθώς και από παρενθέσεις. Η συνηθισμένη τους μορφή

όπως την γνωρίζουμε είναι οι τελεστές να παρεμβάλλονται ανάμεσα στους

τελεστέους. Η μορφή αυτή των παραστάσεων ονομάζεται ένθετη (infix). Σύμφωνα με

τον πολωνικό συμβολισμό κάθε ένθετη μορφή μπορεί να μετατραπεί στην

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

στην μεταθετική στην οποία οι τελεστές ακολουθούν τους τελεστέους.

Έτσι για παράδειγμα έχουμε:

Ένθετη Προθεματική Μεταθετική

Page 26: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

26

1 α+β +αβ αβ+

2 α+β*γ +α*βγ αβγ*+

3 α*β*γ *α*βγ αβ*γ*

4 α*β+γ*δ +*αβ*γδ αβ*γδ*+

Ένα αρχικό πρόβλημα που παρουσιάστηκε είναι με την πράξη της αφαίρεσης. Το

σύμβολο – μπορεί να θεωρηθεί σε μία παράσταση είτε ως πρόσημο είτε ως το

σύμβολο της πράξης αφαίρεσης. Στην περίπτωση του πολωνικού συμβολισμού δεν

έχουμε πράξη αφαίρεσης. Αυτή μετατρέπετε σε πράξη πρόσθεσης ενός αριθμού με

τον αντίθετο του επόμενου. Ειδικότερα όταν ζητείται η εκτέλεση της πράξης α-β τότε

αυτή μετατρέπεται στην πράξη α+(-β). Στην συνέχεια στον πολωνικό συμβολισμό

αφαιρούνται και οι παρενθέσεις όπως θα δούμε παρακάτω.

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

των τελεστέων που αντιστοιχούν σε ένα τελεστή.

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

παραστάσεων όσο και στη μεταθετική και προθεματική ισχύει μία ιεραρχία ή

προτεραιότητα στις πράξεις. Αυτή η ιεραρχία στις βασικές πράξεις είναι :

1. Ύψωση σε δύναμη.

2. Πολλαπλασιασμός και διαίρεση.

3. Πρόσθεση και αφαίρεση.

Οι εφαρμογές που έχει ο πολωνικός συμβολισμός στην επιστήμη των

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

προγραμματιστής να εισάγει εντολές για την εκτέλεση παραστάσεων στην ένθετη

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

προθεματική ή την μεταθετική μορφή και στη συνέχεια εκτελεί τις πράξεις. Επίσης

ανάλογη διαδικασία εκτελείται και σε διάφορους τύπους προγραμματιζόμενων

αριθμομηχανών κ.α..

Ο πιο συνηθισμένος συμβολισμός παραστάσεων στις γλώσσες προγραμματισμού

είναι της μεταθετικής μορφής. Παρακάτω θα εξεταστεί ο τρόπος με τον οποίο

μετατρέπεται η ένθεση μορφή μιας παράστασης είτε με παρενθέσεις είτε όχι στην

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

την παράσταση στην μεταθετική μορφή. Σε όλες τις παραπάνω περιπτώσεις

χρησιμοποιούνται στοίβες.

Μετατροπή ένθετης παράστασης χωρίς παρενθέσεις σε μεταθετική

Για την μετατροπή μιας παραστάσεις από την ένθετη μορφή στην μεταθετική

ακολουθούμε τα παρακάτω βήματα.

1. Αρχικά κατατάσσουμε τα σύμβολα της ένθετης παράστασης το ένα μετά το

άλλο ώστε να μπορούν να αριθμηθούν.

2. Στη συνέχεια εξετάζονται ένα – ένα διαδοχικά όλα τα σύμβολα της

παράστασης ξεκινώντας από αυτό αριστερά της.

3. Όλοι οι τελεστέοι τοποθετούνται άμεσα ο ένας στα δεξιά του άλλου σε μία

παράσταση σε μεταθετική μορφή.

Page 27: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

27

4. Όλοι οι τελεστές ωθούνται σε μία στοίβα ενδιάμεσα και στη συνέχεια

απωθούνται και ενσωματώνονται στα δεξιά της παράστασης μεταθετικής

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

ισχύουν οι παρακάτω κανόνες:

Α. Αν ο τελεστής που εξετάζουμε έχει μεγαλύτερη ιεραρχία από αυτόν που

βρίσκεται στην κεφαλή της στοίβας τότε αυτός εισάγεται στην στοίβα

(push).

B. Αν ο τελεστής που εξετάζουμε έχει μικρότερη ιεραρχία από αυτόν που

βρίσκεται στην κεφαλή της στοίβας τότε αρχικά απωθούνται (pop) όλοι οι

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

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

της μεταθετικής μορφής. Στη συνέχεια ο τελεστής που εξετάζουμε

εισάγεται στην στοίβα (push)

Για την καλύτερη κατανόηση των παραπάνω κανόνων δίνεται το παρακάτω

παράδειγμα μετατροπής της αριθμητικής παράστασης ένθετης μορφής :

α+β*γε+δ/ζ

στην αντίστοιχη μεταθετική του.

Αρχικά διατάσσουμε τα σύμβολα της παράστασης και έχουμε:

α+β*γ^ε+δ/ζ

Εξετάζουμε τα σύμβολα της παράστασης διαδοχικά ξεκινώντας από τα αριστερά

και έχουμε:

Σύμβολα στην ένθετη

μορφή

Στοίβα Μεταθετική μορφή

α - α

+ + α

β + αβ

* *+ αβ

γ *+ αβγ

^ ^*+ αβγ

ε ^*+ αβγε

+ + αβγε^*+

δ + αβγε^*+δ

/ /+ αβγε^*+δ

ζ /+ αβγε^*+δζ

- αβγε^*+δζ/+

Μετατροπή ένθετης παράστασης με παρενθέσεις σε μεταθετική

Στην περίπτωση που η παράσταση μας στην ένθετη μορφή έχει παρενθέσεις τότε

ισχύουν οι παραπάνω κανόνες μαζί με τους παρακάτω δύο:

Page 28: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

28

1. Όταν κατά την διαδοχική εξέταση των συμβόλων της παράστασης συναντάται

αριστερή παρένθεση τότε αυτήν εισάγεται ως έχει στην στοίβα.

2. Όταν κατά την διαδοχική εξέταση των συμβόλων της παράστασης συναντάται

δεξιά παρένθεση τότε αυτή προκαλεί την απώθηση από τη στοίβα όλων των

τελεστών μέχρι να συναντήσουμε την αριστερή παρένθεση. Οι παρενθέσεις

εξαλείφονται.

Έστω έχουμε την παράσταση στην ένθετη μορφή: (a+b)*(c-d)^e*f.

Αρχικά μετατρέπουμε την πράξη αφαίρεσης σε πρόσθεση και έχουμε :

(a+b)*(c+-d)^e*f.

Εξετάζουμε τα σύμβολα της παράστασης διαδοχικά ξεκινώντας από τα αριστερά

και έχουμε:

Σύμβολα στην ένθετη

μορφή

Στοίβα Μεταθετική μορφή

( (

a ( a

+ +( a

b +( ab

) - ab+

* * ab+

( (* ab+

c (* ab+c

+ +(* ab+c

-d +(* ab+c-d

) * ab+c-d+

^ ^* ab+c-d+

e ^* ab+c-d+e

* * ab+c-d+e^*

f * ab+c-d+e^*f

- - ab+c-d+e^*f*

Υπολογισμός παραστάσεις μεταθετικής μορφής

Αφού η παράσταση ένθετης μορφής μετατραπεί στην αντίστοιχη μεταθετική στη

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

ένα ένα διαδοχικά από τα αριστερά. Όταν συναντάται τελεστέος τότε η αντίστοιχη

τι9μή του εισάγεται στην στοίβα. Όταν συναντάται τελεστής τότε γίνεται η πράξη

που δηλώνει ανάμεσα στην κεφαλή της στοίβας και το αμέσως επόμενο της στοίβας

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

Page 29: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

29

pop στην στοίβα, εκτελείται σ’ αυτά η αντίστοιχη πράξη και το αποτέλεσμα της

γίνεται push στη στοίβα.

Έστω έχουμε την παράσταση (α+β)*γ που η μεταθετική της μορφή είναι αβ+γ*.

Αν α=1, β=2 και γ=3 τότε: (1+2)*3=9.

Αν γίνει ο υπολογισμός μέσω της μεταθετικής μορφής έχουμε:

Παράσταση στην

μεταθετική μορφή

Στοίβα

α 1

β 21

+ 3

γ 33

* 9

2.3 Ουρές

Μία ακόμα δομή δεδομένων είναι η ουρά (queue) στην οποία τα δεδομένα της

αποθηκεύονται γραμμικά, διαδοχικά, το ένα μετά το άλλο. Όταν ο χρήστης εισάγει

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

στοιχείο της στοίβας τότε έχει τη δυνατότητα να προσπελάσει μόνο το πρώτο

στοιχείο της αρχής της ουράς. Το στοιχείο αυτό ουσιαστικά είναι το πιο «παλιό»

στοιχείο που έχει εισαχθεί στην ουρά δηλαδή το πρώτο στοιχείο που εισήχθη στην

ουρά θα προσπελαστεί πρώτο. Η λειτουργία της αυτή επομένως την κατατάσσει στις

δομές FIFO (First In First Out).

Συχνά στην καθημερινή μας ζωή συναντάμε περιπτώσεις ή προβλήματα που

απαιτούν την εφαρμογή δομής ουράς για τον ορισμό και την επίλυση τους. Παντού

συναντούμε ουρές αναμονής ανθρώπων για την εξυπηρέτηση των εργασιών τους

όπως στις τράπεζες, καταστήματα κ.α.

Πρέπει να τονιστεί παράλληλα ότι η ουρά αποτελεί μία βασική δομή δεδομένων η

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

στις εμπορικές επιχειρήσεις απαιτεί την υλοποίηση ουρών για να προσομοιώσουν είτε

την εξυπηρέτηση πελατών είτε την διαχείριση της αποθήκης τους κ.τ.λ.

Ποιες λειτουργίες όμως εφαρμόζονται σε μία ουρά; Ουσιαστικά η ουρά είναι μία

παραπλήσια δομή με την στοίβα που εξετάσαμε στην προηγούμενη παράγραφο. Η

μόνη τους διαφορά είναι ότι στη στοίβα είχαμε μόνο ένα σημείο τόσο για την

εισαγωγή όσο και για την απώθηση στοιχείων. Αυτό το σημείο ήταν η κεφαλή της

στοίβας και επομένως απαιτούνταν μόνο ένας δείκτης ο οποίος να δηλώνει τη θέση

της κεφαλής στη στοίβα (πίνακα ή λίστα).

Στην ουρά όμως δεν έχουμε μόνο ένα σημείο εισόδου και εξόδου. Στοιχεία

εισέρχονται από το ένα άκρο της ουράς, το πίσω έστω το τέλος της ουράς ενώ

εξέρχονται (απωθούνται) από το εμπρός μέρος της ουράς έστω την αρχή της.

Μπορούμε επομένως να φανταστούμε την ουρά σαν ένα σωλήνα στον οποίο

εισέρχονται στοιχεία από το ένα άκρο του (πίσω-τέλος) και εξέρχονται από το άλλο

άκρο (εμπρός-αρχή).

Page 30: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

30

Έστω επομένως έχουμε μία ουρά στην οποία έχουμε αποθηκευμένα τα στοιχεία

X, Y, Z και V όπως φαίνεται στο παρακάτω σχήμα.

X Y Z V

Εμπρός - Αρχή Ουράς

Εξαγωγή στοιχείων

Πίσω - Τέλος Ουράς

Εισαγωγή στοιχείων

Στην ουρά αυτή υπάρχουν δύο βασικές επιλογές λειτουργιών.

Ένας χρήστης μπορεί να ενθέσει ένα στοιχείο στην ουρά, έστω P και εκτελείται η

πράξη Enqueue(P). Τότε η ουρά αποκτά την ακόλουθη μορφή:

X Y Z V

Εμπρός - Αρχή Ουράς

Εξαγωγή στοιχείων

Πίσω - Τέλος Ουράς

Εισαγωγή στοιχείων

P

Επίσης ένας χρήστης μπορεί να απωθήσει ένα στοιχείο από την ουρά και

εκτελείται η πράξη Dequeue(). Ουσιαστικά η πράξη dequeue προσπελαύνει το πρώτο

στοιχείο της ουράς και στη συνέχεια το σβήνει από αυτή. Τότε η ουρά αποκτά την

ακόλουθη μορφή:

Y Z V

Εμπρός - Αρχή Ουράς

Εξαγωγή στοιχείων

Πίσω - Τέλος Ουράς

Εισαγωγή στοιχείων

Υπάρχουν βέβαια και άλλες πράξεις που εφαρμόζονται σε μία ουρά, όχι βέβαια

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

βασικές πράξεις σε μία στοίβα είναι:

Enqueue (P), η οποία τοποθετεί το στοιχείο P στο τέλος της ουράς

Dequeue (), προσπελαύνει και παράλληλα διαγράφει το στοιχείο που

βρίσκεται στην κορυφή της ουράς.

2.3.1 Αλγόριθμοι υλοποίησης ουράς

Η υλοποίηση μίας ουράς ουσιαστικά σημαίνει τον ορισμό της μνήμης που

δεσμεύεται για αυτήν καθώς και την υλοποίηση των πράξεων της.

Μία ουρά μπορεί να υλοποιηθεί ως ένας πίνακας ορισμένου ή μη μεγέθους ή μιας

απλής λίστας. Αυτό σημαίνει ότι η ουρά μπορεί να είναι τόσο μία στατική δομή όσο

και μία δυναμική ανάλογα τον τρόπο υλοποίησης της.

Παράλληλα πρέπει να τονιστεί ότι υπάρχουν αρκετές παραλλαγές ουρών οι

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

είτε με λίστες. Έτσι υπάρχει η απλή φυσική υλοποίηση τη λειτουργία της οποίας

Page 31: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

31

περιγράψαμε παραπάνω. Είναι ένας «σωλήνας» στοιχείων που εισέρχονται από το

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

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

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

αποκλειστικά από 2 δείκτες αρχής και τέλους όπως θα δούμε παρακάτω. Τέλος μία

Τρίτη παραλλαγή της ουράς είναι η περίπτωση στην οποία τα δύο άκρα της ουράς να

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

ουρά εκτελούνται 4 πράξεις, 2 enqueue και 2 dequeue.

Στη συνέχεια θα αναλύσουμε τους αλγορίθμους υλοποίησης μιας ουράς στην

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

τα στοιχεία που διαφοροποιούν την παραπάνω παραλλαγή στην υλοποίηση της από

αυτή στην περίπτωση ουράς δακτυλίου.

Απλή μορφή υλοποίησης ουράς pipeline με χρήση πινάκων

Η πιο συνηθισμένη μορφή μιας ουράς είναι ένας πίνακας περιορισμένου

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

έναν μονοδιάστατο πίνακα μεγέθους έστω Array[N] χρησιμοποιώντας πάντοτε δύο

δείκτες. Ένα δείκτη που να δείχνει το πρώτο στοιχείο της ουράς που είναι και το

πρώτο από όλα της τα στοιχεία που εισήχθη σ’ αυτήν και ονομάζεται κεφαλή της

ουράς (μεταβλητή Head). Κάθε φορά επομένως απωθείται το στοιχείο της αρχής της

ουράς που δείχνει η μεταβλητή head. Επίσης χρησιμοποιείται ένας δείκτης που

δείχνει στο τελευταίο στοιχείο της ουράς που είναι και το τελευταίο από όλα της τα

στοιχεία που εισήχθη σ’ αυτήν (μεταβλητή Back). Κάθε φορά επομένως εισέρχεται

ένα στοιχείο στο τέλος της ουράς μετά το τελευταίο της στοιχείο που δείχνει η

μεταβλητή back. Κατά την υλοποίηση των πράξεων της ουράς χρησιμοποιείτε

πάντοτε μία μεταβλητή τύπου Boolean η οποία ενημερώνει πάντοτε μετά την αίτηση

εκτέλεσης πράξης αν αυτήν εκτελέστηκε επιτυχώς ή όχι (έστω μεταβλητή check).

Έχουμε επομένως τον πίνακα Array[N] με τους δείκτες Head και Back ως εξής:

X

Y

Z

V

N

1

Head

Back

Page 32: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

32

Πρέπει να τονιστεί ότι όταν στην αρχή η ουρά είναι άδεια τότε ισχύει: Head=0 και

Back=0. Για να εισαχθεί ένα στοιχείο Την πρώτη φορά

Όταν εισάγετε για πρώτη φορά σε μια άδεια ουρά ένα στοιχείο τότε αυξάνεται

κατά ένα η Back (Back=1) και το στοιχείο καταλαμβάνει τη θέση

Array[Back]=Array[1]. Παράλληλα η head (που είναι μηδέν εφόσον ήταν άδεια η

ουρά) αυξάνεται κατά ένα και δείχνει στη θέση Array[1]. Το επόμενο στοιχείο

πηγαίνει στη θέση Array[2] και η Back=2 (η head τώρα δεν αλλάζει).

Αν θέλουμε να εξάγουμε ένα στοιχείο τότε παίρνουμε το Array[Head] = Array[1]

και. αυξάνουμε κατά ένα την Head και γίνεται 2 δείχνοντας στο επόμενο στοιχείο της

κεφαλής της ουράς.

Από το παραπάνω σχήμα καταλαβαίνουμε ότι εισήχθησαν στην ουρά 8 στοιχεία

και απωθήθηκαν 4. Το 5 στοιχείο που εισήχθη είναι το V το οποίο είναι και στην

κεφαλή της ουράς για να απωθηθεί.

Πράξη Enqueue()

Αν θεωρήσουμε ότι ουρά θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N]

δηλώνεται ως ακέραιος) τότε η πράξη ένθεσης καλείται όταν θέλουμε να εισάγουμε

ένα στοιχείο στην ουρά έστω num (μεταβλητή num τύπου ακεραίου). Η Enqueue

είναι μία ανεξάρτητη διαδικασία η οποία καλείται από το κύριο πρόγραμμα όταν

θέλουμε να εισάγουμε ένα στοιχείο στην ουρά. Συντάσσεται επομένως ως μία

συνάρτηση στην περίπτωση μας τύπου ακεραίου στην οποία μεταφέρεται μαζί ως

αρχικά δεδομένα και η τιμή του στοιχείου num. Όταν καλείται η Enqueue επομένως

έχει την μορφή Enqueue (num).

Όταν γίνει αίτηση για ένθεση (Enqueue (num)) πρέπει να εξεταστεί αρχικά το

γεγονός αν υπάρχει διαθέσιμος χώρος στην ουρά για να εισαχθεί το στοιχείο num.

Τονίσαμε ότι η μεταβλητή Back δείχνει στο τελευταίο στοιχείο της ουράς (που

εισήχθη και τελευταίο) και έχει στο παράδειγμα μας την τιμή Ν. Αν επομένως στο

παράδειγμα μας, η Back δείχνει στο στοιχείο N τότε δεν υπάρχει χώρος στην ουρά.

Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την μεταβλητή check ως

ψευδής. Στην αντίθετη περίπτωση υπάρχει χώρος για το στοιχείο num και τότε η

μεταβλητή Back αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη θέση της ουράς

που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση που δείχνει η

Back. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής.

Παράλληλα εξετάζουμε την περίπτωση όταν ένα στοιχείο εισάγετε για πρώτη

φορά σε μια άδεια ουρά. Τότε, όπως τονίσαμε παραπάνω, αυξάνεται κατά ένα η Back

(Back=1) και το στοιχείο καταλαμβάνει τη θέση Array[Back]=Array[1]. Παράλληλα

η head (που είναι μηδέν εφόσον ήταν άδεια η ουρά) αυξάνεται κατά ένα και δείχνει

στη θέση Array[1].

Παρακάτω δίνεται ο αλγόριθμος υλοποίησης της πράξης Enqueue σε

ψευδοκώδικα.

Αλγόριθμος Enqueue

Δεδομένα //num : ακέραιος αριθμός//

Αρχή

Aν Head=0 τότε Head=1;

Aν Back<N τότε

Page 33: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

33

Back = Back +1;

Array[Back]=num;

Check=αληθής;

Αλλιώς Check=ψευδής;

Τέλος Αν

Αποτελέσματα // Check //

Τέλος Enqueue

Πράξη Dequeue()

Αν θεωρήσουμε ότι ουρά θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N]

δηλώνεται ως ακέραιος) τότε η πράξη απώθησης καλείται όταν θέλουμε να

διαβάσουμε και να σβήσουμε παράλληλα το στοιχείο κεφαλή της ουράς έστω num

(μεταβλητή num τύπου ακεραίου). Η Dequeue είναι μία ανεξάρτητη διαδικασία και

συντάσσεται ως μία συνάρτηση στην περίπτωση μας τύπου ακεραίου. Όταν καλείται

η Dequeue επομένως έχει την μορφή Dequeue () και επιστρέφει την κεφαλή της

ουράς (αν εκτελεστεί επιτυχώς).

Όταν γίνει αίτηση για απώθηση (Dequeue ()) πρέπει να εξεταστεί αρχικά το

γεγονός αν υπάρχουν στοιχεία στην ουρά.. Τονίσαμε ότι η μεταβλητή Head δείχνει

στο πρώτο στοιχείο της ουράς (κεφαλή της). Αν επομένως η head έχει την τιμή 0

σημαίνει ότι η ουρά είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται η

μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στην ουρά

και η Dequeue επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η

μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στο επόμενο στοιχείο της ουράς

που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται επιτυχώς

και ορίζεται η μεταβλητή check ως αληθής.

Τέλος πρέπει να εξεταστεί η περίπτωση αν μετά από κάθε απώθηση άδειασε η

ουρά. Αυτό συμβαίνει αν η Head αυξανόμενη κατά 1 πάρει τιμή μεγαλύτερη της

Back. Τότε έχει απωθηθεί το τελευταίο στοιχείο της ουράς. Στην περίπτωση αυτή η

ουρά είναι άδεια και επομένως μπορούμε να την αρχικοποιήσουμε θέτοντας στις

μεταβλητές Head και Back την τιμή μηδέν.

Παρακάτω δίνεται ο αλγόριθμος υλοποίησης της πράξης Dequeue σε

ψευδοκώδικα.

Αλγόριθμος Dequeue

Αρχή

Aν Head>0 τότε

Num=Array[Head];

Head= Head+1;

check=αληθής;

Αν Head>Back τότε

Head=0;

Back=0;

Page 34: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

34

Τέλος Αν

Αλλιώς Check=ψευδής;

Τέλος Αν

Αποτελέσματα // Check, num//

Τέλος Dequeue

Από την υλοποίηση των πράξεων Enqueue και Dequeue, καταλαβαίνουμε ότι

μπορεί η μεταβλητή back να δείχνει στην τιμή N χωρίς αυτό να σημαίνει ότι η ουρά

είναι γεμάτη. Είναι γεμάτη μόνο αν back = N και Head = 1. Αν επομένως κάποια

στιγμή η back πάρει την τιμή N τότε ελέγχουμε την τιμή της Head. Αν είναι 1 τότε η

ουρά είναι γεμάτη διαφορετικά υπάρχουν κενές θέσεις στην ουρά που προέκυψαν

στην αρχή της από τις συνεχόμενες απωθήσεις στοιχείων. Στην περίπτωση αυτή

πρέπει να εκτελεστεί μία ρουτίνα η οποία να μετακινεί όλα τα στοιχεία της ουράς της

προς την αρχή της ώστε η head να γίνει 1 και η back να πάρει μία τιμή ανάλογα με το

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

την ρουτίνα μετακίνησης των στοιχείων Fragm().

Ουρά δακτυλίου

Όπως περιγράφθηκε παραπάνω μία παραλλαγή ουράς είναι αυτή του δακτυλίου

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

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

αποκλειστικά από 2 δείκτες αρχής και τέλους. Το γεγονός αυτό βελτιώνει τον

αλγόριθμο υλοποίησης της ουράς αφού θέτει μη αναγκαία την χρήση της ρουτίνας

μετακίνησης των στοιχείων Fragm().

2.4 Λίστες

Οι δομές δεδομένων που εξετάστηκαν προηγουμένως (στοίβες και ουρές) έχουν

κοινά βασικά χαρακτηριστικά. Πιο συγκεκριμένα:

1. Ακολουθούν αυστηρούς κανόνες που έχουν να κάνουν με τον τρόπο

αποθήκευσης των δεδομένων τους.

2. Έχουν τις ίδιες πράξεις ενώ οι λειτουργίες απώθησης τους (Pop και Dequeue)

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

Δηλαδή η απώθηση ενός στοιχείου από την στοίβα ή την ουρά έχει σαν

αποτέλεσμα και την διαγραφή του.

Στις παραπάνω δομές, η λογική σειρά με την οποία αποθηκεύονται τα στοιχεία

τους είναι ίδια με την φυσική τους σειρά. Κατά τη λειτουργία τους, τόσο οι στοίβες

όσο και οι ουρές χρησιμοποιούν μία συμπαγή περιοχή μνήμης – τουλάχιστον

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

έχουν να κάνουν με την διαχείριση του αποθηκευτικού χώρου (μνήμης). ¨Έτσι

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

Αντίθετα με την στοίβα ή την ουρά, σε μία λίστα τα στοιχεία αποθηκεύονται με

θέσεις που δεν προκαθορίζονται και στις οποίες είναι δυνατή η πρόσβαση με

οποιονδήποτε τρόπο. Αυτό είναι δυνατό γιατί κάθε στοιχείο πληροφορίας

συνοδεύεται από ένα δείκτη (pointer) που λειτουργεί ως σύνδεσμος (link) με το

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

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

Page 35: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

35

2.4.1 Εφαρμογές

Οι λίστες χρησιμοποιούνται ευρύτατα στα προγραμματισμό εφαρμογών λόγω του

τρόπου διαχείρισης της μνήμης. Ιδιαίτερα στις περιπτώσεις:

1. Δημιουργία πινάκων με μη προκαθορισμένο μέγεθος μνήμης. Δηλαδή, όταν

γνωρίζουμε το μέγεθος μνήμης που θα χρησιμοποιήσουμε μπορούμε να

χρησιμοποιήσουμε ένα πίνακα συγκεκριμένου μεγέθους ενώ σε αντίθετη

περίπτωση μία λίστα.

2. Επίσης χρησιμοποιούνται λίστες κατά την αποθήκευση πληροφοριών σε

βάσεις δεδομένων. Στην περίπτωση αυτή τα δεδομένα αποθηκεύονται σε

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

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

γρήγορα και εύκολα, χωρίς να απαιτείται η αναδιάταξη ολόκληρου του

αρχείου. Τα αρχεία συνήθως αποτελούνται από πολλά δεδομένα ενώ στο

πλήθος τους οι βάσεις δεδομένων είναι δυναμικές εφαρμογές με συνεχείς

λειτουργίες ανάκτησης, ένθεσης και διαγραφής.

2.4.2 Κατηγορίες λιστών

Υπάρχουν αρκετά είδη λιστών ανάλογα τον τρόπο μεν τον οποίο υλοποιούνται

αλλά και τις δυνατότητες που δίνονται στους χρήστες για την διαχείριση των

στοιχείων σ’ αυτές.

Η πιο απλή μορφή λέγεται απλή συνδεμένη λίστα (simply linked list). Τα βασικά

της συστατικά είναι οι θέσεις στις οποίες αποθηκεύονται τα στοιχεία που

ονομάζονται κόμβοι (nodes) οι οποίοι αποτελούνται από δύο μέρη. Καταρχήν σε ένα

κόμβο αποθηκεύονται τα ίδια τα στοιχεία πληροφορίας. Παράλληλα αποθηκεύεται

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

του πρώτου κόμβου είναι γνωστή και με τον τρόπο αυτό μέσω των συνδέσμων

μπορούμε να “διατρέξουμε” όλους τους κόμβους μέχρι τον τελευταίο. Αυτός

αναγνωρίζεται από το γεγονός ότι ο δείκτης επόμενου στοιχείου του έχει την τιμή

null (κενός δείκτης). Παρακάτω δίνεται ένα παράδειγμα απλής συνδεμένης λίστας.

Α Β C N

0

Απλή συνδεμένη λίστα

Επίσης, μία άλλη μορφή λίστας είναι η διπλά συνδεμένη λίστα ή συμμετρική

(symmetric lists). Στις λίστες αυτές περιέχονται σε κάθε κόμβο σύνδεσμοι όχι μόνο

για το επόμενο στοιχείο – κόμβο αλλά και για το προηγούμενο. Άρα έχουμε δύο

δείκτες. Παρακάτω δίνεται ένα παράδειγμα διπλής συνδεμένης λίστας.

Page 36: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

36

Α

0

Β C N

0

Διπλά συνδεμένη λίστα

Μία ακόμη μορφή λίστας είναι και η κυκλική (circular list) οι οποίες

παρουσιάζουν ιδιαίτερο ενδιαφέρον. Ουσιαστικά μία κυκλική λίστα είναι μία απλή

συνδεμένη λίστα με την διαφορά ότι ο δείκτης επόμενου στοιχείου του τελευταίου

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

λίστας. Η υλοποίηση αυτή παρουσιάζει αρκετές αλλαγές στον τρόπο υλοποίησης των

βασικών πράξεων της λίστας. Παρακάτω δίνεται ένα παράδειγμα κυκλικής λίστας.

Α Β C N

Κυκλική λίστα

2.4.3 Βασικές πράξεις σε λίστες

Πριν αναφερθούν οι βασικές πράξεις σε μία λίστα πρέπει να τονιστούν δύο

βασικοί παράμετροι στην υλοποίηση τους.

Οι λίστες είναι είτε στατικές είτε δυναμικές δομές δεδομένων. Όταν το

μέγεθος της λίστας δηλαδή το σύνολο των κόμβων είναι προκαθορισμένο τότε

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

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

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

Για την υλοποίηση μίας λίστας μπορούμε να χρησιμοποιήσουμε είτε έναν

αριθμητικό πίνακα στον οποίο θα αποθηκεύονται όλοι οι σύνδεσμοι των

κόμβων δηλαδή οι θέσεις των επόμενων στοιχείων είτε, αν και η γλώσσα

προγραμματισμού το επιτρέπει, δείκτες. Οι δείκτες είναι παρέχουν εύκολη

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

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

LISP (List Processing Language) και η Prolog. Οι περισσότερες όμως

παρέχουν τη δυνατότητα χρήσης δεικτών και έτσι η επεξεργασία μία λίστας

γίνεται εύκολη και αποδοτική.

Οι βασικές πράξεις οι οποίες χρησιμοποιούνται πάνω στις λίστες είναι:

1. Εισαγωγή (insertion) στοιχείου. Για να γίνει η εισαγωγή ενός στοιχείου

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

αποθηκευτεί. Η θέση του κόμβου ορίζεται με βάση τις απαιτήσεις του

προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας (απλή,

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

συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων.

Page 37: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

37

2. Διαγραφή (deletion) ενός στοιχείου. Για να γίνει η διαγραφή ενός στοιχείου

από τη λίστα αρκεί να τροποποιήσουμε το περιεχόμενο του συνδέσμου

επόμενου στοιχείου του προηγούμενου κόμβου.

3. Σάρωση λίστας. Με την πράξη αυτή προσπελαύνονται όλα τα στοιχεία της

λίστας ξεκινώντας από το πρώτο και ακολουθώντας τους κόμβους μέσω των

συνδέσμων τους μέχρι το τελευταίο στοιχείο που ο σύνδεσμος του επόμενου

στοιχείου του έχει την τιμή null (0).

4. Αναζήτηση στοιχείου. Με την πράξη αυτή μπορεί να γίνει η αναζήτηση ενός

στοιχείου που επιθυμούμε. Για την υλοποίηση της πράξης αυτής

χρησιμοποιείται η πράξη σάρωσης της λίστας. Η λίστα είναι μία γραμμική

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

5. Συνένωση λιστών. Με την πράξη αυτή είναι δυνατή η συνένωση δύο λιστών

σε μία λίστα διατηρώντας αρχικές προϋποθέσεις που δίνονται. Δηλαδή η

συνένωση μπορεί να γίνει απλά τοποθετώντας τη μία λίστα μετά την άλλη είτε

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

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

6. Αντιστροφή λίστας. Με την πράξη αυτή αλλάζει η φορά διάταξης της λίστας

ορίζοντας τον τελευταίο κόμβο ως πρώτο και αυτόν τελευταίο τροποποιώντας

κατάλληλα τους συνδέσμους όλων των κόμβων της λίστας.

2.4.4 Υλοποίηση αλγορίθμων των βασικών πράξεων

Στην παράγραφο αυτή θα μελετηθούν οι αλγόριθμοι υλοποίησης των βασικών

πράξεων μίας λίστας τονίζοντας τα βασικά βήματα τα οποία πρέπει να γίνουν στα

στοιχεία της. Στην συγκεκριμένη περίπτωση η δομή που χρησιμοποιείται είναι μία

απλή συνδεμένη λίστα.

Παρακάτω, θα χρησιμοποιήσουμε συμβολισμούς για τον ορισμό των αλγορίθμων

που βασίζονται στους εξής σχεδιαστικούς παράγοντες:

1. Κάθε ένας κόμβος της λίστας ουσιαστικά αποτελεί μία συγκεκριμένη διακριτή

οντότητα στην λίστα. Είναι σαφές ότι ένας ευέλικτος σχεδιασμός της λίστας

είναι να οριστεί κάθε κόμβος σαν μία μεταβλητή δομής η οποία περιέχει τόσο

το περιεχόμενο – στοιχείο όσο και τον δείκτη που δείχνει στο επόμενο

στοιχείο. Το περιεχόμενο μπορεί να είναι μία απλή μεταβλητή π.χ. ακεραίων

όταν έχουμε μία λίστα ακεραίων αριθμών . Τότε στη γλώσσα C θα έχει την

μορφή:

Struct intlist {

int num;

Struct intlist *next;

} node;

Επίσης, το περιεχόμενο-πληροφορία ενός κόμβου μπορεί να είναι ένα σύνολο

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

στη γλώσσα C θα έχει την μορφή:

Struct address {

char name [40];

char street[40];

Page 38: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

38

char city[20];

char state[3];

char zip[10];

struct adrees *next;

} node;

2. Παράλληλα, όπως θα προσέξαμε στα προηγούμενα παραδείγματα, ο δείκτης

που λειτουργεί σαν σύνδεσμος με τον επόμενο κόμβο έχει την μορφή :

Struct address *next; ή Struct intlist *next;

Ο συμβολισμός * σημαίνει ότι χρησιμοποιείται ένας δείκτης διευθύνσεων ως

σύνδεσμος με το επόμενο στοιχείο. Αυτός ο δείκτης σε κάθε κόμβο περιέχει

την διεύθυνση μνήμης που περιέχει τον επόμενο κόμβο (δηλαδή όλα τα

στοιχεία της δομής κόμβου).

3. Επίσης, μετά την δομή βλέπουμε ότι ορίζεται και η μεταβλητή node που

ουσιαστικά είναι η διεύθυνση – δείκτης ενός κόμβου.

4. Τέλος, πρέπει να τονιστεί ότι σε κάθε περίπτωση, για την επεξεργασία μίας

λίστας υπάρχουν δύο δείκτες (δείκτες στις δομές-κόμβους). Ο ένας, έστω

head, δείχνει στο πρώτο στοιχείο της λίστας ενώ ο δεύτερος, έστω last,

δείχνει στο τελευταίο.

Έτσι, με βάση τα παραπάνω μπορούμε να θεωρήσουμε αν Node είναι ο δείκτης

ενός κόμβου τότε στην περίπτωση της απλής συνδεμένης λίστας ακεραίων (Struct

intlist), με τον συμβολισμό Node.num ορίζουμε τον ίδιο τον ακέραιο αριθμό του

κόμβου ενώ με τον συμβολισμό node.next ορίζουμε τον δείκτη του κόμβου προς τον

επόμενο.

Εισαγωγή στοιχείου

Για να γίνει η εισαγωγή ενός στοιχείου πρέπει να δημιουργηθεί ένας νέος κόμβος

στην λίστα στον οποίο να αποθηκευτεί. Η θέση του κόμβου ορίζεται με βάση τις

απαιτήσεις του προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας

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

συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων.

Πιο συγκεκριμένα, μπορεί ο κόμβος να εισαχθεί στο μέσο της λίστας όπου ο

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

ενώ ο σύνδεσμος του νέου κόμβου θα πάρει την τιμή του είχε ο σύνδεσμος του

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

λίστας τότε ο σύνδεσμος επόμενου στοιχείου του τελευταίου κόμβου που είναι null

(0) πλέον δείχνει στο νέο στοιχείο ο σύνδεσμος του οποίου παίρνει την τιμή null (0)

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

σε λίστες είναι είτε εισαγωγή στοιχείου σε ταξινομημένη λίστα είτε στον τέλος μιας

απλής διασυνδεμένης λίστας.

Στο παρακάτω σχήμα, φαίνεται η εισαγωγή ενός στοιχείου σε μία απλή

συνδεμένη λίστα.

Page 39: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

39

Α Β C N

0

Α Β C N

0

Χ

Εισαγωγή του στοιχείου Χ στην απλή συνδεμένη λίστα

Τα βασικά βήματα του αλγορίθμου που εκτελούνται για να γίνει η παραπάνω

εισαγωγή παρουσιάζονται παρακάτω. Θεωρούμε ότι επεξεργαζόμαστε μία λίστα

ακεραίων.

Struct intlist {

int num;

Struct intlist *next;

} node;

Αλγόριθμος Εισαγωγή

Δεδομένα Ο δείκτης pro_node που δείχνει τον κόμβο μετά τον οποίο θα

εισαχθεί το στοιχείο, ο δείκτης node που δείχνει τη θέση (διεύθυνση)

του νέου κόμβου και το στοιχείο Χ που είναι ο ακέραιος που θα

εισαχθεί.

Αρχή

node.num=X;

node.next=pro_node.next;

pro_node.next=node;

Τέλος

Τέλος Εισαγωγή

Πρέπει να σημειώσουμε ότι ο παραπάνω αλγόριθμος εισαγωγής προϋποθέτει ότι

έχει γίνει μία αίτηση δέσμευσης χώρου μνήμης για τον κόμβο node και η διεύθυνση

έχει αποθηκευτεί στην μεταβλητή node. Μία τέτοια αίτηση στις γλώσσες

προγραμματισμού είναι μία ρουτίνα ή συνάρτηση. Τέτοια συνάρτηση στη Γλώσσα C

είναι η : malloc η οποία συντάσσεται στην περίπτωση μας ως εξής:

Node1 = (struct intlist *) malloc(sizeof(node));

Page 40: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

40

Η malloc είτε επιστρέφει μία διεύθυνση μνήμης στην οποία ,μπορεί να

αποθηκευτεί ο κόμβος είτε επιστρέφει null που σημαίνει ότι δεν μπορεί να

ικανοποιηθεί το αίτημα. Επίσης, τα byte του χώρου της μνήμης δεν παίρνουν αρχική

τιμή.

Διαγραφή στοιχείου.

Για να γίνει η διαγραφή ενός στοιχείου από τη λίστα αρκεί να τροποποιήσουμε το

περιεχόμενο του συνδέσμου επόμενου στοιχείου του προηγούμενου κόμβου. Αν

αυτός δείχνει στον κόμβο που δείχνει ο σύνδεσμος του προς διαγραφή κόμβου τότε

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

λίστας δεν “κόβεται”.

Στο παρακάτω σχήμα, φαίνεται η διαγραφή ενός στοιχείου από μία απλή

συνδεμένη λίστα.

Α Β C N

0

Α Β C N

0

Διαγραφή του στοιχείου Β από την απλή συνδεμένη λίστα

Τα βασικά βήματα του αλγορίθμου που εκτελούνται για να γίνει η παραπάνω

διαγραφή παρουσιάζονται παρακάτω. Θεωρούμε ότι επεξεργαζόμαστε μία λίστα

ακεραίων.

Struct intlist {

int num;

Struct intlist *next;

} node;

Αλγόριθμος Διαγραφή

Δεδομένα Ο δείκτης pro_node που δείχνει τον προηγούμενο κόμβο από αυτόν

που θα ακυρωθεί.

Αρχή

node=pro_node.next;

pro_node.next=node.next;

Page 41: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

41

Τέλος

Τέλος Διαγραφή

Αν και εκ πρώτης άποψης ο αλγόριθμος της διαγραφής είναι ιδιαίτερα απλός

παρόλα αυτά στην περίπτωση αυτή δημιουργείται ένα από τα δυσκολότερα

προβλήματα στην διαχείρηση λιστών. Το πρόβλημα που παρουσιάζεται είναι το

γεγονός ότι με τη συνεχή διαγραφή κόμβων της λίστας δημιουργούνται κενές θέσεις

ιδιαίτερα στην περίπτωση στατικών λιστών που υλοποιούνται με πίνακες. Έτσι μετά

από ένα σύνολο ακυρωμένων θέσεων είναι δυνατή η περίπτωση η λίστα να φαίνεται

γεμάτη ενώ ουσιαστικά δεν είναι. Το γεγονός αυτό το συναντήσαμε και στην

περίπτωση της ουράς και λύθηκε με την αντιμετάθεση των στοιχείων αφού οι κενές

θέσεις ήταν συνεχόμενες. Στις λίστες όμως οι κενές θέσεις δεν είναι συνεχόμενες

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

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

πρόγραμμα όλων των ακυρωμένων θέσεων ώστε σε κάθε εισαγωγή να μπορεί να

παραχωρήσει μία από αυτές τις κενές θέσεις.

Συνήθως χρησιμοποιούνται δύο τρόποι για την επίλυση του παραπάνω

προβλήματος:

1. Με τη χρήση στοίβας. Στην περίπτωση αυτή κάθε φορά που διαγράφεται

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

χρησιμοποιηθεί και ουρά αλλά η υλοποίηση στοίβας είναι πιο εύκολη. Όταν

ζητείται να γίνει μία εισαγωγή στοιχείου τότε το πρόγραμμα εξετάζει τη

στοίβα αν υπάρχει κενή θέση που προέκυψε από διαγραφή. Με τον τρόπο

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

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

2. Με τη χρήση λίστας. Αντί της στοίβας όπως είδαμε στην προηγούμενη

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

αποθηκεύονται όλες οι κενές θέσεις που δημιουργούνται μετά από διαγραφή

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

αφορά το είδος της λίστας που χρησιμοποιείται ανάλογα με τις απαιτήσεις του

χρήστη.

Σάρωση λίστας

Με την πράξη αυτή προσπελαύνονται όλα τα στοιχεία της λίστας ξεκινώντας από

το πρώτο και ακολουθώντας τους κόμβους μέσω των συνδέσμων τους μέχρι το

τελευταίο στοιχείο που ο σύνδεσμος του επομένου στοιχείου του έχει την τιμή null

(0). Είναι σαφές ότι γνωρίζουμε πιο είναι τόσο το πρώτο όσο και το τελευταίο

στοιχείο της λίστας μέσω των δεικτών head και last που περιγράψαμε παραπάνω.

Τα βασικά βήματα του αλγορίθμου που εκτελούνται για να γίνει μία σάρωση στη

λίστα παρουσιάζονται παρακάτω.

Αλγόριθμος Σάρωση

Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας

Αρχή

node=head;

Page 42: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

42

Όσο (node!=0) εκτέλεσε

Εμφάνισε στοιχείο node.num;

node=node.next;

Τέλος Όσο

Τέλος

Τέλος Σάρωση

Αναζήτηση στοιχείου

Με την πράξη αυτή μπορεί να γίνει η αναζήτηση ενός στοιχείου που επιθυμούμε.

Για την υλοποίηση της πράξης αυτής χρησιμοποιείται η πράξη σάρωσης της λίστας.

Η λίστα είναι μία γραμμική δομή άρα και η διαπέραση της μέσω των συνδέσμων

είναι γραμμική.

Τα βασικά βήματα του αλγορίθμου που εκτελούνται για να γίνει η αναζήτηση του

στοιχείου x (ακεραίου αριθμού) στη λίστα παρουσιάζονται παρακάτω.

Αλγόριθμος Αναζήτηση

Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας

Αρχή

node=head;

Όσο (node!=0) εκτέλεσε

Αν (node.num=x);

return True

node=node.next;

Τέλος Όσο

return False

Τέλος

Τέλος Αναζήτηση

Συνένωση λιστών

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

διατηρώντας αρχικές προϋποθέσεις που δίνονται. Δηλαδή η συνένωση μπορεί να

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

στην περίπτωση π.χ. που οι αρχικές λίστες είναι διατεταγμένες και επιθυμούμε η νέα

λίστα να είναι και αυτή διατεταγμένη. Στην πρώτη περίπτωση η συνένωση, τα βασικά

βήματα του αλγορίθμου που εκτελούνται παρουσιάζονται παρακάτω

Αλγόριθμος Συνένωση

Page 43: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

43

Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της δεύτερης λίστας,

Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας

Αρχή

last.next=head;

Τέλος

Τέλος Συνένωση

Αντιστροφή λίστας

Με την πράξη αυτή αλλάζει η φορά διάταξης της λίστας ορίζοντας τον τελευταίο

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

όλων των κόμβων της λίστας.

Τα βασικά βήματα του αλγορίθμου που εκτελούνται για να γίνει η αντιστροφή της

λίστας παρουσιάζονται παρακάτω.

Αλγόριθμος Αντιστροφή

Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας

Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας

Αρχή

node=head;

Όσο (node!=0) εκτέλεσε

y=node.next;

y.next=node;

Τέλος Όσο

head=last;

head.next=0;

Τέλος

Τέλος Αντιστροφή

Ερωτήσεις- Ασκήσεις Κεφαλαίου

1. Τι είναι οι γραμμικές δομές δεδομένων; Αναφέρατε τις σπουδαιότερες από

αυτές.

2. Αναφέρατε μερικά παραδείγματα μορφών πινάκων.

3. Τι είναι οι συμβολοσειρές; Ποια είναι η κύρια διαφορά όταν σε πίνακα

κάθε στοιχείο του που είναι συμβολοσειρά είναι σταθερού ή μεταβλητού

μεγέθους;

4. Τι είναι η στοίβα. Ποιες οι βασικές της πράξεις;

5. Δώστε τους αλγορίθμους των πράξεων push και pop σε μία στοίβα.

Page 44: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

44

6. Τι είναι ο πολωνικός συμβολισμός. Πως υλοποιείται η μετατροπή μιας

παράστασης από την ένθετη στην μεταθετική μορφή;

7. Τι είναι η ουρά. Ποιες οι βασικές της πράξεις;

8. Δώστε τους αλγορίθμους των πράξεων Enqueue και Dequeue σε μία ουρά.

9. Ποια είναι τα δύο κοινά χαρακτηριστικά της ουράς και της στοίβας;

10. Τι είναι η λίστα. Ποιες οι βασικές της εφαρμογές; Ποιες οι βασικές της

πράξεις;

11. Δώστε τους αλγορίθμους εισαγωγής και διαγραφής σε μία απλή συνδεμένη

λίστα.

Page 45: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

45

ΚΕΦΑΛΑΙΟ 3. ΜΗ ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

3.1 Δένδρα

3.1.1 Γενική περιγραφή - Ορισμοί

Αντίθετα με τις λίστες, το δένδρο είναι μία ειδική περίπτωση ενός γράφου που θα

μελετηθούν στην συνέχεια του κεφαλαίου. Είναι ένα συνεκτικό, άκυκλο και μη

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

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

κόμβους. Είναι σαφές ότι αντίθετα με τις προηγούμενες δομές δεδομένων που

εξετάστηκαν στις οποίες τα στοιχεία αποθηκεύονται γραμμικά διατεταγμένα, τα

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

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

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

αποτελεσματικές δομές για αποθήκευση και επεξεργασία μεγάλου όγκου δεδομένων

και χρησιμοποιούνται ευρύτατα σε κάθε είδος εφαρμογής.

Ένα δένδρο επομένως είναι ένα σύνολο κόμβων που συνδέονται με ακμές. Άρα

για οποιουσδήποτε δύο κόμβους υπάρχει ένα μοναδικό μονοπάτι που τους ενώνει. Η

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

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

κόμβος από τον οποίο ξεκινούν ακμές αλλά δεν υπάρχει ακμή που να φτάνει σ’ αυτόν

ονομάζεται ρίζα (root) του δένδρου. Σε κάθε κόμβο καταλήγει μία ακμή ενώ από

αυτόν ξεκινούν περισσότερες που δείχνει η κάθε μία σε έναν κόμβο. Οι κόμβοι στους

οποίους καταλήγει μία ακμή αλλά δεν ξεκινά από αυτούς καμία ονομάζονται φύλλα

του δένδρου. Παρακάτω δίνονται συνοπτικά οι ορισμοί των πιο συνηθισμένων όρων

που χρησιμοποιούνται στα δένδρα.

1. Πρόγονοι ενός κόμβου ή φύλλου είναι οι κόμβοι που βρίσκονται πάνω στο

μονοπάτι από τον κόμβο αυτό προς τη ρίζα. Στο σχήμα 2.5.1, πρόγονοι του

κόμβου D είναι οι κόμβοι B και Α.

2. Υπόδενδρο ονομάζεται το δένδρο που σχηματίζεται, αν ως ρίζα ληφθεί ένας

οποιασδήποτε κόμβος.

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

υπόδενδρο κάτω από αυτόν. Στο σχήμα 2.5.1, απόγονοι του κόμβου Β είναι οι

κόμβοι D και E.

4. Πατέρας ενός κόμβου ή ενός φύλλου είναι ο κοντινότερος πρόγονος του. Στο

σχήμα 2.5.1, πατέρας του κόμβου D είναι οι κόμβος Β.

5. Παιδιά ενός κόμβου είναι οι απόγονοι του για τους οποίους είναι πατέρας.

Στο σχήμα 2.5.1, παιδιά του κόμβου Β είναι οι κόμβοι D και E.

6. Ο βαθμός ενός κόμβου είναι ίσος με το πλήθος των παιδιών του. Στο σχήμα

2.5.1, ο βαθμός του κόμβου Β είναι 2.

7.

8. Το βάθος ενός κόμβου ή ενός φύλλου είναι ίσο με το μήκος (πλήθος

πλευρών) του μονοπατιού από αυτόν προς την ρίζα. Στο σχήμα 2.5.1, το

βάθος του κόμβου D είναι 2.

Page 46: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

46

9. Το ύψος ενός δένδρου είναι ίσο με το βάθος του φύλλου με το μεγαλύτερο

βάθος. Στο σχήμα 2.5.1, το ύψος του δένδρου είναι 3.

10. Επίπεδο ενός κόμβου είναι ο αριθμός των προγόνων του μέχρι τη ρίζα συν 1.

11. Φυλλοπροσανατολιζόμενα δένδρα καλούνται τα δένδρα στα οποία τα

δεδομένα είναι αποθηκευμένα μόνο στα φύλλα ενώ στους κόμβους

αποθηκεύεται μόνο βοηθητική πληροφορία. Το δένδρο του Σχήματος 2.5.1

είναι ένα φυλλοπροσανατολισμένο δένδρο.

12. Κομβοπροσανατολισμένα δένδρα καλούνται τα δένδρα στα οποία τα

δεδομένα είναι αποθηκευμένα στα φύλλα και στους κόμβους.

13. κ-δικό καλείται το δένδρο όπου κάθε κόμβος έχει βαθμό το πολύ κ. Το

δένδρο του Σχήματος 2.5.1 είναι δυαδικό.

Παρακάτω δίνεται ένα παράδειγμα δυαδικού δένδρου.

A

B C

D E F G

Σχήμα 2.5.1 Δυαδικό δένδρο

Ένα δένδρο βαθμού d και ύψους h μπορεί να έχει το πολύ :

1

0

h

i

di = (d

h-1)/(d-1)

κόμβους. ¨Όταν το δένδρο περιέχει το μέγιστο βαθμό κόμβων λέγεται πλήρες.

Από τον παραπάνω τύπο προκύπτει ότι ο αριθμός των κόμβων ενός πλήρους

δυαδικού δένδρου ύψους h είναι: 2h-1. Παράλληλα, ένα πλήρες δυαδικό δένδρο με n

κόμβους έχει ύψος τουλάχιστον logn. Σε κάθε δυαδικό δένδρο με n0 φύλλα και n1

κόμβους (που δεν είναι φύλλα και έχουν βαθμό 2), ισχύει:

n0 = n1 +1

Τέλος, πρέπει να τονιστεί ότι τα δένδρα διακρίνονται σε 3 κατηγορίες:

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

τα ημι-δυναμικά που παρέχουν κάποιες λειτουργίες τροποποίησης

και τα δυναμικά που δίνουν τη δυνατότητα μέσω των πράξεων σ’ αυτά να

μεταβάλλονται οι κόμβοι του δένδρου.

Page 47: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

47

3.1.2 Υλοποίηση δένδρου

Η υλοποίηση ενός δένδρου έχει αρκετές ομοιότητες με την υλοποίηση λίστας που

παρουσιάσαμε παραπάνω. Κάθε κόμβος του δένδρου περιέχει τόσο τα περιεχόμενα

του όσο και ένα σύνολο δεικτών ίσο με τον βαθμό του (το πλήθος των παιδιών του).

Άρα ενώ στη απλή διασυνδεμένη από κάθε κόμβο ξεκινούσε ένας δείκτης προς τον

επόμενο, στο δένδρο από κάθε κόμβο ξεκινούν τόσοι δείκτες όσα είναι τα παιδιά του.

Στα φύλλα του δένδρου, οι δείκτες τους έχουν την τιμή NULL.

Ένα δένδρο μπορεί να υλοποιηθεί είτε με τη χρήση πίνακα είτε με χρήση

εγγραφών.

Υλοποίηση με πίνακα

Η υλοποίηση με πίνακα χρησιμοποιεί έναν διδιάστατο πίνακα. Κάθε γραμμή του

πίνακα αντιστοιχεί σε ένα κόμβο ή φύλλο. Επομένως, αν h είναι το ύψος του δένδρου

το συνολικό μέγεθος του πίνακα στα πλήρη δυαδικά δένδρα είναι 2h-1. Σε κάθε μία

γραμμή, έστω ότι αυτή αντιστοιχεί στον κόμβο u, αποθηκεύεται τόσο το περιεχόμενο

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

πίνακα στις οποίες αποθηκεύονται κάθε ένα από τα παιδιά του κόμβου u. Συνήθως

στην πρώτη γραμμή του πίνακα αποθηκεύθεται η ρίζα του δένδρου ή αλλιώς

χρησιμοποιείται μία μεταβλητή που να δείχνει τη θέση της ρίζας μέσα στον πίνακα.

Έτσι για το φυλλοπροσανατολισμένο δυαδικό δένδρο του σχήματος 2.5.1 μπορεί

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

Θέση Αριστερό

Παιδί

Περιεχόμενο

Κόμβου

Δεξί

Παιδί

1 2 A 3

2 4 B 5

3 6 C 7

4 0 D 0

5 0 E 0

6 0 F 0

7 0 G 0

Για την σειρά αποθήκευσης των κόμβων του δένδρου στον πίνακα, αρχικά αυτοί

αριθμούνται από αριστερά προς τα δεξιά και από επίπεδο 1 της ρίζας μέχρι το

τελευταίο επίπεδο των φύλλων του δένδρου. Έτσι σε ένα πλήρες δυαδικό δένδρο

ύψους h, με πλήθος κόμβων 2h-1, για κάθε κόμβο i ισχύουν:

1. Ο πατέρας του βρίσκεται στη θέση [i/2] του πίνακα.

2. Το αριστερό παιδί του κόμβου i βρίσκεται στη θέση 2i, αν 2i<=n. Αλλιώς ο

κόμβος i δεν έχει αριστερό παιδί.

3. Το δεξί παιδί του κόμβου i βρίσκεται στη θέση 2i+1, αν 2i+1<=n. Αλλιώς ο

κόμβος i δεν έχει δεξί παιδί.

Page 48: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

48

Υλοποίηση με εγγραφές

Στην περίπτωση αυτή κάθε κόμβος ή φύλλο ενός κ-δικού δένδρου αποθηκεύεται

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

δείκτες ως μεταβλητές (ή έναν πίνακα δεικτών k θέσεων) για την υπόδειξη των k

παιδιών του. Παράλληλα χρησιμοποιείται και μία μεταβλητή τύπου δείκτη που

υποδεικνύει την εγγραφή της ρίζας.

Η υλοποίηση με του δείκτες πλεονεκτεί από την αντίστοιχη με πίνακες αφού η

δέσμευση της απαραίτητης μνήμης γίνεται δυναμικά και ανάλογα με τις τρέχουσες

απαιτήσεις. Στην περίπτωση του πίνακα είναι δυνατό να γεμίσει αυτός και να μην

“χωράει” άλλα στοιχεία ή και να έχει λίγα στοιχεία ενώ έχει δεσμευτεί το σύνολο του

αποθηκευτικού χώρου (σπατάλη μνήμης).

3.1.3 Μέθοδοι διάσχισης δένδρων

Σε αρκετές περιπτώσεις απαιτείται στα δένδρα η εκτέλεση μια σημαντικής

λειτουργίας που καλείται διάσχιση ή διέλευση. Αποτέλεσμα της λειτουργίας αυτής

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

Οι τρεις πιο συνηθισμένοι μέθοδοι διέλευσης δένδρων είναι : η προδιάταξη, η

μεταδιάταξη και η συμμετρική διάταξη. Κάθε μία από αυτές τις μεθόδους ορίζεται

ανάλογα με την σειρά εκτέλεσης των παρακάτω τριών λειτουργιών:

1. Επίσκεψη στη ρίζα.

2. Επίσκεψη στο αριστερό υπόδενδρο.

3. Επίσκεψη στο δεξιό υπόδενδρο.

Προδιάταξη (preorder)

Στη μέθοδο αυτή η σειρά εκτέλεσης των παραπάνω λειτουργιών είναι 1, 2 και 3.

Πιο συγκεκριμένα:

Α) Επεξεργάσου τη ρίζα

Β) Εφάρμοσε το ίδιο στα υπόδενδρα από αριστερά προς τα δεξιά

Ακολουθώντας την προδιάταξη στο δένδρο του σχήματος 2.5.1 θα επισκεφθούμε

τους κόμβους του με την ακόλουθη σειρά:

A, B, D, E, C, F και G

Για την υλοποίηση της λειτουργίας αυτής δίνεται ο παρακάτω αναδρομικός

αλγόριθμος.

Αλγόριθμος Preorder

Δεδομένα //Start: Δείκτης ρίζας//

Αρχή

Όσο Start <> NULL εκτέλεσε

Επίσκεψη ρίζας

Εκτύπωσε Start.info

Επίσκεψη αριστερού παιδιού

L=Start.Left

Page 49: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

49

Preorder(L)

Επίσκεψη δεξιού παιδιού

R=Start.Right

Preorder(R)

Τέλος Όσο

Τέλος

Αποτελέσματα //κόμβοι//

Τέλος Preorder

Μεταδιάταξη (Postorder)

Στη μέθοδο αυτή η σειρά εκτέλεσης των παραπάνω λειτουργιών είναι 2, 3 και 1.

Πιο συγκεκριμένα:

Α) Επισκέψου τα υπόδενδρα από αριστερά προς τα δεξιά

Α) Επεξεργάσου τη ρίζα

Ακολουθώντας την προδιάταξη στο δένδρο του σχήματος 2.5.1 θα επισκεφθούμε

τους κόμβους του με την ακόλουθη σειρά:

D, E, Β, F, G, C και A

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

αλγόριθμος του preorder.

Μεταδιάταξη (Postorder)

Στη μέθοδο αυτή η σειρά εκτέλεσης των παραπάνω λειτουργιών είναι 2, 3 και 1.

Πιο συγκεκριμένα:

Α) Επισκέψου τα υπόδενδρα από αριστερά προς τα δεξιά

Β) Επεξεργάσου τη ρίζα

Ακολουθώντας την μεταδιάταξη στο δένδρο του σχήματος 2.5.1 θα επισκεφθούμε

τους κόμβους του με την ακόλουθη σειρά:

D, E, Β, F, G, C και A

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

αλγόριθμος του preorder.

Συμμετρική διάταξη (Symmetric order ή inorder)

Στη μέθοδο αυτή η σειρά εκτέλεσης των παραπάνω λειτουργιών είναι 2, 1 και 3.

Πιο συγκεκριμένα:

Α) Επισκέψου το αριστερό υπόδενδρο.

Β) Επεξεργάσου τη ρίζα.

Γ) Επισκέψου το δεξιό υπόδενδρο.

Ακολουθώντας την συμμετρική διάταξη στο δένδρο του σχήματος 2.5.1 θα

επισκεφθούμε τους κόμβους του με την ακόλουθη σειρά:

D, Β, E, A, F, C και G

Page 50: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

50

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

αλγόριθμος του preorder.

Κάθε μία από τις μεθόδους διέλευσης χρειάζεται χρόνο O(n) όπου ν ο αριθμός

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

Εφαρμογή μετατροπής παραστάσεων στον πολωνικό συμβολισμό

Στην παρουσίαση της δομής δεδομένων στοίβας ορίσαμε τον πολωνικό

συμβολισμό μιας παράστασης τόσο στην γνωστή μας ένθετη (infix) όσο και στην

μεταθετική (postfix) και προθεματική (prefix). Στη συνέχεια περιγράψαμε ένας τρόπο

μετατροπής της παράστασης με τη χρήση στοίβας από την μία μορφή σε μία άλλη.

Στο σημείο αυτό πρέπει να τονιστεί το γεγονός ότι αντί για δομή στοίβας μπορούμε

να χρησιμοποιήσουμε δομή δένδρου.

Έστω ότι η παράσταση μας είναι : Α*Β+C*D.

Τότε το δένδρο που δημιουργείται για την αποθήκευση της είναι το παρακάτω:

+

* *

A B C D

Παρατηρούμε ότι η διέλευση του δένδρου με την μέθοδο της προδιάταξης δίνει

τον πολωνικό συμβολισμό της παράστασης στην προθεματική μορφή:

+*ΑΒ*CD

Επίσης, η διέλευση του δένδρου με την μέθοδο της μεταδιάταξης δίνει τον

πολωνικό συμβολισμό της παράστασης στην μεταθεματική μορφή:

ΑΒ*CD*+

Τέλος, η διέλευση του δένδρου με την μέθοδο της συμμετρικής διάταξης δίνει τον

πολωνικό συμβολισμό της παράστασης στην ένθετη μορφή:

Α*Β+C*D

3.1.4 Νηματοειδή δένδρα

¨Όπως τονίστηκε παραπάνω, οι δείκτες των φύλλων του δένδρου έχουν τιμή

NULL αφού δεν δείχνουν σε κανένα κόμβο (βαθμός 0). Το γεγονός αυτό μπορεί να

χρησιμοποιηθεί ώστε να εκμεταλλευτούμε τις τιμές των δεικτών αυτών και να

Page 51: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

51

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

επομένως από τα φύλλα σε άλλους κόμβους του δένδρου μέσω ακμών που

ονομάζονται νήματα (threads). Έτσι ο δεξιός δείκτης κάθε κόμβου – φύλλου μπορεί

να δείχνει στον επόμενο κόμβο επίσκεψης λαμβάνοντας υπόψη την διέλευση μέσω

συμμετρικής διάταξης. Το δένδρο που προκύπτει λέγεται δεξιό ενδονηματικό (right

in-threaded). Παράλληλα, καλούμαστε να κρατούμε μέσω μεταβλητής τον τύπο κάθε

δείκτη (νήμα ή δείκτης)

3.1.5 Υλοποίηση αλγορίθμων των βασικών πράξεων

Οι βασικές πράξεις οι οποίες χρησιμοποιούνται στα δένδρα είναι ίδιες όπως σε

όλες τις δομές.

1. Εισαγωγή (insertion) στοιχείου.

2. Σάρωση δένδρου

3. Διαγραφή (deletion) ενός στοιχείου.

4. Αναζήτηση (search) στοιχείου.

Στην παράγραφο αυτή θα μελετηθούν οι αλγόριθμοι υλοποίησης των βασικών

πράξεων τονίζοντας τα βασικά βήματα τα οποία πρέπει να γίνουν στα στοιχεία του.

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

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

κάθε κόμβου είναι μεγαλύτερη από την τιμή όλων των κόμβων του αριστερού του

υπόδενδρου και μεγαλύτερη από την τιμή όλων των κόμβων του δεξιού του

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

επιτρέπουν γρήγορη προσπέλαση δεδομένων τα οποία αποθηκεύονται με κάποια

σειρά κατάταξης..

Παρακάτω, θα χρησιμοποιήσουμε συμβολισμούς για τον ορισμό των αλγορίθμων

που βασίζονται στους εξής σχεδιαστικούς παράγοντες:

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

συγκεκριμένη διακριτή οντότητα. Είναι σαφές ότι ένας ευέλικτος σχεδιασμός

είναι να οριστεί κάθε κόμβος σαν μία μεταβλητή δομής η οποία περιέχει τόσο

το περιεχόμενο – στοιχείο όσο και δύο δείκτες προς τα δύο του παιδιά. Το

περιεχόμενο μπορεί να είναι μία απλή μεταβλητή π.χ. ακεραίων. Τότε στη

γλώσσα C, κάθε κόμβος θα έχει την μορφή:

Struct bintree {

int num;

Struct bintree *left;

Struct bintree *right;

} node;

2. Παράλληλα, οι δείκτες που λειτουργούν σαν σύνδεσμοι του κόμβου με τα

παιδιά του έχουν την μορφή :

Struct bintree *left και Struct bintree *right;

Ο συμβολισμός * σημαίνει ότι χρησιμοποιείται ένας δείκτης διευθύνσεων ως

σύνδεσμος. Αυτός ο δείκτης σε κάθε κόμβο περιέχει την διεύθυνση μνήμης

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

Page 52: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

52

3. Τέλος, πρέπει να τονιστεί ότι σε κάθε περίπτωση, για την επεξεργασία ενός

δένδρου υπάρχει ένας δείκτης, έστω root, ο οποίος δείχνει στο πρώτο στοιχείο

του δένδρου που είναι η ρίζα του.

Έτσι, με βάση τα παραπάνω μπορούμε να θεωρήσουμε αν node είναι ο δείκτης

ενός κόμβου τότε στην περίπτωση ενός δυαδικού δένδρου ακεραίων (Struct bintree),

με τον συμβολισμό node.num ορίζουμε τον ίδιο τον ακέραιο αριθμό του κόμβου ενώ

με τον συμβολισμό node.left ορίζουμε τον δείκτη του κόμβου προς τον επόμενο

αριστερό κόμβο-παιδί ενώ node.right ορίζουμε τον δείκτη του κόμβου προς τον

επόμενο δεξιό κόμβο-παιδί.

Παρακάτω δίνονται οι αλγόριθμοι των πράξεων εισαγωγής, αναζήτησης και

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

Εισαγωγή (insert)

Η πράξη της εισαγωγής ενός στοιχείου δεδομένου (στη συγκεκριμένο παράδειγμα

ακεραίου αριθμού) στο δένδρο γίνεται χρησιμοποιώντας μλια αναδρομική συνάρτηση

που έχει την ακόλουθη μορφή :

struct bintree *BuildTree(struct bintree *c_root, struct bintree *lr_child, int x)

Παρατηρούμε ότι η συνάρτηση καλείται δίνοντας 3 ορίσματα:

1. struct bintree *c_root. Είναι ο κόμβος (διεύθυνση μνήμης της δομής του

κόμβου) εκείνος, έστω u στους οποίου είτε το αριστερό είτε στο δεξί

υπόδενδρο θα αποθηκευτεί ο προς εισαγωγή αριθμός x.

2. struct bintree *lr_child. Είναι το αριστερό ή το δεξί παιδί, έστω v (διεύθυνση

μνήμης της δομής του κόμβου) του προηγούμνου κόμβου u. Στο υπόδενδρο

με ρίζα τον κόμβο v θα αποθηκευτεί ο προς εισαγωγή αριθμός x.

3. int x. Είναι ο προς εισαγωγή αριθμός x.

Επίσης παρατηρούμε ότι, η συνάρτηση BuildTree επιστρέφει ως όρισμα ένας

δείκτη διεύθυνσης μνήμης σε κόμβο του δένδρου.

Αρχικά το δένδρο είναι άδειο και root=NULL. Τότε καλείται η BuildTree με

ορίσματα:

struct bintree *BuildTree(root, root, x)

Σε κάθε περίπτωση όμως θα καλείται η BuildTree η οποία θα εξετάζει αν ο

κόμβος v είναι NULL ή όχι.

Στην πρώτη περίπτωση θα δεσμευτεί χώρος στη μνήμη (έστω δείκτης r) για τη

δημιουργία ενός νέου κόμβου στον οποίο θα αποθηκευτεί ο προς εισαγωγή αριθμός x

(r.num) ενώ οι δείκτες r.left και r.right θα γίνουν NULL. Αν ο κόμβος αυτός είναι η

ρίζα του δένδρου τότε επιστρέφει στην root την r. Σε οποιαδήποτε άλλη περίπτωση

θα πρέπει να ενημερώσει τον αριστερό ή τον δεξιό δείκτη του πατέρα u του v (πρώτο

όρισμα της συνάρτησης) ώστε να δείχνει σωστά στον νέο κόμβο r. Έτσι αν x<

c_root.num τότε c_root.left = x αλλιώς c_root.right = x.

Στην δεύτερη περίπτωση στην οποία ο κόμβος v περιέχει στοιχείο τότε η

διαδικασία θα προχωρήσει είτε προς το αριστερό υπόδενδρο του r αν x<r.num

(BuildTree(r, r.left, x)) ή αντίθετα προς το δεξιό υπόδενδρο (BuildTree(r, r.right, x)).

Παρατηρούμε έτσι ότι η συνάρτηση BuildTree είναι αναδρομική.

Παρακάτω δίνεται ο αλγόριθμος της πράξης εισαγωγής.

Page 53: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

53

Αλγόριθμος BuildTree

Δεδομένα Ο δείκτης c_root που δείχνει στη ρίζα του τρέχον δένδρου

Ο δείκτης lr_child που δείχνει στο αριστερό ή δεξιό υπόδενδρο της

ρίζας c_root

x: ο αριθμός που επιθυμούμε να εισάγουμε

Αρχή

Αν (lr_child = NULL) τότε

Δημιούργησε νέο κόμβο lr_child

lr_child.num=x

lr_child.left=NULL

lr_child.right=NULL

Αν (root=NULL) τότε

root=lr_child

τέλος Αν

Αν (x< c_root.left) τότε

c_root.left = lr_child

αλλιώς

c_root.right = lr_child

τέλος Αν

τέλος Αν

Αν (x<lr_child.left) τότε

BuildTree(lr_child, lr_child.left, x)

αλλιώς

BuildTree(lr_child, lr_child.right, x)

τέλος Αν

Τέλος

Αποτελέσματα //Ο κόμβος στον οποίο εισήχθει ο αριθμός x//

Τέλος BuildTree

Στο σημείο αυτό πρέπει να τονιστεί ότι η εισαγωγή τυχαίων αριθμών μέσα σε ένα

δένδρο αναζήτησης έχει ως αποτέλεσμα το δένδρο όχι μόνο να μην είναι

ισοζυγισμένο αλλά σε πολλές περιπτώσεις (εισαγωγή ταξινομημένων αριθμών) να

πλησιάζει η μορφή στην γραμμική λίστα.

Θα μπορούσε επομένως να γίνει μία αρχική εισαγωγή στοιχείων και δημιουργία

του δένδρου με τέτοιο τρόπο ώστε να είναι αυτό ισοζυγισμένο. Για να γίνει αυτό

μπορούμε να ακολουθήσουμε την παρακάτω διαδικασία:

Page 54: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

54

Αρχικά ζητούμε από τον χρήστη να εισάγει όλους τους αριθμούς που θέλει να

υποθηκεύσει στο δένδρο, έστω N. Τους αριθμούς αυτούς τους αποθηκεύει αρχικά σε

ένα πίνακα.

Στη συνέχεια ταξινομεί τους αριθμούς του πίνακα, έστω από τον μικρότερο προς

τον μεγαλύτερο.

Τέλος καλεί την συνάρτηση εισαγωγής BuildTree δίνοντας της τα στοιχεία από

τον πίνακα με τέτοιον τρόπο ώστε αυτά να εισάγονται κάθε φορά σε ένα

ισοζυγισμένο δυαδικό δένδρο αναζήτησης. Η επιλογή των αριθμών από τον πίνακα

γίνεται ως εξής:

Με τη χρήση ενός βρόγχου εισάγονται οι αριθμοί ανά επίπεδο δηλαδή από το

επίπεδο 1 της ρίζας έως και το επίπεδο LogN των φύλλων. Στο πρώτο επίπεδο αν ο

πίνακας έχει N στοιχεία εισάγεται στο στοιχείο Ν/2 που είναι το μεσαίο του

διαστήματος 0 έως Ν του πίνακα. Στο δεύτερο επίπεδο εισάγονται τα μεσαία στοιχεία

των διαστημάτων 0 έως Ν/2 και Ν/2 έως Ν κ.ο.κ. Σε κάθε επίπεδο λοιπόν εισάγονται

2h-1

στοιχεία από αντίστοιχα 2h-1

διαστήματα, όπου h το επίπεδο. Μπορούμε να

βρίσκουμε τα όρια των διαστημάτων ξεκινώντας κάθε φορά στο επίπεδο h από τη

θέση 0 του πίνακα προσθέτοντας την τιμή Ν/2h-1

μέχρι το τέλος του πίνακα (θέση N).

Πρέπει να προσέξουμε όταν το δένδρο δεν είναι πλήρες. Για να εισάγει το μεσαίο

αριθμό ενός διαστήματος πρέπει να όρια να διαφέρουν τουλάχιστον κατά 2 θέσεις.

Επίσης όταν δεν είναι πλήρες το δένδρο, στο τελευταίο επίπεδο πρέπει να εισαχθεί ο

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

Σάρωση δένδρου

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

βασικές μεθόδους: την προδιάταξη, την μεταδιάταξη και την ενδοδιάταση.

Αναζήτηση (search)

Κατά την πράξη της αναζήτησης ενός αριθμού στο δένδρο, αρχικά μέσω του

δείκτη root που δείχνει στην ρίζα του δένδρου προσπελαύνουμε το πρώτο του

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

τιμή της ρίζας του δένδρου (node.num) τότε συνεχίζουμε με το αριστερό υπόδενδρο.

Δηλαδή ακολουθώντας τον δείκτη που δείχνει στο αριστερό υπόδενδρο (node.left)

ακολουθούμε την ίδια διαδικασία με το αριστερό παιδί του κόμβου. Αντίστοιχα, αν ο

αριθμός που αναζητούμε είναι μεγαλύτερος από την τιμή της ρίζας του δένδρου

(node.num) τότε συνεχίζουμε με το δεξιό υπόδενδρο μέσω του δείκτη (node.right). Η

αναζήτηση σταματά όταν βρεθεί ο αριθμός ως τιμή σε κάποιον κόμβο του δένδρου

οπότε και επιστρέφεται ο κόμβος αυτός ή φτάνουμε σε κενό δείκτη, δηλαδή σε φύλλο

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

Παρακάτω δίνεται ο αλγόριθμος της πράξης αναζήτησης.

Αλγόριθμος Search

Δεδομένα Ο δείκτης root που δείχνει στη τρέχουσα ρίζα του δένδρου

x: ο ζητούμενος αριθμός ή κόμβος

Flag: μία λογική μεταβλητή

Αρχή

Current_node=root;

Page 55: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

55

Όσο (Current_node!=0) και (flag = FALSE) εκτέλεσε

Αν (x = Current_node.num) τότε

flag = TRUE

αλλιώς

Αν (x < Current_node.num) τότε

Current_node= Current_node.left

αλλιώς

Current_node= Current_node.right

Τέλος Αν

Τέλος Όσο

Τέλος

Αποτελέσματα // Αν flag = FALSE ανεπιτυχής αναζήτηση αλλιώς επιτυχής//

Τέλος Search

Διαγραφή (deletion)

Η πράξη της διαγραφής ενός αριθμού από το δένδρο γίνεται με πιο πολύπλοκο

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

root που δείχνει στην ρίζα του δένδρου προσπελαύνουμε το πρώτο του στοιχείο

δηλαδή την ρίζα. Αν ο αριθμός που αναζητούμε είναι μικρότερος από την τιμή της

ρίζας του δένδρου (node.num) τότε συνεχίζουμε με το αριστερό υπόδενδρο. Δηλαδή

ακολουθώντας τον δείκτη που δείχνει στο αριστερό υπόδενδρο (node.left)

ακολουθούμε την ίδια διαδικασία με το αριστερό παιδί του κόμβου. Αντίστοιχα, αν ο

αριθμός που αναζητούμε είναι μεγαλύτερος από την τιμή της ρίζας του δένδρου

(node.num) τότε συνεχίζουμε με το δεξιό υπόδενδρο μέσω του δείκτη (node.right).

Αν βρεθεί ο αριθμός ως τιμή σε κάποιον κόμβο του δένδρου τότε ενημερώνει η

πράξη ότι ο αριθμός που καλούμαστε να σβήσουμε βρέθηκε στο δένδρο. Ο τρόπος

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

Αν ο κόμβος διαγραφής είναι παιδί, γεγονός που σημαίνει ότι και οι δύο δείκτες

του (node.left και node.right) για το αριστερό και δεξί παιδί είναι NULL, τότε αρκεί

σβήσουμε το φύλλο πηγαίνοντας στον πατέρα του και κάνοντας NULL τον δείκτη

(αριστερό ή δεξί) που δείχνει στο φύλλο.

Αν ο κόμβος διαγραφής είναι ενδιάμεσος κόμβος τότε εξετάζεται αν έχει δύο

παιδιά ή ένα (αν ένας δείκτης node.left ή node.right είναι NULL). Αν ναι τότε ο

κόμβος σβήνεται και αντικαθίσταται από το παιδί του. Αν όμως ο κόμβος που

θέλουμε να διαγράψουμε έχει δύο παιδιά (οι δείκτες node.left και node.right δεν είναι

NULL) τότε ο κόμβος σβήνεται και αντικαθίσταται είτε από τον αριστερό κόμβο

(παιδί του) είτε από τον δεξί. Στην περίπτωση όμως αυτή πρέπει να εκτελεστεί μία

συνάρτηση η οποία να υπολογίζει τον κόμβο που θα αντικαταστήσει αυτόν που θα

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

Αλγόριθμος deletion

Δεδομένα Ο δείκτης root που δείχνει στη ρίζα του δένδρου

x: ο αριθμός που επιθυμούμε να σβήσουμε (ή κόμβος)

Page 56: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

56

Flag: μία λογική μεταβλητή

Current_node : μεταβλητή που κρατά τον τρέχον κόμβο εξέτασης

Αρχή

Current_node=root

Flag= FALSE

Όσο (Current_node!=0) και (flag = FALSE) εκτέλεσε

Αν (x = Current_node.num) τότε

Αν (Current_node.left=NULL) και

(Current_node.right=NULL) τότε

Σβήσε κόμβο Current_node

Ενημέρωσε δείκτη του πατέρα του να είναι

NULL

flag= TRUE

αλλιώς Αν (Current_node. right =NULL)

Ενημέρωσε δείκτη του πατέρα του να δείχνει

στο Current_node. left

Σβήσε κόμβο Current_node

flag= TRUE

αλλιώς

Σβήσε κόμβο Current_node

Αντικατέστησε τον κόμβο

αλλιώς

Αν (x < Current_node.num) τότε

Current_node= Current_node.left

Deletion(Current_node.left,x)

αλλιώς

Current_node= Current_node.right

Deletion(Current_node. right,x)

Τέλος Αν

Τέλος Όσο

Τέλος

Αποτελέσματα //Αν flag = FALSE δεν υπάρχει ο αριθμός αλλιώς επιτυχής

διαγραφή//

Τέλος deletion

Page 57: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

57

3.1.6 Ισοζυγισμένα δένδρα

Ισοζυγισμένο είναι ένα δυαδικό δέντρο όταν σε κάθε κόμβο του το αριστερό και

το δεξιό υπόδεντρο έχουν πλήθος κόμβων που μπορεί να διαφέρει το πολύ κατά 1.

Μετά από συνεχόμενες πράξεις εισαγωγής και διαγραφής στοιχείων κάθε δένδρο

τείνει να γίνει γραμμική λίστα αυξάνοντας ουσιαστικά το ύψος του. Οι πράξεις σε

ένα ισοζυγισμένο δένδρο εκτελούνται γρήγορα και για το λόγο αυτό είναι επιθυμητό

σε κάθε δένδρο να εφαρμόζονται οι κατάλληλες λειτουργίες επαναφοράς ώστε να

κρατείται συνεχώς ισοζυγισμένο.

3.2 Γράφοι

3.2.1 Τι είναι γράφος

Παραπάνω περιγράψαμε δομές δεδομένων οι οποίες αποτελούνται από κόμβους

και συνδέσεις ή αλλιώς ακμές. Τόσο η διάταξη των κόμβων όσο και το πλήθος και

είδος των ακμών καθόριζαν τη δομή και τη λειτουργία της δομής δεδομένων. Έτσι

στις λίστες είχαμε ένα σύνολο από κόμβους που ο κάθε ένας συνδέονταν μέσω μίας

σύνδεσης – ακμής με τον επόμενο κόμβο σχηματίζοντας μία απλή συνδεμένη λίστα.

Παράλληλα στα δένδρα είχαμε από κάθε κόμβο περισσότερες ακμές που ανάλογα με

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

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

μερικά ζεύγη αυτών συνδέονται με ακμές τότε αυτή καλείται γράφος.

Ένας γράφος είναι ένα διατεταγμένο ζεύγος G (V,E), όπου το V = v1, v2,…, vn, με

n>0 είναι το σύνολο των κορυφών ή κόμβων ενώ Ε είναι ένα σύνολο από διμελή

σύνολα κορυφών (x,y) που ορίζουν τις ακμές του γράφου.

Παράδειγμα

Έστω έχουμε τον γράφο G (V,E), με V = { v1, v2, v3} και Ε={( v1, v2), ( v2, v3),

(v1, v3)}. Στην περίπτωση αυτή ο γράφος αποτελείται από 3 κορυφές και 3 ακμές

όπως φαίνεται και στο παρακάτω σχήμα.

V1

V3V2

3.2.2 Βασικοί κανόνες απεικόνισης γράφων

Είναι σαφές ότι ένας γράφος ορίζεται μόνο από τα σύνολα V και E, και όχι από

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

τους απεικόνιση. Έτσι, ένας γράφος απεικονίζεται γραφικά σε ένα επίπεδο

σημειώνοντας τις κορυφές και τις ακμές του.

Για την παράσταση ενός γράφου στον υπολογιστή μπορεί να χρησιμοποιηθεί είτε

ένας πίνακας γειτνίασης (adjacency matrix) είτε μία λίστα γειτνίασης (adjacency

list).

Page 58: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

58

Έστω έχουμε έναν γράφο με n κορυφές. Τότε ο πίνακας γειτνίασης είναι ένας

πίνακας n x n έστω A με στοιχεία aij όπου i,j=1,2,3..,n. Κάθε στοιχείο του πίνακα aij

ισούται με 1 στην περίπτωση που υπάρχει ακμή με άκρα τις κορυφές i και j ενώ

ισούται με 0 στην αντίθετη περίπτωση. Έστω ο γράφος:

A

ΓB Δ

Ο πίνακας επομένως γειτνίασης του γράφου που απεικoνίζεται στο παραπάνω

σχήμα είναι ο :

0100

1011

0101

0110

Η λίστα γειτνίασης αποτελείται από n λίστες. Στην i-οστή λίστα ορίζονται οι

κορυφές που αποτελούν μαζί με την κορυφή i άκρα μιας ακμής του γράφου.

Για το παραπάνω σχήμα η λίστα γειτνίασης είναι η :

A: Β, Γ

B: Α, Γ

Γ: Α, Β, Δ

Δ: Γ

Για την απεικόνιση κάθε γράφου αρχικά ακολουθούνται κάποιοι κανόνες όπως:

Σε κάθε γράφο δύο οποιασδήποτε ακμές του κατά την παράσταση του

μπορούν να τέμνονται. Η τομή τους βέβαια δεν αντιστοιχεί σε κορυφή.

Σε κάθε γράφο δύο οποιεσδήποτε κορυφές του δεν μπορούν να συνδέονται

μεταξύ τους με περισσότερες από μία ακμές.

Σε κάθε γράφο δεν επιτρέπονται ανακυκλώσεις δηλαδή να ξεκινά μία ακμή

από μία κορυφή του και να καταλήγει στην ίδια κορυφή (σε αντίθετη

περίπτωση ορίζονται οι πολλαπλοί γράφοι).

Παράλληλα ακολουθείται μία κοινή ονοματολογία όπως:

1. Όταν ο γράφος έχει μόνο μία κορυφή και καμία ακμή ονομάζεται

τετριμμένος.

2. Οι κορυφές x και y ενός γράφου που ορίζουν μία ακμή του έστω α λέγονται

άκρα της α. Τότε λέμε ότι η ακμή α προσπίπτει στις κορυφές x και y του

γράφου.

3. Αν δύο ακμές προσπίπτουν σε μία κοινή κορυφή τότε ονομάζονται όμορες.

Page 59: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

59

4. Οι κορυφές x και y ενός γράφου που ορίζουν μία ακμή του καλούνται

γειτονικές.

5. Ο αριθμός των ακμών που προσπίπτουν σε μία κορυφή έστω v ορίζει τον

βαθμό της κορυφής v και συμβολίζεται με d(v). Ισχύει το θεώρημα:

Το άθροισμα των βαθμών όλων των κορυφών ενός γράφου ισούται με το

διπλάσιο του αριθμού των ακμών του.

Απόδειξη: Είναι προφανές ότι αφού κάθε ακμή έχει δύο άκρα.

6. Ένας γράφος G’(V’,E’) είναι υπογράφος (subgraph) του γράφου G(V,E)

όταν όλοι οι κόμβοι και οι ακμές του γράφου G’ περιέχονται στον γράφο G

δηλαδή ισχύουν: V’ ≤ V και E’≤ E.

Παράδειγμα:

Ο γράφος :

A

ΓB Δ

έχει υπογράφο:

A

ΓB

Για κάθε υποσύνολο κορυφών V’ του V παράγεται ένας υπογράφος ο

οποίος έχει ως σύνολο κορυφών το V’ και ως σύνολο ακμών όλες τις ακμές

του G με άκρα στο V’.

Επίσης μπορούμε να παράγουμε έναν υπογράφο G’ ενός γράφου G αν

αφαιρέσουμε από τον G (σύνολο Ε) μία ακμή.

Αντίστοιχα, να παράγουμε έναν υπογράφο G’ ενός γράφου G αν

αφαιρέσουμε από τον G (σύνολο V) μία κορυφή έστω x. Παράλληλα βέβαια

αφαιρούνται και όλες οι ακμές που έχουν ως άκρο την κορυφή x.

3.2.3 Βασικές κατηγορίες γράφων

Πολλαπλοί γράφοι

Πολλαπλοί γράφοι είναι οι γράφοι στους οποίους επιτρέπονται ανακυκλώσεις

δηλαδή ακμές που έχουν ως δύο άκρα τους την ίδια κορυφή.

Page 60: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

60

Τυπικά, ένας πολλαπλός είναι ένας γράφος G(V,E) όπου το Ε περιέχει ακμές της

μορφής (a,n) με:

Α ένα ζεύγος διαφορετικών κορυφών ή μόνο μία κορυφή ως άκρα

Και n είναι ένας φυσικός αριθμός που χρησιμοποιείται για τον ορισμό του

πλήθους των ανακυκλώσεων σε μία κορυφή.

Παράδειγμα

Έστω έχουμε τον γράφο G (V,E), με V = { v1, v2, v3} και Ε={{( v1, v2),0} , {( v1,

v2),1}, {( v1, v3),0}, {(v3),0},{( v2, v3),0}}. Στην περίπτωση αυτή ο γράφος

αποτελείται από 3 κορυφές και 5 ακμές όπως φαίνεται και στο παρακάτω σχήμα.

V1

V2 V3

Ισομορφικοί γράφοι

Δύο γράφοι G’(V’,E’) και G(V,E) καλούνται ισομορφικοί (isomorphic) αν

υπάρχει αμφιμονοσύμαντη αντιστοιχία μεταξύ των συνόλων V’ και V τέτοια ώστε

να διατηρείται ο ίδιος πίνακας γειτνίασης.

Στο παρακάτω σχήμα δίνονται δύο ισομορφικοί γράφοι.

Δ

ΓB

A

α

Χ

Ζ W

Υ

β

Σχήμα 3.2.3.1

Επίπεδοι γράφοι.

Οι ισόμορφοι γράφοι καθώς και εκείνοι στους οποίους οι ακμές μπορούν να

απεικονιστούν στο επίπεδο με τέτοιο τρόπο ώστε οι ακμές τους να τέμνονται μόνο

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

Στο σχήμα 3.2.3.1 ο β γράφος είναι επίπεδος.

Page 61: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

61

Πλήρης γράφος

Ένας γράφος καλείται πλήρης όταν υπάρχουν ακμές που συνδέουν κάθε ζεύγος

κορυφών του γράφου. Ένας πλήρης γράφος με n κορυφές παριστάνεται με Kn.

Στο σχήμα 3.2.3.1 ο α γράφος είναι πλήρης.

Διμερής γράφος

Διμερής καλείται ένας γράφος όταν οι κορυφές του μπορούν να χωριστούν σε δύο

ξένα μεταξύ τους σύνολα και όλες οι ακμές του έχουν ως ένα άκρο τους μία κορυφή

από το πρώτο σύνολο και το άλλο άκρο τους ανήκει στο δεύτερο σύνολο.

Ένας διμερής γράφος είναι πλήρης όταν υπάρχουν ακμές που ενώνουν κάθε

ζεύγος κορυφών (από τα δύο σύνολα κορυφών).

Ένας πλήρης διμερής γράφος των οποίων τα δύο σύνολα κορυφών έχουν n και m

κορυφές αντίστοιχα συμβολίζεται με Kn, m.

Στο παρακάτω σχήμα δίνεται ένας διμερής γράφος.

Υ

ΖΓ

Β

ΧA

Συμπληρωματικοί γράφοι

Δύο γράφοι G’(V’,E’) και G(V,E) καλούνται συμπληρωματικοί όταν έχουν το

σύνολο κορυφών (V’ = V) και ισχύει : E ∩ E’ = Ø και για οποιεσδήποτε δύο

κορυφές v και u, {v,u}∈ E ∪ E’.

Στο παρακάτω σχήμα δίνονται δύο συμπληρωματικοί γράφοι.

ΥΒ

ΧA

ΥΒ

ΧA

Παρακάτω θα δούμε και άλλες σημαντικές κατηγορίες γράφων οι οποίες

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

έννοιες που θα μελετήσουμε στη συνέχεια.

Page 62: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

62

3.2.4 Διαπερατότητα

Έστω έχουμε έναν γράφο G(V,E) με n κορυφές V1, V2,….,Vn. Διαδρομή (path) ή

περίπατος του γράφου G είναι μία ακολουθία των κορυφών του έτσι ώστε

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

την πρώτη και την τελευταία κορυφή. Αν αυτές αποτελούν την ίδια κορυφή τότε η

διαδρομή καλείται κλειστή αλλιώς ανοικτή.

Το μήκος μιας διαδρομή είναι το σύνολο (πλήθος) των κορυφών που την ορίζουν.

Στην περίπτωση που όλες οι κορυφές μιας διαδρομής είναι μοναδικές (δεν

περιέχει δύο ίδιες κορυφές) τότε η διαδρομή καλείται απλή ή μονοπάτι.

Στην περίπτωση που όλες οι ακμές μιας διαδρομής είναι μοναδικές τότε η

διαδρομή καλείται ίχνος.

Μία κλειστή απλή διαδρομή με περισσότερες από 2 κορυφές καλείται κύκλος.

Ένας γράφος που δεν περιέχει κύκλους λέγεται άκυκλος ή μη κυκλικός (acycle).

Η απόσταση (distance) μεταξύ δύο κορυφών είναι το μήκος της συντομότερης

διαδρομής ανάμεσα σ΄ αυτές.

Παράδειγμα

Έστω έχουμε τον γράφο G (V,E) του παρακάτω σχήματος.

ΥΒ

ΧA

Γ

Δ

Στον γράφο αυτό έχουμε:

Περίπατος είναι μία διαδρομή του όπως η : Γ, Χ, Α, Β, Χ, Α.

Μονοπάτι είναι μία διαδρομή του όπως η : Γ, Χ, Α, Β, Δ μήκους 4.

Ϊχνος είναι μία διαδρομή του όπως η : Γ, Χ, Β, Δ, Υ

Κύκλος είναι μία διαδρομή του όπως η : Γ, Χ, Β, Α, Γ.

Στη συνέχεια θα εξετάσουμε βασικές κατηγορίες γράφων που συναντούμε συχνά

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

ο γράφος Euler, ο γράφος Hamilton καθώς και οι κατευθυνόμενοι και μη γράφοι.

Page 63: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

63

Γράφος Euler

Γράφος Euler καλείται ο γράφος εκείνος στον οποίο υπάρχει διαδρομή που περνά

από όλες τις ακμές ακριβώς μία φορά. Η διαδρομή αυτή ονομάζεται διαδρομή Euler ή

ίχνος Euler ή μονοκονδυλιά.

Στον παρπάνω γράφο έχουμε την διαδρομή Euler : Γ, Α, Β, Δ, Υ, Χ, Α, Υ, Β, Χ

και Γ.

Γράφος Hamilton

Γράφος Hamilton καλείται ο γράφος εκείνος στον οποίο υπάρχει διαδρομή που

περνά από όλες τις κορυφές του γράφου ακριβώς μία φορά. Η διαδρομή αυτή

ονομάζεται διαδρομή Hamilton ή μονοπάτι Hamilton.

Στον παρπάνω γράφο έχουμε την διαδρομή Hamilton: Γ, Α, Β, Δ, Υ και Χ.

Ένας κύκλος καλείται κύκλος Hamilton αν περιέχει όλες τις κορυφές του γράφου.

Πρέπει να επισημανθεί η το γεγονός ότι ένας πλήρης γράφος έχει πάντοτε κύκλο

Hamilton. Επίσης ισχύουν τα παρακάτω θεωρήματα:

1. Σε έναν γράφο με n κορυφές, αν όλες οι κορυφές έχουν βαθμό n-1 τότε

υπάρχει στον γράφο κύκλος Hamilton.

2. Σε έναν γράφο με n κορυφές, αν όλες οι κορυφές έχουν βαθμό μεγαλύτερο ή

ίσο του n/2 τότε υπάρχει στον γράφο κύκλος Hamilton.

3. Σε έναν γράφο με n κορυφές, αν το άθροισμα των βαθμών δύο μη

γειτονικών κορυφών είναι μεγαλύτερο ή ίσο του αριθμού των κορυφών n,

τότε υπάρχει στον γράφο κύκλος Hamilton (με n≥3).

Οι αποδείξεις των παραπάνω θεωρημάτων δίνονται ως ασκήσεις για τον

σπουδαστή.

Συνεκτικός γράφος

Ένας γράφος λέγεται συνεκτικός (connected) όταν δύο οποιεσδήποτε κορυφές

του συνδέονται με ένα μονοπάτι.

Συνεκτική συνιστώσα ενός γράφου G (V,E) καλείται ένας υπογράφος G’ που

είναι συνεκτικός και για τον οποίο δεν υπάρχει άλλος υπογράφος του G που να είναι

υπογράφος και του G’.

Στο παρακάτω σχήμα φαίνεται ένας συνεκτικός γράφος.

A

ΓB Δ

Ένας γράφος είναι δισυνεκτικός όταν για κάθε ζευγάρι κορυφών υπάρχουν δύο

διαφορετικές διαδρομές οι οποίες τις συνδέουν.

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

Page 64: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

64

Υ

Β

Χ

Ασθενώς συνεκτικός είναι εκείνος ο γράφος στον οποίο για κάθε ζευγάρι

κορυφών x και y υπάρχει μία τουλάχιστον διαδρομή είτε από το x στο y είτε από το y

στο x.

Κατευθυνόμενοι και μη κατευθυνόμενοι γράφοι

Ένας γράφος είναι κατευθυνόμενος ή μη κατευθυνόμενος αν οι ακμές του είναι η

δεν είναι προσανατολιζόμενες προς μία κατεύθυνση, αντίστοιχα. Ο προσανατολισμός

της ακμής ορίζεται με ένα βέλος.

Πρέπει να τονιστεί ότι στους κατευθυνόμενους γράφους επιτρέπονται

ανακυκλώσεις. Επίσης δεν επιτρέπονται πολλαπλές ακμές με τα ίδια άκρα και την

ίδια κατεύθυνση.

Παράλληλα επεκτείνεται στους κατευθυνόμενους γράφους και ο ορισμός του

βαθμού μιας κορυφής. Έχουμε στην περίπτωση αυτή τον βαθμό εισόδου (in-degree)

που αποτελεί το πλήθος των ακμών που καταλήγουν σε μια κορυφή και τον βαθμό

εξόδου (out-degree) που αποτελεί το πλήθος των ακμών που ξεκινούν από την

κορυφή. Ο βαθμός της κορυφής είναι το άθροισμα του βαθμού εισόδου και εξόδου

της.

Παράδειγμα

Παρακάτω δίνεται ένα παράδειγμα κατευθυνόμενου γράφου.

Υ

Χ

Page 65: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

65

3.2.5 Συνεκτικότητα

Στην παράγραφο αυτή θα εισάγουμε την έννοια της συνεκτικότητας στους

γράφους.

Έστω έχουμε έναν γράφο G. Τότε η συνεκτικότητα του γράφου που ορίζεται ως

προς τις κορυφές του καλείται ο ελάχιστος αριθμός κορυφών που πρέπει να

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

συνεκτικός ή ένας τετριμμένος γράφος. Η συνεκτικότητα ενός γράφου G ως προς τις

κορυφές του συμβολίζεται με κ(G).

Παράλληλα, η συνεκτικότητα ενός γράφου ορίζεται και με βάση τις ακμές του.

Στην περίπτωση αυτή καλείται ο ελάχιστος αριθμός ακμών που πρέπει να αναιρεθούν

από τον γράφο έτσι ώστε ο υπογράφος του που προκύπτει να είναι μη συνεκτικός ή

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

συμβολίζεται με λ(G).

Επίσης ισχύει το θεώρημα:

Αν d(G) είναι ο ελάχιστος βαθμός των κορυφών του G τότε ισχύει: κ(G)≤λ(G) ≤

d(G).

Στο παρακάτω σχήμα απεικονίζεται ένας γράφος στον οποίο κ(G)=2 και λ(G)=3

και d(G)=3.

ΔΑ

ΓΒ

WX

ZY

Επίσης, ισχύει:

1. Ένας γράφος G καλείται κ συνεκτικός ως προς τις κορυφές όταν κ(G) ≥κ.

2. Ένας γράφος G καλείται κ συνεκτικός ως προς τις κορυφές όταν κ(G) ≥κ.

Ερωτήσεις- Ασκήσεις Κεφαλαίου

1. Δώστε ορισμούς για:

Ρίζα και φύλλα ενός δένδρου.

Πρόγονοι ενός κόμβου.

Υπόδενδρο ενός κόμβου.

Απόγονοι ενός κόμβου.

Πατέρας ενός κόμβου.

Παιδιά ενός κόμβου.

Βαθμός ενός κόμβου.

Βάθος ενός κόμβου.

Ύψος ενός δένδρου.

Page 66: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

66

Επίπεδο ενός κόμβου.

2. Ποια δένδρα ονομάζονται φυλλοπροσανατολιζόμενα και ποια

κομβοπροσανατολισμένα;

3. Πότε ένα δένδρο καλείται κ-δικό.

4. Πότε ένα δένδρο είναι ισοζυγισμένο.

5. Τι είναι το δυαδικό δένδρο αναζήτησης; Περιγράψτε τις βασικές πράξεις

εισαγωγής, διαγραφής και αναζήτησης σ’ αυτό.

6. Περιγράψτε αναλυτικά τις τρεις μεθόδους διαπέρασης δένδρου. Δώστε

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

πολωνικού συμβολισμού;

7. Τι είναι ένας γράφος; Πως ορίζεται;

8. Δώστε τους ορισμούς για :

Τετριμμένος γράφος.

Άκρα ακμής.

Γειτονικές κορυφές.

Όμορες ακμές.

Βαθμός μιας κορυφής.

Υπογράφος.

Ισομορφικοί γράφοι.

Πλήρης γράφος.

Διμερής γράφος.

Πλήρης διμερής γράφος.

Συμπληρωματικοί γράφοι.

9. Να σχεδιαστεί ένας (ή περισσότεροι αν υπάρχουν) γράφος ο οποίος να έχει

5 κορυφές και βαθμούς σε κάθε κορυφή 2, 2, 2, 3 και 3.

10. Να βρεθεί ο αριθμός των ακμών για τους γράφους Kn και Kn, m.

11. Να σχεδιαστούν όλοι οι γράφοι με πέντε κορυφές και τρεις ή επτά ακμές.

Χρησιμοποιείστε την παρατήρηση ότι δύο γράφοι είναι ισόμορφοι αν και

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

12. Ορίστε τον γράφο Euler και τον γράφο Hamilton. Τι είναι μία απλή

διαδρομή σε ένα γράφο.

13. Πότε ονομάζεται κλειστός ένας γράφος και πότε ανοικτός; Ορίστε τον

κύκλο σε έναν γράφο.

14. Τι είναι ένας συνεκτικός γράφος; Τι είναι η συνεκτική συνιστώσα; Ορίστε

το δυσινεκτικό γράφο.

15. Ορίστε τον κατευθυνόμενο και μη γράφο. Ορίστε τον βαθμό μιας κορυφής

ενός κατευθυνόμενου γράφου.

Page 67: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

67

16. Να αποδείξετε ότι ένας συνεκτικός γράφος περιέχει μία διαδρομή Euler αν

και μόνο αν όλες του οι κορυφές έχουν άρτιο βαθμό εκτός από δύο (αρχή

και τέλος της διαδρομής) των οποίων ο βαθμός είναι περιττός.

17. Να αποδείξετε ότι ένας γράφος περιέχει μία κλειστή διαδρομή Euler αν και

μόνο αν όλες οι κορυφές του έχουν άρτιο βαθμό.

18. Ορίστε τη συνεκτικότητα ως προς τις κορυφές και τις ακμές ενός γράφου.

Ποια η σχέση τους με τον ελάχιστο βαθμό των κορυφών ενός γράφου;

Page 68: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

68

ΚΕΦΑΛΑΙΟ 4. ΑΝΑΖΗΤΗΣΗ ΚΑΙ ΤΑΞΙΝΟΜΗΣΗ

ΣΤΟΙΧΕΙΩΝ

Στα προηγούμενα κεφάλαια περιγράψαμε τον τρόπο με τον οποίο τα δεδομένα

οργανώνονται μεταξύ τους και ομαδοποιούνται σε δομές δεδομένων ώστε στη

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

απαιτούμενες πράξεις. Στην περιγραφή κάθε δομής δεδομένων αναλύσαμε τις πράξεις

ένθεσης και απώθησης χωρίς να δώσουμε ιδιαίτερη βαρύτητα στις πράξεις

αναζήτησης και ταξινόμησης που αποτελούν και το αντικείμενο αυτού του

κεφαλαίου. Στο κεφάλαιο αυτό αρχικά θα αναλύσουμε τις πιο βασικές μεθόδους

αναζήτησης που εφαρμόζονται τόσο στην κύρια μνήμη όσο και στην βοηθητική. Στη

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

χρησιμοποιούνται και χωρίζονται στις βασιζόμενες στις συγκρίσεις (comparison

based) και σε εκείνες που βασίζονται στην πληροφορία εισόδου.

4.1 Αναζήτηση

Στην παράγραφο αυτή θα αναλύσουμε τις βασικές μεθόδους αναζήτησης

στοιχείων τα οποία είναι αποθηκεμένα σε βασικές δομές δεδομένων όπως

περιγράψαμε στα προηγούμενα κεφάλαια.

Το πρόβλημα αναζήτησης είναι η εύρεση ενός στοιχείου από ένα σύνολο

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

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

βασικές κατηγορίες.

Στην πρώτη κατηγορία μεθόδων αναζήτησης στην κύρια μνήμη έχουμε την

αναζήτηση είτε ενός στοιχείου σε πίνακα ή σε ουρά ή σε στοίβα είτε ενός κόμβου σε

λίστα ή δένδρο. Οι μέθοδοι στην κατηγορία αυτή είναι εύκολοι τόσο στην ανάπτυξη

όσο και στην υλοποίηση τους.

Στην δεύτερη κατηγορία μεθόδων αναζήτησης στην βοηθητική μνήμη

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

αποθηκεμένα ως ένα σύνολο εγγραφών που η κάθε μία έχει ένα σύνολο πεδίων. Το

σύνολο των εγγραφών αποτελούν τα αρχεία δεδομένων. Σε κάθε εγγραφή κάποιο από

τα πεδία αποτελεί το λεγόμενο πρωτεύον κλειδί (primary key) που ορίζει

μονοσήμαντα την εγγραφή. Με τον τρόπο αυτό η αναζήτηση ενός στοιχείου δηλαδή

μιας εγγραφής γίνεται με βάση το πρωτεύον κλειδί. Όταν βρεθεί επιστρέφεται το

σύνολο των πεδίων της εγγραφής.

Στη συνέχεια θα περιγράψουμε την βασική ιδέα κάθε μιας από τις μεθόδους

αναζήτησης και για την εύκολη κατανόηση της θα χρησιμοποιηθούν ως παράδειγμα

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

4.1.1 Γραμμική αναζήτηση (sequential search)

Στο παράδειγμα μας έχουμε ως είσοδο έναν πίνακα ο οποίος περιέχει n στοιχεία

ταξινομημένα ή μη. Η έξοδος του αλγορίθμου η αναζήτηση μιας τιμής x μέσα στον

πίνακα. Αν η τιμή αυτή βρεθεί, επιστρέφεται η θέση της τιμής στον πίνακα αλλιώς

επιστρέφεται η τιμή 0.

Βασική ιδέα αλγορίθμου γραμμικής αναζήτησης

Page 69: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

69

Για την επίλυση του προβλήματος θα ακολουθήσουμε στο παράδειγμα μας την

πιο απλή μέθοδο η οποία είναι η γραμμική. Πιο συγκεκριμένα, θα διατρέξουμε όλα τα

στοιχεία του πίνακα συγκρίνοντας τα με την τιμή που αναζητούμε. Έτσι έχουμε τον

παρακάτω ψευδοκώδικα:

Αλγόριθμος Παρ_1

Είσοδος (Πίνακας, n, x)

Βρέθηκε ψευδής

Θέση 0

Μετρητής 1

Διαπέρασε τον Πίνακα για Όσο (Βρέθηκε = ψευδής) και (Μετρητής <= n)

Αν Πίνακας[Μετρητής] = x τότε

Βρέθηκε αληθής

Θέση = Μετρητής

Αλλιώς Μετρητής Μετρητής + 1

Τέλος Αν

Τέλος Επανάληψης

Αποτελέσματα (Βρέθηκε, Θέση)

Τέλος Παρ_1

Πρέπει να τονιστεί ο απλός και άμεσος τρόπος αναζήτησης της γραμμικής

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

τις υπόλοιπες που θα εξετάσουμε παρακάτω.

Πιο συγκεκριμένα, εφόσον έχουμε n στοιχεία, ο χρόνος της χειρότερης

περίπτωσης υπολογίζεται όταν δεν υπάρχει το στοιχείο που αναζητούμε στην δομή

μας (ή είναι το τελευταίο που εξετάζεται). Στην περίπτωση αυτή η γραμμική μέθοδος

θα απαιτήσει n συγκρίσεις αν τα στοιχεία είναι αταξινόμητα ή n/2 αν είναι

ταξινομημένα. Στην γενική περίπτωση, ο μέσος αριθμός συγκρίσεων είναι n/2.

4.1.2 Αναζήτηση κατά ομάδες (Block search)

Η μέθοδος αυτή είναι μία παραλλαγή της γραμμικής αναζήτησης. Εφαρμόζεται σε

στοιχεία τα οποία είναι ταξινομημένα, έστω στην περίπτωση μας με αύξουσα σειρά.

Αυτά χωρίζονται σε ομάδες στοιχείων. Κάθε μία ομάδα έχει ένα βασικό στοιχείο

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

στοιχείο που ψάχνουμε με κάθε ένα από τα πρώτα στοιχεία κάθε ομάδας.

Έτσι αρχικά συγκρίνεται με το πρώτο στοιχείο της πρώτης ομάδας. Αν είναι

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

συγκρίνεται με το πρώτο στοιχείο της δεύτερης ομάδας. Αν είναι μικρότερο αυτού

τότε αν υπάρχει τότε βρίσκεται ανάμεσα στα στοιχεία της πρώτης ομάδας. Στην

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

Έστω έχουμε n στοιχεία τα οποία είναι χωρισμένα σε m ομάδες. Στην γενική

περίπτωση, ο μέσος αριθμός συγκρίσεων είναι n/(2m) + m/2. Είναι σαφές επομένως

ότι η απόδοση του αλγορίθμου εξαρτάται από το πλήθος των ομάδων άρα και του

Page 70: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

70

αριθμού των στοιχείων που περιέχει κάθε μία από αυτές. Αποδεικνύεται ότι ο

αλγόριθμος είναι βέλτιστος όταν κάθε μία ομάδα περιέχει n στοιχεία.

4.1.3 Δυαδική αναζήτηση (Binary search)

Χρησιμοποιώντας την τεχνική “Διαίρει και Βασίλευε” μπορούμε να εφαρμόσουμε

μία άλλη μέθοδο αναζήτησης, την δυαδική.

Η τεχνική Διαίρει και Βασίλευε βασίζεται στην λογική της κατάτμησης του

προβλήματος σε μικρότερα ομοειδή προβλήματα έτσι ώστε ο συνδυασμός των

μερικών λύσεων να δώσει την συνολική λύση του προβλήματος. Πιο συγκεκριμένα η

τεχνική αυτή βασίζεται στα 3 παρακάτω βήματα:

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

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

Βασίλευε (conquer) : κάθε στιγμιότυπο του προβλήματος επιλύεται

ανεξάρτητα με αναδρομικό τρόπο.

Συνδύασε (combine) : όλες οι λύσεις από κάθε στιγμιότυπο συνδυάζονται

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

συνολικού προβλήματος.

Η δυαδική αναζήτηση εφαρμόζεται σε ένα πίνακα με ταξινομημένα στοιχεία.

Αρχικά συγκρίνεται το στοιχείο αναζήτησης με το μεσαίο στοιχείο του πίνακα. Αν

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

του στοιχείου αναζήτησης τότε ο αλγόριθμος συνεχίζεται στο δεύτερο μισό του

πίνακα ενώ αν είναι μεγαλύτερο τότε ο αλγόριθμος συνεχίζεται στο πρώτο μισό του

πίνακα. Με τον τρόπο αυτό εφαρμόζεται η τεχνική Διαίρε και Βασίλευε αναδρομικά

χωρίζοντας τον πίνακα στη μέση σε δύο στιγμιότυπα και εφαρμόζοντας τον

αλγόριθμο σε κάθε ένα από αυτά.

Εφόσον έχουμε n στοιχεία, ο χρόνος της χειρότερης περίπτωσης υπολογίζεται

όταν δεν υπάρχει το στοιχείο που αναζητούμε στην δομή μας (ή είναι το τελευταίο

που εξετάζεται). Στην περίπτωση αυτή η δυαδική μέθοδος θα απαιτήσει logn+1

συγκρίσεις, άρα O(logn).

4.1.4 Αναζήτηση παρεμβολής (interpolation search)

Η μέθοδος αναζήτησης παρεμβολής βασίζεται στην δυαδική αναζήτηση και

εφαρμόζεται επομένως πάντα σε ταξινομημένα στοιχεία. Λαμβάνει παράλληλα

υπόψη της την κατανομή των στοιχείων. Πιο συγκεκριμένα, ακολουθεί τον τρόπο που

ένας άνθρωπος ψάχνει σε ένα λεξικό. Ο άνθρωπος δεν πάει κατευθείαν στο μέσο

έστω n του λεξικού συγκρίνει, μετά στο n/2 ή 3n/4 αντίστοιχα κ.ο.κ. όπως συμβαίνει

στην δυαδική αναζήτηση. Ανοίγει το λεξικό αρχικά ανάλογα με το γράμμα που τον

ενδιαφέρει. Αν είναι το ψ πηγαίνει προς το τέλος ή με το B πηγαίνει στην αρχή. Στη

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

παραλείποντας σελίδες.

Επομένως ο αλγόριθμος λαμβάνει υπόψη το περιεχόμενο του πίνακα σε σύγκριση

με το στοιχείο αναζήτησης, προκειμένου να καθορίσει το σημείο αναζήτησης.

Πιο συγκεκριμένα, έστω στο παράδειγμα μας έχουμε ως είσοδο έναν πίνακα S ο

οποίος περιέχει n στοιχεία ταξινομημένα. Η έξοδος του αλγορίθμου η αναζήτηση

Page 71: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

71

μιας τιμής x μέσα στον πίνακα. Αν η τιμή αυτή βρεθεί, επιστρέφεται η θέση της τιμής

στον πίνακα αλλιώς επιστρέφεται η τιμή 0.

Σε κάθε περίπτωση το σημείο αναζήτησης βρίσκεται από την σχέση :

(x-S[left]) / (S[right-S[left]).

Έτσι, αρχικά το x αναζητείται στα στοιχεία ανάμεσα στα S[1] και S[n]. Άρα το

σημείο αναζήτησης – σύγκρισης είναι το : (x-S[1]) / (S[n-S[1]).

Εφόσον έχουμε n στοιχεία, ο χρόνος της χειρότερης περίπτωσης στην αναζήτηση

παρεμβολής υπολογίζεται όταν δεν υπάρχει το στοιχείο που αναζητούμε στην δομή

μας (ή είναι το τελευταίο που εξετάζεται). Στην περίπτωση αυτή θα απαιτήσει O(n)

συγκρίσεις. Στην γενική περίπτωση, ο μέσος χρόνος είναι : O(loglogn).

Η αναζήτηση παρεμβολής σε σύγκριση με την δυαδική μέθοδο φαίνεται να

υπερισχύει. Με βάση πειραματικά αποτελέσματα, αποδεικνύεται όμως ότι είναι

προτιμότερο τα πρώτα βήματα να εκτελούνται με αναζήτηση παρεμβολής, έτσι ώστε

το διάστημα να μειώνεται δραματικά, και στη συνέχεια να εκτελείται δυική

αναζήτηση.

4.2 Ταξινόμηση

Όπως παρατηρούμε από το προηγούμενο παράδειγμα στην περίπτωση που ο

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

αναγκαστήκαμε να διαπεράσουμε όλα τα στοιχεία του πίνακα εκτελώντας n

συγκρίσεις, όπου n το σύνολο των στοιχείων του πίνακα. Στην περίπτωση της

δυαδικής αναζήτησης και που ο πίνακας είναι ταξινομημένος μετά από κάθε

σύγκριση αποκλείονται μισά στοιχεία του πίνακα. Έτσι σε μία ομάδα 10 στοιχείων η

δυαδική αναζήτηση θα εκτελέσει το πολύ 4 συγκρίσεις ενώ η γραμμική αναζήτηση

εκτελεί 10 συγκρίσεις. Ας αναλογιστούμε την αναζήτηση σε πραγματικά συστήματα

και σε αρχεία μεγάλων βάσεων δεδομένων οργανισμών. Δεν είναι τυχαίο ότι

σύμφωνα με εκτιμήσεις της IBM το 25% του χρόνου υπολογισμού αφιερώνεται στις

διατάξεις στοιχείων.

Η λειτουργία της ταξινόμησης στοιχείων σε δομές δεδομένων διακρίνεται σε δύο

περιπτώσεις:

1. Εσωτερική ταξινόμηση (Internal Sorting). Στην περίπτωση αυτή τα στοιχεία

της δομής δεδομένων τα οποία καλείται ο αλγόριθμος ταξινόμησης να

διατάξει είναι αποθηκευμένα στην κεντρική μνήμη.

2. Εξωτερική ταξινόμηση (External Sorting). Στην περίπτωση αυτή τα στοιχεία

της δομής δεδομένων τα οποία καλείται ο αλγόριθμος ταξινόμησης να

διατάξει είναι αποθηκευμένα στην δευτερεύουσα μνήμη.

Ο λόγος που οδηγεί την αποθήκευση των δομών δεδομένων στην δευτερεύουσα

μνήμη είναι το μικρό μέγεθος της κεντρικής μνήμης σε σχέση με το σύνολο των

στοιχείων που απαιτείται να διαταχθούν.

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

Είσοδο: Έναν πίνακα S[1:n]

Έξοδο : Έναν πίνακα S[1:n] με S[i] ≤ S[i+1] όπου 1≤ i ≤ n-1.

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

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

Page 72: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

72

χρησιμοποιώντας μόνο συγκρίσεις μεταξύ των στοιχείων του S, και που ονομάζονται

βασιζόμενοι σε συγκρίσεις (comparison based). Στην κατηγορία αυτή ανήκουν οι

αλγόριθμοι Ταξινόμησης Φυσαλίδας (Bubble Sort), Ταξινόμηση με Εισαγωγή

(Insertion Sort), Ταξινόμηση με Επιλογή (Selection Sort), Ταξινόμηση Σωρού (Heap

Sort), Ταξινόμηση με Συγχώνευση (Merge Sort) και Γρήγορη Ταξινόμηση (Quick

Sort).

Αμέσως μετά θα περιγράφουνε συνοπτικά οι αλγόριθμοι της δεύτερης κατηγορίας

οι οποίοι χρησιμοποιούν κάποια πληροφορία για την είσοδο, ώστε να επιτύχουν

καλύτερους χρόνους. Τέτοιοι αλγόριθμοι είναι η Ταξινόμηση με Μέτρηση (Counting

Sort), και Radix Sort.

Σε κάθε έναν αλγόριθμο που εξετάζουμε θα τονίζεται η αποδοτικότητα του η

οποία κρίνεται από τον αριθμό των συγκρίσεων και το πλήθος μετακινήσεων

στοιχείων που απαιτούνται.

4.2.1 Ταξινόμηση Φυσαλίδας (Bubble Sort)

Η κεντρική ιδέα του αλγορίθμου είναι η εξής: Εξετάζονται όλα τα στοιχεία του

πίνακα ξεκινώντας από το πρώτο. Εξετάζονται όλα τα διαδοχικά ζεύγη S[i] και

S[i+1]. Εφόσον S[i] > S[i+1] γίνεται εναλλαγή τους. Η διαδικασία αυτή γίνεται για

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

ταξινομηθούν τα στοιχεία. Κάθε i διαπέραση ξεκινά από το i στοιχείο του πίνακα

αφού τα προηγούμενα i στοιχεία του είναι ήδη ταξινομημένα.

Πιο συγκεκριμένα:

Πρώτη διαπέραση

Πάρε το τελευταίο στοιχείο του πίνακα και σύγκρινε το με το προηγούμενο. Αν

το προηγούμενο είναι μικρότερο κράτησε το αν όχι αντιμετάθεσε τα 2 στοιχεία και

συνέχισε την ίδια διαδικασία μέχρι το πρώτο στοιχείο του πίνακα. Στο τέλος είναι

φανερό ότι το μικρότερο στοιχείο του πίνακα είναι αποθευμένο στην πρώτη θέση

(S[1]).

Δεύτερη διαπέραση

Η δεύτερη διαπέραση είναι μία επανάληψη της πρώτης όχι όμως στο σύνολο του

πίνακα αλλά μόνο στα n-1 στοιχεία του (εκτός του S[1]) αφού το στοιχείο αυτό είναι

διατεταγμένο.

Τρίτη Διαπέραση

Η τρίτη διαπέραση είναι μία επανάληψη της δεύτερης όχι όμως στο σύνολο του

πίνακα αλλά μόνο στα n-2 στοιχεία του (εκτός του S[1] και S[2]) αφού τα πρώτα 2

στοιχεία του πίνακα είναι διατεταγμένα.

Γενικά στην i Διαπέραση είναι διατεταγμένα τα i πρώτα στοιχεία του πίνακα (S[1]

έως S[i]) επομένως οι συγκρίσεις εκτελούνται στα υπόλοιπα n-I στοιχεία του πίνακα.

Έστω ο πίνακας των παρακάτω στοιχείων:

Είσοδος : 5, 4, 2, 8, 9, 1, 6, 7

1, 5, 4, 2, 8, 9, 6, 7

1, 2, 5, 4, 6, 8, 9, 7

1, 2, 4, 5, 6, 7, 8, 9

Page 73: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

73

Παράλληλα έχουν αναπτυχθεί και αρκετές παραλλαγές του bubble sort όπως η

cocktail-shaker sort η οποία ξεκινά τις συγκρίσεις πότε από το πρώτο στοιχείο πότε

από το τελευταίο (με διαφορετική- εναλλάξ φορά).

Παρακάτω δίνεται ο αλγόριθμος του bubble sort σε μορφή ψευδοκώδικα.

Αλγόριθμος Bubble sort

Είσοδος (S, n)

Για i από 2 μέχρι n

Για j από n μέχρι I με βήμα -1

Αν S[j-1] > S[j] τότε

Αντιμετάθεσε S[j-1] , S[j]

Τέλος Αν

Τέλος Επανάληψης

Αποτελέσματα (S[1:n])

Τέλος Bubble sort

Ο αλγόριθμος που παρουσιάσαμε εκτελείται στην κύρια μνήμη. Είναι σαφές από

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

από την παρακάτω σχέση:

T(n) = (n-1) + (n-2) +…+ 1=(n-1) (n-2) / 2 = O(n2).

4.2.2 Ταξινόμηση με Εισαγωγή (Insertion Sort)

Η κεντρική ιδέα του αλγορίθμου είναι η εξής: Σε κάθε ένα πέρασμα ταξινομείται

και το στοιχείο που εξετάζεται. Θα γίνουν επομένως n περάσματα όσα και τα

στοιχεία του πίνακα. Έστω τα πρώτα i στοιχεία του πίνακα έχουν ταξινομηθεί και

εξετάζουμε το S[i+1]. Έχουμε τότε τα στοιχεία S[1,..,i+1] από τα οποία τα S[1,…,i]

είναι ταξινομημένα. Θα συγκρίνουμε το στοιχείο S[i+1] με όλα τα προηγούμενα και

θα το τοποθετήσουμε στην σωστή θέση μετακινώντας όλα τα υπόλοιπα δεξιά κατά

μία θέση επιπλέον (δεξιά). Έτσι τα στοιχεία S[1,..,i+1] είναι ταξινομημένα και

εξετάζουμε το επόμενο στοιχείο S[i+2]. Η διαδικασία επαναλαμβάνεται για όλα τα

στοιχεία του πίνακα.

Παράδειγμα

Έστω έχουμε τον πίνακα S[3,5,4,6].

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

το 4. Στη συνέχεια θα ταξινομήσει τον υποπίνακα S=[3,5,4]. Θα βρει την θέση του 4.

Θα εξετάσει το Σ[2]=5 με το Σ[3]=4 και θα μετακινήσει το S[2]=5 στην θέση S[3].

Στη συνέχεια θα γίνει σύγκριση του 4 με το S[1]=3. Άρα Σ[2]=4 και ο πίνακας

γίνεται: S=[3,4,5]. Εξετάζουμε και το S[4]=6 με το τελευταίο στοιχείο του

ταξινομημένου πίνακα S[3]=5. Αφού S[4]>S[3] άρα δεν χρειάζεται περαιτέρω

ταξινόμηση.

Ο αλγόριθμος που παρουσιάσαμε εκτελείται στην κύρια μνήμη. Είναι σαφές από

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

από την παρακάτω σχέση:

Page 74: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

74

T(n) =

n

j

i2

=(

n

j

i1

) – 1= n(n+1)/2 = O(n2).

4.2.3 Ταξινόμηση με Επιλογή (Selection Sort)

Η κεντρική ιδέα του αλγορίθμου είναι η εξής: Σε κάθε ένα πέρασμα i εξετάζονται

όλα τα στοιχεία του πίνακα και επιλέγεται το i-στο μικρότερο στοιχείο. Στο πρώτο

πέρασμα επιλέγεται το μικρότερο στοιχείο από τα n στοιχεία του πίνακα, στο δεύτερο

πέρασμα επιλέγεται το αμέσως μικρότερο στοιχείο κ.ο.κ.. Θα γίνουν επομένως n

περάσματα όσα και τα στοιχεία του πίνακα. Έστω τα πρώτα i στοιχεία του πίνακα

έχουν ταξινομηθεί και εξετάζουμε τα υπόλοιπα S[i+1,…n]. Θα συγκρίνουμε το

στοιχείο S[i+1] με όλα τα επόμενα στοιχεία, αν υπάρχει κάποιο μικρότερο κρατούμε

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

και να βρούμε το μικρότερο από τα S[i+1,…n]. Έτσι τα στοιχεία S[1,..,i+1] είναι

ταξινομημένα ενώ στη συνέχεια ψάχνουμε, με το επόμενο πέρασμα, να βρούμε το i+2

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

Παράδειγμα

Έστω έχουμε τον πίνακα S[6,5,4,7].

Ο αλγόριθμος εξετάζει για τη θέση 1 όλα τα στοιχεία. Στο πρώτο πέρασμα

συγκρίνουμε το S[1]=6 me to S[2]=5. To S[2]>S[1], κρατούμε το S[2]=5 και

συνεχίζουμε συγκρίνοντας το με το επόμενο στοιχείο του πίνακα που είναι το S[3]=4.

To S[3]>S[2], κρατούμε το S[3]=4 και συνεχίζουμε συγκρίνοντας το με το επόμενο

στοιχείο του πίνακα που είναι το S[4]=7. To S[4]>S[3] άρα το S[3] είναι το

μικρότερο στοιχείο του πίνακα και κάνουμε την αντικατάσταση του S[1] με το S[3].

Συνεχίζουμε την ίδια διαδικασία με τα υπόλοιπα n-1 στοιχεία S[5,6,7] κ.ο.κ.

Ο αλγόριθμος που παρουσιάσαμε εκτελείται στην κύρια μνήμη. Είναι σαφές από

την παραπάνω ανάλυση ο αλγόριθμος με επιλογή κάνει πάντα ½ (n2 – n) συγκρίσεις.

Αφού εκτελεί n περάσματα και κάνει στο ι πέρασμα n-i συγκρίσεις.

4.2.4 Ταξινόμηση Σωρού (Heap Sort)

Ένα αλγόριθμος με πολύ καλή απόδοση είναι η Ταξινόμηση Σωρού. Η κεντρική

ιδέα του αλγορίθμου συνοψίζεται στην εκτέλεση 3 βημάτων:

Βήμα 1 : Γίνεται επιλογή του μεγαλύτερου στοιχείου m από τα στοιχεία του

πίνακα S. Αφαιρείται το στοιχείο από τον πίνακα S και τοποθετείται

ως το μικρότερο στοιχείο σε ένα πίνακα έστω Χ.

Βήμα 2: Οργανώνεται το σύνολο S’=S-{m} ώστε η εύρεση του μεγαλύτερου

στοιχείου του S’ να είναι βέλτιστη (μία προσπέλαση στον πίνακα).

Βήμα 3: Τίθεται το S’=S και επαναλαμβάνετε το βήμα 1.

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

τρόπος με τον οποίο οργανώνονται τα στοιχεία ώστε με μία προσπέλαση να

επιλέγεται και να αφαιρείται μεγαλύτερο στοιχείο. Για το λόγω αυτό τα στοιχεία

οργανώνονται σε μία δομή που καλείται ισοζυγισμένος δυαδικός σωρός (Balanced

Binary Heap). Η δομή αυτή είναι ένα δυαδικό δένδρο με τις παρακάτω ιδιότητες:

1. Κάθε κόμβος u περιέχει μία τιμή από το σύνολο S (κομβοπροσανατολιζόμενο

δένδρο).

Page 75: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

75

2. Ισχύει η συνθήκη : τιμή(πατέρα(u)) ≥ τιμή(u)

3. Κάθε κόμβος έχει 0 ή 2 παιδιά με πιθανή εξαίρεση ενός κόμβου, ενώ

παράλληλα ισχύει:

Όλα τα φύλλα έχουν βάθος k ή k+1

Όλα τα φύλλα με βάθος k+1 είναι στοιχισμένα στα αριστερά.

Από την δεύτερη ιδιότητα συνεπάγεται ότι η μεγαλύτερη τιμή που είναι

αποθηκευμένη στους κόμβους βρίσκεται στη ρίζα.

Ο δυαδικός ισοζυγισμένος σωρός μπορεί να αναπαρασταθεί με έναν πίνακα.

Η ταξινόμηση σωρού εκτελείται σε 2 φάσεις:

Φάση Δόμησης : Ο πίνακας S[1,…,n] με τα μη διατεταγμένα στοιχεία

μετατρέπεται σε σωρό.

Φάση Διαλογής : Διαλογή και απομάκρυνση του μεγαλύτερου στοιχείου, το

οποίο προσπελαύνετε κατευθείαν αφού είναι η ρίζα της σωρού

ή το στοιχείο S[1]. Στη συνέχεια επαναλαμβάνεται η φάση

δόμησης και κ.ο.κ.

Αποδεικνύεται (δεν απαιτείται η απόδειξη στο παρόν μάθημα) ότι η φάση

δόμησης απαιτεί συνολικό χρόνο O(n) ενώ η φάση διαλογής O(nlogn). Επομένως ο

συνολικός χρόνος εκτέλεσης του αλγορίθμου είναι O(nlogn) συγκρίσεις στη

χειρότερη περίπτωση για την ταξινόμηση πλήθους n στοιχείων.

4.2.5 Ταξινόμηση με Συγχώνευση (Merge Sort)

Ένα αλγόριθμος με πολύ καλή απόδοση είναι η Ταξινόμηση με συμβολή. Η

κεντρική ιδέα του αλγορίθμου συνοψίζεται στην εκτέλεση 3 βημάτων:

Βήμα 1 : Χώρισε το σύνολο στοιχείων εισόδου σε δύο τμήματα ίσου μεγέθους.

Βήμα 2: Ταξινόμησε τα στοιχεία των δύο τμημάτων ανεξάρτητα μεταξύ τους.

Βήμα 3: Παρήγαγε το τελικό σύνολο ταξινομημένων στοιχείων από τα δύο

διακριτά τμήματα των οποίων τα στοιχεία έχουν ταξινομηθεί στο βήμα

2.

Ο αλγόριθμος ταξινόμησης με συμβολή είναι ένας αναδρομικός αλγόριθμος. Οι

αναδρομικές κλήσεις σταματούν όταν ο διαχωρισμός του βήματος 1 δώσει

υποπίνακες μεγέθους 1 οπότε θεωρούνται ταξινομημένοι και αρχίζει αναδρομικά η

διαδικασία της συγχώνευσης.

Παρατηρούμε ότι σε κάθε βήμα, διαιρείται το μέγεθος του προβλήματος κατά

δύο, γεγονός που σημαίνει ότι θα εκτελέσουμε το πολύ k = [logn] + 1 βήματα

συνολικά. Σε κάθε βήμα εκτελούνται O(n) συγκρίσεις οπότε αποδεικνύεται ότι:

Ο αλγόριθμος Ταξινόμησης με Συγχώνευση, ταξινομεί μία ακολουθία μήκους n

με το πολύ n(logn) – 2logn

+ 1 συγκρίσεις.

Δεν απαιτείται η απόδειξη στο παρόν μάθημα.

4.2.6 Γρήγορη Ταξινόμηση (Quick Sort)

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

προκύπτει με την εφαρμογή της τεχνικής Διαίρε και Βασίλευε. Αυτός είναι ο

Page 76: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

76

αλγόριθμος Γρήγορης Ταξινόμησης (Quick Sort). Όπως αναφέρθηκε παραπάνω η

τεχνική Διαίρει και Βασίλευε βασίζεται στην λογική της κατάτμησης του

προβλήματος σε μικρότερα ομοειδή προβλήματα έτσι ώστε ο συνδυασμός των

μερικών λύσεων να δώσει την συνολική λύση του προβλήματος.

Πιο συγκεκριμένα, αρχικά λαμβάνεται το μεσαίο στοιχείο του πίνακα S, έστω X.

Αυτό το στοιχείο διαχωρίζει τον πίνακα σε δύο υποπίνακες έστω τον αριστερό και

δεξιό. Στη συνέχεια σαρώνονται οι δύο υποπίνακες, ψάχνοντας τον αριστερό για ένα

στοιχείο που να είναι μεγαλύτερο του X ενώ τον δεξιό για ένα στοιχείο που να είναι

μικρότερο του X. Αντιμεταθέτουμε τα στοιχεία αυτά στους δύο υποπίνακες.

Ακολουθούμε τη διαδικασία αυτή μέχρι το τέλος όλα τα στοιχεία του αριστερού

υποπίνακα να έχουν τιμή μικρότερη του X και όλα τα στοιχεία του δεξιού υποπίνακα

να έχουν τιμή μεγαλύτερη του X.

Στη συνέχεια ο κάθε υποπίνακας χωρίζεται ομοίως με το μεσαίο τους στοιχείο σε

άλλους δύο υποπίνακες, αριστερό και δεξιό και ακολουθείται η ίδια διαδικασία. Τα

βήματα αυτά συνεχίζονται μέχρι το τέλος να φτάσουμε σε υποπίνακες με μόνο ένα

στοιχείο. Ουσιαστικά γίνεται συνεχώς η διαμέριση και στη συνέχεια αναδρομικά

εκτελείται η αντιμεταθετικότητα.

Πρέπει παράλληλα να τονιστεί το γεγονός της ύπαρξης πολλών παραλλαγών

υλοποίησης του αλγόριθμου Γρήγορης Ταξινόμησης. Έτσι σε μία άλλη περίπτωση

μπορεί ο αλγόριθμος να εκτελεστεί ως εξής:

Επιλέγουμε έστω το πρώτο στοιχείο του πίνακα ως στοιχείο διαχωρισμού.

Ορίζουμε δύο δείκτες i και j όπου ο i διατρέχει τον πίνακα από τα αριστερά και

σταματά όταν S[i]>S[1]. Όμοια ο j διατρέχει τον πίνακα από τα δεξιά και σταματά

όταν S[j]<S[1]. Τότε εναλλάσσουμε τα στοιχεία μεταξύ τους. Συνεχίζουμε την

σάρωση μέχρι το j να γίνει μεγαλύτερο του i. Τότε αρκεί να γίνει εναλλαγή του S[j]

με το S[1] ώστε να δι8αχωριστεί ο πίνακας σε δύο υποπίνακες αριστερά και δεξιά

από το στοιχείο S[1]. Αριστερά θα περιέχονται μόνο μικρότεροι του αριθμοί ενώ

δεξιά μεγαλύτεροι του.

Είναι σαφές ότι η απόδοση του αλγορίθμου βασίζεται στην κατάλληλη επιλογή

του στοιχείου διαχωρισμού. Συνήθως επιλέγεται το μεσαίο στοιχείο του κάθε

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

Αποδεικνύεται ότι ο μέσος αριθμός συγκρίσεων είναι O(nlogn) ενώ στη χειρότερη

περίπτωση ο αριθμός των συγκρίσεων είναι O(n2).

4.2.7 Ταξινόμηση με Μέτρηση (Counting Sort)

Πρόκειται για έναν αλγόριθμο που χρησιμοποιεί κάποια πληροφορία για την

είσοδο, ώστε να επιτύχει καλύτερους χρόνους.

Στην συγκεκριμένη περίπτωση, ο αλγόριθμος ταξινόμησης με Μέτρηση μετρά

πόσοι αριθμοί είναι μικρότεροι από δοσμένο ακέραιο, έστω x, ώστε να προσδιορίσει

τη θέση του x στον ταξινομημένο πίνακα.

Υποθέτοντας ότι όλοι οι αριθμοί πλήθους n είναι ακέραιοι στο διάστημα [1,k]

τότε η χρονική πολυπλοκότητα του αλγορίθμου εξαρτάται από το k και το n.

Αποδεικνύεται ότι ο μέσος αριθμός συγκρίσεων είναι O(n+k). Ανάλογα με το k

επομένως διαμορφώνεται και η απόδοση του αλγορίθμου. Αν το k = O(n) τότε η μέση

απόδοση του αλγορίθμου είναι O(n) καλύτερη από κάθε άλλον αλγόριθμο που

Page 77: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

77

περιγράψαμε παραπάνω. Το ίδιο συμβαίνει ακόμα και στην περίπτωση που

k=O(nloglogn).

4.2.8 Radix Sort

Ο αλγόριθμος ταξινόμησης Radix Sort χρησιμοποιείται και αυτός σε περίπτωση

που γνωρίζουμε συγκεκριμένες πληροφορίες για την μορφή εισόδου μας.

Έτσι στην περίπτωση ταξινόμησης δεκαδικών αριθμών δημιουργούμε δέκα

κάδους (όσα και τα στοιχεία του δεκαδικού συστήματος) και διαβάζουμε τα ψηφία

των αριθμών της εισόδου από αριστερά προς τα δεξιά. Όσοι αρχίζουν π.χ. από 3

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

στοιχεία του πίνακα. Στη συνέχεια χωρίζουμε κάθε κάδο σε 10 υποκάδους και

ακολουθούμε την ίδια διαδικασία για το δεύτερο ψηφίο.

Ο αλγόριθμος αυτός είναι αναδρομικός ενώ είναι μη αποδοτικός τόσο ως προς

τον χρόνο όσο και προς τον χώρο αφού για να ταξινομήσει n αριθμούς με d ψηφία,

όπου για κάθε ένα ψηφίο υπάρχουν k επιλογές απαιτεί Ω(ndk) χρόνο και χώρο.

Διατρέχοντας βέβαια τους αριθμούς από δεξιά προς τα αριστερά βελτιώνουμε την

χρονική πολυπλοκότητα του αλγορίθμου.

4.2.9 Εξωτερική Ταξινόμηση (External Sorting)

Στην περίπτωση αυτή τα στοιχεία της δομής δεδομένων τα οποία καλείται ο

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

Ο λόγος που οδηγεί την αποθήκευση των δομών δεδομένων στην δευτερεύουσα

μνήμη είναι το μικρό μέγεθος της κεντρικής μνήμης σε σχέση με το σύνολο των

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

μνήμη έχει μέγεθος M όπου n>>M, ενώ χρησιμοποιούνται και 2 p μαγνητικές ταινίες

(δευτερεύουσα μνήμη) εναλλάξ, p για είσοδο και p για έξοδο.

Η κεντρική ιδέα του αλγορίθμου συνοψίζεται στην εκτέλεση 2 βημάτων:

Βήμα 1 : Παραγωγή ταξινομημένων υπακολουθιών. Συγκεκριμένα,

διαβάζονται τα στοιχεία από την ταινία εισόδου στην κύρια μνήμα σε

μπλοκ των M, ταξινομούνται στη μνήμη και στη συνέχεια οι

ταξινομημένες ομάδες γράφονται εναλλάξ στην κατάλληλη ταινία

εξόδου.

Βήμα 2: Συγχώνευση ταξινομημένων υπακολουθιών. Συγκεκριμένα,

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

Χρησιμοποιούνται οι p ταινίες εισόδου και οι p ταινίες εξόδου. Η

διαδικασία επαναλαμβάνεται και η διαδικασία τερματίζει με την

παραγωγή στην έξοδο ενός μόνο μπλοκ, το οποίο θα αποτελεί την

ταξινομημένη έξοδο.

Για την συγχώνευση των ταινιών μπορεί να χρησιμοποιηθεί μία παραλλαγή του

αλγορίθμου Merge Sort.

Ερωτήσεις- Ασκήσεις Κεφαλαίου

1. Σε ποιες δύο κατηγορίες ταξινομούνται οι μέθοδοι αναζήτησης; Ποια η

βασική τους διαφορά;

Page 78: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

78

2. Περιγράψτε τον αλγόριθμο γραμμικής αναζήτησης. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

3. Περιγράψτε τον αλγόριθμο αναζήτησης κατά ομάδες. Δώστε τους χρόνους

μέσης περίπτωσης.

4. Περιγράψτε τον αλγόριθμο δυαδικής αναζήτησης. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

5. Περιγράψτε τον αλγόριθμο αναζήτησης παρεμβολής. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης. Κάντε μία σύγκριση με την μέθοδο

δυαδικής αναζήτησης.

6. Σε ποιες κατηγορίες ταξινομούνται οι μέθοδοι ταξινόμησης; Ποια η βασική

τους διαφορά;

7. Περιγράψτε τον αλγόριθμο Ταξινόμησης Φυσαλίδας. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

8. Περιγράψτε τον αλγόριθμο Ταξινόμησης με Εισαγωγή. Δώστε τους

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

9. Περιγράψτε τον αλγόριθμο Ταξινόμησης με Επιλογή. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

10. Περιγράψτε τον αλγόριθμο Ταξινόμησης Σωρού. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

11. Περιγράψτε τον αλγόριθμο Ταξινόμησης με Συγχώνευση. Δώστε τους

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

12. Περιγράψτε τον αλγόριθμο Γρήγορης Ταξινόμησης. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

13. Περιγράψτε τον αλγόριθμο Ταξινόμησης με Μέτρηση. Δώστε τους χρόνους

μέσης και χειρότερης περίπτωσης.

14. Περιγράψτε τον αλγόριθμο Radix Sort.

15. Περιγράψτε τον αλγόριθμο External Sorting.

Page 79: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

79

ΠΑΡΑΡΤΗΜΑ Α. ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ

Στο παράρτημα αυτό δίνονται 10 εργαστηριακές ασκήσεις τις οποίες ο

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

προγράμματα μεταγλώττισης και εκτέλεσης της γλώσσας προγραμματισμού που θα

επιλέξει.

Οι εργαστηριακές ασκήσεις έχουν σκοπό, μέσα από την υλοποίηση των βασικών

δομών δεδομένων, ο ενδιαφερόμενος αφενός να κατανοήσει καλύτερα την λειτουργία

και χρησιμότητα των δομών αλλά και να εξασκηθεί στην γλώσσα προγραμματισμού

που θα επιλέξει σε ένα αντικείμενο το οποίο απαιτεί το μεγαλύτερο

προγραμματιστικό χρόνο σε όλες τις εφαρμογές.

Παράλληλα, οι εργαστηριακές ασκήσεις μπορούν να υλοποιηθούν στα πλαίσια

ενός ακαδημαϊκού εξαμήνου.

Ο χρόνος υλοποίησης κάθε εργαστηριακής άσκησης είναι 2 ώρες.

Page 80: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

80

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 1.Αλγορίθμοι – Πίνακες

1. Να γραφεί ένα πρόγραμμα σε γλώσσα C στο οποίο να υπολογίζεται ο ΜΚΔ

δύο ακεραίων αριθμών σύμφωνα με τον Αλγόριθμο του Ευκλείδη. Πιο

συγκεκριμένα:

α. Το πρόγραμμα να διαβάζει από το πληκτρολόγιο δύο τυχαίους ακεραίους

αριθμούς x, y, ≠ 0.

β. Να εκτελείται το πρόγραμμα και να τυπώνει σε κάθε επανάληψη το x, το y

και το υπόλοιπο της διαίρεσης των x και y, (z).

γ. Στο τέλος να τυπώνει «Ο ΜΚΔ των αριθμών x και y είναι ο z»

αντικαθιστώντας τα x, y και z με τους συγκεκριμένους αριθμούς.

Να εκτελεστεί ο αλγόριθμος για είσοδο 26 και 65. Το ζητούμενο αποτέλεσμα

να έχει την μορφή

2. Να γραφεί ένα πρόγραμμα που να εκτελεί τα παρακάτω:

α. Να δημιουργήσετε ένα πίνακα 10 στοιχείων τύπου int. Να τους εισάγετε

από το πληκτρολόγιο.

β. Να γραφεί ένα πρόγραμμα που να εντοπίζει το μεγαλύτερο και τον

μικρότερο αριθμό στον πίνακα.

γ. Να υπολογίζει το μέσο όρο με μορφή δεκαδικού.

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

Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

Page 81: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

81

3. Να γραφεί πρόγραμμα το οποίο:

α. Να δημιουργεί ένα πίνακα δύο διαστάσεων με 5 γραμμές και 5 στήλες

τύπου int. Να δώσετε τιμές σε κάθε στοιχείο του πίνακα δια μέσω του

πληκτρολογίου.

β. Να τυπώσετε τα στοιχεία του πίνακα ως εξής: Σε κάθε γραμμή θα

τυπώσετε τα στοιχεία της κάθε γραμμής.

γ. Μετατρέψτε τον πίνακα σε τριγωνικό και επαναλάβετε το βήμα β.

Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

Page 82: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

82

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 2. Στοίβες

1. Να υλοποιηθεί ένα πρόγραμμα στο οποίο να δημιουργείται μία στοίβα

ακεραίων ως ένας πίνακας 10 στοιχείων. Στη συνέχεια:

α. Να ζητά το πρόγραμμα από το χρήστη να επιλέξει αν θέλει να κάνει μία

εισαγωγή στοιχείου στη στοίβα (θα του ζητάει τον αριθμό) είτε να

απωθήσει-διαβάσει την κεφαλή της στοίβας (θα τυπώνει τον αριθμό) είτε

να επιλέξει να τερματίσει τη διαδικασία δηλώνοντας τον συνολικό αριθμό

πράξεων. Σε κάθε περίπτωση να τυπώνεται ένα μήνυμα αν εκτελέστηκε

επιτυχώς ή όχι η πράξη.

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

push και pop της στοίβας. Να έχουν την μορφή push(num) και pop().

Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

Page 83: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

83

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 3. Εφαρμοφές Στοίβας

Να υλοποιηθεί ένα πρόγραμμα το οποίο να ζητά από τον χρήστη έναν ακέραιο

αριθμό (μεγέθους μικρότερο του 128 και μεγαλύτερου του 0) και να υπολογίζει

τον αντίστοιχο δυαδικό του. Να γίνει με την μέθοδο των διαδοχικών διαιρέσεων

του ακεραίου με το 2 ωθώντας το υπόλοιπο σε μία στοίβα. Στο τέλος με

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

Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

2. Να υλοποιηθεί ένα πρόγραμμα στο οποίο να ζητά από το χρήστη να δώσει

τιμές στα a, b, c, d και να υπολογίζει την παράσταση : a*(b+c)/d. Στο τέλος να

ζητά από το χρήστη να επαναλάβει το πρόγραμμα.

Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

Page 84: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

84

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 4. Ουρές

1. Να υλοποιηθεί ένα πρόγραμμα στο οποίο να δημιουργείται μία ουρά

ακεραίων ως ένας πίνακας (pipeline) 10 στοιχείων. Στη συνέχεια:

α. Να ζητά το πρόγραμμα από το χρήστη να επιλέξει αν θέλει να κάνει μία

εισαγωγή στοιχείου στην ουρά (θα του ζητάει τον αριθμό) είτε να

απωθήσει-διαβάσει την κεφαλή της ουράς (θα τυπώνει τον αριθμό) είτε να

επιλέξει να τερματίσει τη διαδικασία δηλώνοντας τον συνολικό αριθμό

πράξεων. Σε κάθε περίπτωση να τυπώνεται ένα μήνυμα αν εκτελέστηκε

επιτυχώς ή όχι η πράξη.

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

Enqueue και Dequeue της ουράς Να έχουν την μορφή Enqueue (num) και

Dequeue (). Να εκτελεστεί το πρόγραμμα για συγκεκριμένο παράδειγμα

και να δίνει αποτελέσματα της μορφής:

γ. Να υλοποιήσετε στη συνέχεια την συνάρτηση μετακίνησης στοιχείων

έστω (fragm()). Να εισάγετε στη συνέχεια 10 στοιχεία από το 1 μέχρι το

10. Να απωθήσετε παράλληλα 2 στοιχεία (το 1 και 2). Να εισάγετε στη

Page 85: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

85

συνέχεια στην ουρά το στοιχείο 11. Το πρόγραμμα να δίνει τα παρακάτω

στοιχεία.

Λίστα των στοιχείων της ουράς.

Λίστα των μετακινήσεων που εκτελεί η fragm().

Πιο συγκεκριμένα να δίνει αποτελέσματα της μορφής:

2. Να υλοποιηθεί το παραπάνω πρόγραμμα στο οποίο να δημιουργείται μία ουρά

δακτυλίου ακεραίων ως ένας πίνακας 10 στοιχείων.

α. Να ζητά το πρόγραμμα από το χρήστη να επιλέξει αν θέλει να κάνει μία

εισαγωγή στοιχείου στην ουρά (θα του ζητάει τον αριθμό) είτε να

απωθήσει-διαβάσει την κεφαλή της ουράς (θα τυπώνει τον αριθμό) είτε να

επιλέξει να τυπώνει τα στοιχεία της ουράς είτε να τερματίσει τη

διαδικασία δηλώνοντας τον συνολικό αριθμό πράξεων. Σε κάθε

περίπτωση να τυπώνεται ένα μήνυμα αν εκτελέστηκε επιτυχώς ή όχι η

πράξη.

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

Enqueue και Dequeue της ουράς. Να έχουν την μορφή Enqueue (num) και

Dequeue ().Χρησιμοποιείστε μία μεταβλητή που να κρατεί το πλήθος των

στοιχείων της ουράς.

γ. Εισάγετε στην ουρά 10 στοιχεία (1 έως 10). Τυπώστε τα στοιχεία της

ουράς.

Page 86: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

86

Page 87: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

87

δ. Απωθήστε 3 από αυτά (το 1, 2 και 3). Τυπώστε τα στοιχεία της ουράς.

ε. Εισάγετε στην ουρά 2 στοιχεία (11 και 12). Τυπώστε τα στοιχεία της

ουράς. ε. Εισάγετε στην ουρά 2 στοιχεία (11 και 12). Τυπώστε τα

στοιχεία της ουράς. Τερματίστε το πρόγραμμα.

Να εκτελεστεί το πρόγραμμα για το συγκεκριμένο παράδειγμα και να δίνει

αποτελέσματα της μορφής:

Page 88: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

88

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 5. Λίστες

3. Να υλοποιηθεί ένα πρόγραμμα στο οποίο να δημιουργείται μία απλή

συνδεμένη δυναμική λίστα ακεραίων.

Το πρόγραμμα:

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

εισαγωγή, διαγραφή, σάρωση, αναζήτηση ή να τερματίσει το πρόγραμμα.

Σε κάθε περίπτωση να τυπώνεται ένα μήνυμα αν εκτελέστηκε επιτυχώς ή

όχι η πράξη.

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

εισαγωγής, διαγραφής, σάρωσης και αναζήτησης.

γ. Αρχικά επιλέξτε Εισαγωγή και εισάγετε στη λίστα 5 αριθμούς. Να

χρησιμοποιηθεί μία δομή ακεραίων για κάθε κόμβο και δείκτες

διευθύνσεων. Η δέσμευση της μνήμης να γίνεται ατομικά για κάθε θέση

εισαγωγής. Η εισαγωγή κάθε στοιχείου να γίνεται στο τέλος της λίστας.

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

Page 89: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

89

δ. Στη συνέχεια επιλέξτε να σαρώσετε τη λίστα τυπώνοντας όλα τα στοιχεία

της. Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

ε. Αμέσως μετά αναζητήστε 2 στοιχεία, ένα που υπάρχει στη λίστα και ένα

που δεν υπάρχει. Το πρόγραμμα να δίνει την αντίστοιχη απάντηση. Το

πρόγραμμα να δίνει αποτελέσματα της μορφής:

ζ. Τέλος ζητείστε από το πρόγραμμα να διαγράψει ένα στοιχείο. Να

ζητήσετε να διαγράψετε ένα στοιχείο που δεν υπάρχει και στη συνέχεια

ένα που υπάρχει. Στη συνέχεια επιλέξτε σάρωση της λίστας. Το

πρόγραμμα να δίνει αποτελέσματα της μορφής:

Page 90: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

90

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 6. Δημιουργία δυαδικού

κομβοπροσανατολισμένου δένδρου αναζήτησης

Να υλοποιηθεί ένα πρόγραμμα στο οποίο να δημιουργείται ένα δυαδικό

κομβοπροσανατολισμένο δένδρο αναζήτησης στο οποίο να αποθηκεύονται

ακέραιοι αριθμοί.

α. Το πρόγραμμα να ζητά αρχικά από το χρήστη να επιλέξει αν θέλει να

κάνει εισαγωγή, σάρωση, ή να τερματίσει.

β. Εφόσον επίλεξει ο χρήστης να εισάγει αριθμό, το πρόγραμμα να του ζητά

να δώσει έναν ακέραιο αριθμό από το πληκτρολόγιο. Στη συνέχεια, να

δημιουργείσετε μία συνάρτηση BuildTree η οποία να καλείτε και να

εισάγει τον ακέραιο αριθμό στο δένδρο λαμβάνοντας υπόψη τα εξής:

1. Το δένδρο είναι κομβοπροσανατολισμένο, άρα το περιεχόμενο του

(ακέραιοι αριθμοί) αποθηκεύονται σε όλους τους και φύλλα του

δένδρου.

2. Η δομή δεδομένων μας είναι δυαδικό δένδρο αναζήτησης που

σημαίνει ότι από κάθε κόμβο u ξεκινούν δύο υπόδενδρα u1 και u2. Στο

αριστερό υπόδενδρο είναι αποθηκευμένοι ακέραιοι αριθμοί μικρότεροι

από τον αριθμό που είναι αποθηκευμένος στον κόμβο u ενώ στο δεξιό

υπόδενδρο μεγαλύτεροι.

3. Η συνάρτηση BuildTree είναι αναδρομική. Επιστρέφει μία διεύθυνση

που είναι αποθηκευμένος ένας κόμβος του δένδρου ενώ «κουβαλά» ως

ορίσματα τον τρέχον κόμβο (διεύθυνση), τον επόμενο (αριστερό ή δεξί

ανάλογα) καθώς και τον ίδιο τον αριθμό εισαγωγής.

Να εκτελεστεί η εισαγωγή των 7 αριθμών: 12, 6, 10, 11, 3, 18 και 5.

Σχεδιάστε έντυπα τη μορφή του δυαδικού κομβοπροσανατολισμένου

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

αριθμών.

γ. Με την δεύτερη επιλογή, το πρόγραμμα να σαρώνει το δένδρο με τη

σωστή μέθοδο (Inorder) ώστε να τυπώσει όλους τους αποθηκευμένους

αριθμούς του δένδρου. Με την μέθοδο αυτή οι αριθμοί θα τυπωθούν

ταξινομημένοι.

δ. Με την τρίτη επιλογή τερματίστε την λειτουργία του προγράμματος.

Page 91: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

91

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

Page 92: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

92

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 7. Υλοποίηση βασικών πράξεων

σε δυαδικό κομβοπροσανατολισμένο δένδρο αναζήτησης

Να χρησιμοποιηθεί το πρόγραμμα-κώδικας της προηγούμενης άσκησης 6. Να

προστεθούν και να υλοποιηθούν οι παρακάτω επιλογές:.

α. Αντίστοιχα με την επιλογή σάρωσης του δένδρου με την ενδοδιάταξη να

υλοποιηθεί διαπέραση του δένδρου μέσω δύο επιλογών : με την

προοδιάταξη και την μεταδιάταξη.

Να εκτελεστεί η εισαγωγή των 7 αριθμών: 12, 6, 10, 11, 3, 18 και 5.

Να γίνει διαπέραση με την προδιάταξη και μετάδιάταξη και το πρόγραμμα

να δίνει αποτελέσματα της μορφής:

β. Στη συνέχεια προσθέστε και υλοποιήστε επιλογή αναζήτησης ενός

στοιχείου στο δένδρο.

Page 93: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

93

Ψάξτε το δένδρο για τους αριθμούς 12 και 2.

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

γ. Στη συνέχεια προσθέστε και υλοποιήστε επιλογή διαγραφής ενός

στοιχείου από δένδρο.

Εισάγεται τους αριθμούς του ερωτήματος α.

Διαγράψτε τους αριθμούς 5, 10 και 12.

Page 94: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

94

Εκτελέστε αντίστοιχες διαπεράσεις ώστε να φανεί η διαγραφή των

στοιχείων.

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

δ. Με την τέταρτη επιλογή τερματίστε την λειτουργία του προγράμματος.

Page 95: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

95

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 8. Δημιουργία ισοζυγισμένου

δυαδικού κομβοπροσανατολισμένου δένδρου αναζήτησης

Να υλοποιηθεί ένα πρόγραμμα στο οποίο να δημιουργείται ένα ισοζυγισμένο

δυαδικό κομβοπροσανατολισμένο δένδρο αναζήτησης στο οποίο να

αποθηκεύονται ακέραιοι αριθμοί.

α. Να χρησιμοποιηθεί το πρόγραμμα-κώδικας της προηγούμενης άσκησης 6.

Να υλοποιηθεί η επιλογή δημιουργίας ισοζυγισμένου δένδρου.

β. Εφόσον επιλέξει να δημιουργήσει ένα δένδρο το πρόγραμμα να του ζητά

αρχικά να δώσει ο χρήστης το πλήθος των στοιχείων που θέλει να εισάγει.

Στη συνέχεια να πάρει το πρόγραμμα όλους τους αριθμούς από τον

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

πίνακα.

Να εκτελεστεί η εισαγωγή των 9 αριθμών: 12, 6, 10, 11, 3, 18, 5, 2 και 4.

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

γ. Στη συνέχεια ταξινομείστε τους αριθμούς που εισήχθησαν στον πίνακα

και τυπώστε τους.

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

δ. Με βάση τον ταξινομημένο πίνακα, δημιουργείστε ένα ισοζυγισμένο

δυαδικό κομβοπροσανατολισμένο δένδρο αναζήτησης. Να εισάγετε στον

δένδρο κάθε φορά το κατάλληλο στοιχείο του πίνακα.

Page 96: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

96

Το πρόγραμμα να δίνει αποτελέσματα της μορφής:

Σχεδιάστε έντυπα τη μορφή του δυαδικού κομβοπροσανατολισμένου

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

αριθμών.

δ. Με την τρίτη επιλογή τερματίστε την λειτουργία του προγράμματος.

Page 97: þ Ω ü ÿ Θ Γ þ ÿ ù ü ÿ û Ω Β’ ΕΞΑΜΗΝΟ ΣΠΟΥΔΩΝ · 2019-02-24 · 1.3.6 Είδη αλγορίθμων ... βασικές έννοιες τους πς η

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

97

ΒΙΒΛΙΟΓΡΑΦΙΑ

[1]. Χρ. Κοίλιας, “Δομές Δεδομένων και Οργανώσεις Αρχείων”, Εκδόσεις Νέων

Τεχνολογιών, 1998

[2]. Π.Δ. Μποζάνης, “Αλγόριθμοι, Σχεδιασμός και Ανάλυση”, Εκδόσεις Τζιόλα,

2003.

[3]. SAHNI SARTAJ, “Δομές Δεδομένων, Αλγόριθμοι και Εφαρμογές στην C++”:

Εκδόσεις Τζιόλα, 2004.

[4]. Π.Δ. Μποζάνης, “ Δομές Δεδομένων - Ταξινόμηση και Αναζήτηση με Java”,

Εκδόσεις Τζιόλα, 2003.

[5]. Αθ. Τσακαλίδης, “ Δομές Δεδομένων”, Εκδόσεις Πανεπιστημίου Πατρών, 2004.

[6]. Niklaus Wirth , “Αλγόριθμοι και Δομές Δεδομένων”, Εκδόσεις Κλειδάριθμος,

1990.

[7]. Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein, Introduction

to Algorithms, Second Edition”, Εκδόσεις Κλειδάριθμος, 2002.

[8]. Κυρούσης Λ., Μπούρας Χ., “Θεωρία Γράφων”, Πανεπιστήμιο Πατρών Τμήμα

Μηχ. Η/Υ και Πληροφορικής, Πάτρα


Related Documents