21
Ι.Ε.Κ. Κέρκυρας Αλγοριθμική και Δομές Δεδομένων Σημειώσεις Μαθήματος Μέρος ΑΕιδικότητα: Τεχνικός Δικτύων και Τηλεπικοινωνιών Κέρκυρα, 2013-2014

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

Embed Size (px)

Citation preview

Ι.Ε.Κ. Κέρκυρας

Αλγοριθµική και Δοµές Δεδοµένων

Σηµειώσεις Μαθήµατος Μέρος Α’

Ειδικότητα: Τεχνικός Δικτύων και Τηλεπικοινωνιών

Κέρκυρα, 2013-2014

Κεφάλαιο 1ο – Ανάλυση – Σύνθεση Προβλήµατος ........................................... 3 1.1 Η έννοια πρόβληµα ............................................................................ 3 1.2 Κατανόηση & διατύπωση προβλήµατος .................................................. 3 1.3 Δοµή, ανάλυση και αναπαράσταση προβλήµατος .................................... 3 1.4 Καθορισµός απαιτήσεων και στάδια αντιµετώπισης ενός προβλήµατος ........ 4 1.5 Κατηγορίες προβληµάτων ................................................................... 4 1.6 Λόγοι ανάθεσης ενός προβλήµατος σε υπολογιστή .................................. 5

Κεφάλαιο 2ο – Βασικές Έννοιες Αλγορίθµων ................................................... 5 2.1 Αλγόριθµοι ....................................................................................... 5 2.2. Σταθερές, Μεταβλητές, Τελεστές, Εκφράσεις ......................................... 6 2.3. Βασικές δοµές αλγορίθµων ................................................................. 7 2.4. Δοµή ακολουθίας .............................................................................. 7 2.5. Δοµή επιλογής ................................................................................. 8 2.6. Δοµή επανάληψης ........................................................................... 11

Κεφάλαιο 3ο – Δοµές Δεδοµένων και Αλγόριθµοι ............................................ 14 3.1 «Αλγόριθµοι + Δοµές Δεδοµένων = Προγράµµατα» ............................... 14 3.2 Τεχνικές σχεδίασης αλγορίθµων .......................................................... 14 3.3. Πίνακες .......................................................................................... 15 3.4. Στοίβα ........................................................................................... 16 3.5. Ουρά ............................................................................................. 17 3.6 Λίστα .............................................................................................. 18 3.7 Αναδροµή ........................................................................................ 20

Βιβλιογραφία ............................................................................................ 21

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 3

Κεφάλαιο 1ο – Ανάλυση – Σύνθεση Προβλήµατος 1.1 Η έννοια πρόβληµα Τι ονοµάζουµε «πρόβληµα»; Με τον όρο εννοείται µία κατάσταση η οποία χρήζει αντιµετώπισης, απαιτεί λύση, η δε λύση της δεν είναι γνωστή, ούτε προφανής.

1.2 Κατανόηση & διατύπωση προβλήµατος Κατανόηση προβλήµατος Οποιαδήποτε προσπάθεια αντιµετώπισης ενός προβλήµατος είναι καταδικασµένη σε αποτυχία αν δεν έχει γίνει απόλυτα κατανοητό. Εξαρτάται από δύο παράγοντες: 1. Σωστής διατύπωσης εκ µέρους του δηµιουργού. 2. Σωστής ερµηνείας από την µεριά εκείνου που καλείται να το αντιµετωπίσει.

Διατύπωση προβλήµατος Μπορεί να έχει οποιαδήποτε µορφή, αρκεί να µπορεί να γίνει αντιληπτή από µία από τις πέντε αισθήσεις. Συνηθέστερο µέσο διατύπωσης είναι ο λόγος (προφορικός-γραπτός). Πρέπει να χαρακτηρίζεται από σαφήνεια. Άστοχη χρήση ορολογίας, λανθασµένη σύνταξη µπορούν να προκαλέσουν παρερµηνείες. Η παρερµηνεία όµως είναι δυνατή ακόµη και όταν όλοι οι λεξικολογικοί και συντακτικοί κανόνες κρατούνται µε ευλάβεια. Σηµαντικός ακόµη παράγοντας είναι η αποσαφήνιση του χώρου στον οποίο αναφέρεται. Η πληροφορία αυτή παρέχεται από την διατύπωση-δεδοµένα του προβλήµατος.

Δεδοµένο Οποιοδήποτε στοιχείο µπορεί να γίνει αντιληπτό από έναν τουλάχιστον παρατηρητή µε µία από τις πέντε αισθήσεις του.

Πληροφορία Οποιοδήποτε γνωσιακό στοιχείο προέρχεται από επεξεργασία δεδοµένων.

Επεξεργασία δεδοµένων Η διαδικασία κατά την οποία ένας µηχανισµός:

o δέχεται δεδοµένα, o τα επεξεργάζεται µε προκαθορισµένο τρόπο και o αποδίδει πληροφορίες.

Δύο τέτοιοι µηχανισµοί είναι ο εγκέφαλος και ο υπολογιστής.

1.3 Δοµή, ανάλυση και αναπαράσταση προβλήµατος Δοµή προβλήµατος Με τον όρο δοµή ενός προβλήµατος αναφερόµαστε:

o στα συστατικά του µέρη, o στα επιµέρους τµήµατα που το αποτελούν καθώς και o στον τρόπο που τα µέρη αυτά συνδέονται µεταξύ τους.

Η καταγραφή της δοµής ενός προβλήµατος σηµαίνει ότι έχει ήδη αρχίσει η ανάλυση του προβλήµατος.

Ανάλυση προβλήµατος Το αρχικό πρόβληµα αναλύεται σε άλλα απλούστερα (υπό)προβλήµατα. Με την σειρά τους τα νέα προβλήµατα αναλύονται σε άλλα ακόµη πιο απλά. Η διαδικασία αυτή σταµατά όταν:

o Τα προβλήµατα που προέκυψαν είναι αρκετά απλά και o η αντιµετώπιση τους χαρακτηριστεί δυνατή

Όσο περισσότερο προχωράει η ανάλυση τόσο ελαττώνεται η δυσκολία αντιµετώπισής τους. Η ανάλυση του προβλήµατος σε απλούστερα, αναδύει την δοµή του προβλήµατος. Η ανάλυση µπορεί να γίνει είτε φραστικά είτε γραφικά (διαγραµµατική αναπαράσταση).

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 4

Διαγραµµατική αναπαράσταση (δοµής / ανάλυσης) Είναι µία συχνά χρησιµοποιούµενη γραφική απεικόνιση της δοµής:

o Το αρχικό πρόβληµα αναπαριστάται από ένα ορθογώνιο παραλληλόγραµµο o Κάθε ένα από τα υποπροβλήµατα, στα οποία αναλύεται το αρχικό, αναπαριστάται επίσης από ένα ορθογώνιο παραλληλόγραµµο.

o Τα παραλληλόγραµµα που αντιστοιχούν στα υποπροβλήµατα, σχηµατίζονται ένα επίπεδο χαµηλότερα.

1.4 Καθορισµός απαιτήσεων και στάδια αντιµετώπισης ενός προβλήµατος Καθορισµός απαιτήσεων Είναι η διαδικασία κατά την οποία πρέπει να κάνουµε:

o τον επακριβή προσδιορισµό των δεδοµένων που παρέχει το πρόβληµα καθώς και o την λεπτοµερειακή καταγραφή των ζητουµένων που αναµένονται σαν αποτελέσµατα της επίλυσης.

Τα δεδοµένα δεν είναι πάντα εύκολο να διακριθούν. (Σε πολλά προβλήµατα τα δεδοµένα θα πρέπει να «ανακαλυφθούν» µέσα στα λεγόµενα). Τα ζητούµενα δεν είναι πάντα εύκολο να αποσαφηνισθούν. Δεν υπάρχει µεθοδολογία εντοπισµού και αποσαφήνισης των δεδοµένων/ ζητουµένων ενός προβλήµατος από την διατύπωση. Μία λύση είναι να θέτουµε µία σειρά από ερωτήσεις µε στόχο την διευκρίνιση αποριών σχετικά µε τα ζητούµενα, τον τρόπο παρουσίασης τους, το εύρος τους είτε προς τον δηµιουργό του προβλήµατος είτε προς τον ίδιο τον εαυτό µας.

Στάδια αντιµετώπισης προβλήµατος o Κατανόηση (απαιτείται η σωστή και πλήρης αποσαφήνιση των δεδοµένων και των ζητουµένων)

o Ανάλυση (το αρχικό πρόβληµα διασπάται σε επί µέρους απλούστερα προβλήµατα) o Επίλυση (µέσω της λύσης των επιµέρους προβληµάτων, υλοποιείται η λύση)

1.5 Κατηγορίες προβληµάτων Η κατηγοριοποίηση των προβληµάτων γίνεται βάσει τριών (3) κριτηρίων:

Δυνατότητα επίλυσης

Δόµηση λύσεων (µόνο επιλύσιµα)

Είδος επίλυσης που επιζητούν

Επιλύσιµα Δοµηµένα Απόφασης Ανοικτά Ηµιδοµηµένα Υπολογιστικά Άλυτα Αδόµητα Βελτιστοποίησης

Δυνατότητα επίλυσης: o Επιλύσιµα: Η λύση τους είναι ήδη γνωστή και έχει διατυπωθεί ή η συνάφεια µε άλλα ήδη λυµένα µας επιτρέπει να θεωρούµε σαν βέβαιη την δυνατότητα επίλυσής τους. Παράδειγµα: Επίλυση δευτεροβάθµιων εξισώσεων.

o Ανοικτά: Η λύση τους δεν έχει βρεθεί αλλά δεν έχει αποδειχθεί ότι δεν επιδέχονται λύση. Παράδειγµα: Η ύπαρξη ζωής σε άλλους πλανήτες.

o Άλυτα: Έχουµε φθάσει στην παραδοχή ότι δεν έχουν λύση. Παράδειγµα: Ο τετραγωνισµός του κύκλου.

Δόµηση λύσεων (µόνο επιλύσιµα): o Δοµηµένα: Η επίλυσή τους προέρχεται από µία αυτοµατοποιηµένη διαδικασία. Παράδειγµα: Η εύρεση εµβαδού τριγώνου.

o Ηµιδοµηµένα: Έχουν ένα σαφώς προκαθορισµένο εύρος λύσεων αλλά ο ανθρώπινος παράγοντας πρέπει να επιλέξει την κατάλληλη από όλες τις λύσεις. Παράδειγµα: Η επιλογή µεταφορικού µέσου για ένα ταξίδι.

o Αδόµητα: Οι λύσεις τους δεν µπορούν να δοµηθούν ή δεν έχει διερευνηθεί σε βάθος η δυνατότητα δόµησής τους. Παράδειγµα: Το να κερδίζεις πάντα στο σκάκι.

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 5

Είδος επίλυσης που επιζητούν: o Απόφασης: Η λύση του προβλήµατος είναι µία απόφαση που απαντά σε ένα ερώτηµα. Συνήθως είναι ναι-όχι / αληθής – ψευδής κλπ. Παράδειγµα: «Να πάρω αµάξι ή ποδήλατο»;

o Υπολογιστικά: Το πρόβληµα που τίθεται απαιτεί την διενέργεια υπολογισµών και ζητάµε να βρούµε την τιµή της απάντησης που ικανοποιεί τα δεδοµένα. Παράδειγµα: «Ποια είναι η ρίζα της δευτεροβάθµιας εξίσωσης;»

o Βελτιστοποίησης: Αναζητούµε την απάντηση που ικανοποιεί κατά τον καλύτερο τρόπο τα δεδοµένα. Παράδειγµα: «Θα πάρω αυτοκίνητο. Με 10.000 ευρώ ποιο να αγοράσω;»

1.6 Λόγοι ανάθεσης ενός προβλήµατος σε υπολογιστή Οι κυριότεροι λόγοι που αναθέτουµε ένα πρόβληµα σε έναν υπολογιστή είναι:

o Πολυπλοκότητα υπολογισµών. o Επαναληπτικότητα των διαδικασιών. o Ταχύτητα εκτέλεσης των πράξεων. o Μεγάλο πλήθος δεδοµένων.

Κεφάλαιο 2ο – Βασικές Έννοιες Αλγορίθµων 2.1 Αλγόριθµοι Τι ονοµάζουµε αλγόριθµο; Είναι µία πεπερασµένη σειρά ενεργειών, αυστηρά καθορισµένων και εκτελέσιµων σε πεπερασµένο χρόνο, που στοχεύουν στην επίλυση ενός προβλήµατος.

Ποια είναι τα χαρακτηριστικά ενός αλγορίθµου (κριτήρια που πρέπει να ικανοποιεί); o Είσοδος (input): Καµία, µία ή περισσότερες τιµές δεδοµένων πρέπει να δίνονται ως είσοδος. Η περίπτωση που δεν δίνονται τιµές δεδοµένων εµφανίζεται όταν ο αλγόριθµος δηµιουργεί και επεξεργάζεται κάποιες πρωτογενείς τιµές µε την βοήθεια συναρτήσεων παραγωγής τυχαίων αριθµών ή µε την βοήθεια άλλων απλών εντολών.

o Έξοδος (output): Ο αλγόριθµος πρέπει να δηµιουργεί τουλάχιστον ένα αποτέλεσµα προς τον χρήστη ή προς ένα άλλο αλγόριθµο.

o Καθοριστικότητα (definiteness): Κάθε εντολή πρέπει να καθορίζεται χωρίς αµφιβολία για τον τρόπο εκτέλεσής της. Λόγου χάριν, µία εντολή διαίρεσης πρέπει να θεωρεί και την περίπτωση όπου ο διαιρέτης λαµβάνει µηδενική τιµή.

o Περατότητα (finiteness): Ο αλγόριθµος πρέπει να τελειώνει µετά από πεπερασµένα βήµατα. Αν δεν τελειώνει µετά από ένα συγκεκριµένο αριθµό βηµάτων δεν είναι αλγόριθµος αλλά υπολογιστική διαδικασία.

o Αποτελεσµατικότητα (effectiveness): Κάθε εντολή ενός αλγορίθµου πρέπει να είναι απλή και εκτελέσιµη (δεν αρκεί να έχει οριστεί).

Παραδείγµατα αλγορίθµων από την καθηµερινή ζωή Πώς να φτιάξουµε καφέ, συνταγή για αβγά µάτια, οδηγίες για να πάµε στο φαρµακείο, κλπ.

Τρόποι περιγραφής και αναπαράστασης ενός αλγορίθµου 1. Ελεύθερο κείµενο (free text): Αποτελεί τον πιο ανεπεξέργαστο και αδόµητο τρόπο παρουσίασης. Υπάρχει κίνδυνος να οδηγήσει σε µη εκτελέσιµη παρουσίαση, παραβιάζοντας το τελευταίο χαρακτηριστικό των αλγορίθµων το κριτήριο της αποτελεσµατικότητας.

2. Διαγραµµατικές τεχνικές (diagramming techniques): Αποτελούν γραφικό τρόπο αναπαράστασης ενός αλγορίθµου. Μια από τις πιο παλιές και γνωστές τεχνικές είναι και το διάγραµµα ροής (flow chart). Η χρήση διαγραµµατικών τεχνικών δεν είναι η καλύτερη λύση, γι’ αυτό εµφανίζονται όλο και σπανιότερα στην βιβλιογραφία και στην πράξη.

3. Φυσική γλώσσα (natural language) κατά βήµατα: Μοιάζει µε το ελεύθερο κείµενο απλά είναι κατά βήµατα. Κίνδυνος να παραβιαστεί το κριτήριο της καθοριστικότητας.

4. Κωδικοποίηση (coding): Δηλαδή µε ένα πρόγραµµα γραµµένο είτε µε µία ψευδογλώσσα είτε σε κάποιο προγραµµατιστικό περιβάλλον που όταν εκτελεσθεί θα δώσει τα ίδια αποτελέσµατα µε τον αλγόριθµο.

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 6

Διαγράµµατα Ροής Τα σύµβολα που χρησιµοποιούνται σε ένα διάγραµµα ροής Πορεία ενεργειών

Αρχή / Τέλος

Είσοδος / Έξοδος Δεδοµένων

Εκχώρηση δεδοµένων / Εκτέλεση πράξεων

Έλεγχος συνθήκης

2.2. Σταθερές, Μεταβλητές, Τελεστές, Εκφράσεις Σταθερές (constants) Με τον όρο αυτό αναφερόµαστε σε προκαθορισµένες τιµές που παραµένουν αµετάβλητες σε όλη τη διάρκεια της εκτέλεσης ενός αλγορίθµου. Οι σταθερές διακρίνονται σε:

Αριθµητικές 123, +5, - 7, 34,78 Αλφαριθµητικές «Δώσε έναν αριθµό», «ηλικία» Λογικές Αληθής, Ψευδής (υπάρχουν µόνο αυτές οι δύο)

Μεταβλητές (variables): Μία µεταβλητή είναι ένα γλωσσικό αντικείµενο, που χρησιµοποιείται για να παραστήσει ένα στοιχείο δεδοµένου. Στη µεταβλητή εκχωρείται µία τιµή, η οποία µπορεί να αλλάζει κατά τη διάρκεια του αλγορίθµου. Ανάλογα µε το είδος της τιµής που µπορούν να λάβουν οι µεταβλητές διακρίνονται, όπως και οι σταθερές, σε: αριθµητικές, αλφαριθµητικές και λογικές.

Τελεστές (operators): Πρόκειται για τα γνωστά σύµβολα που χρησιµοποιούνται στις διάφορες πράξεις. Οι τελεστές διακρίνονται σε αριθµητικούς, λογικούς και συγκριτικούς.

Αριθµητικούς +, -, *, / ^ Λογικούς ΚΑΙ, Ή, ΌΧΙ Συγκριτικούς <, >, =, <=, >=, <>

Α Β Α ΚΑΙ Β Α Ή Β

Αληθής Αληθής Αληθής Αληθής Αληθής Ψευδής Ψευδής Αληθής Ψευδής Αληθής Ψευδής Αληθής Ψευδής Ψευδής Ψευδής Ψευδής

Α Όχι Α

Αληθής Ψευδής Ψευδής Αληθής

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 7

Ιεραρχία τελεστών: 1. Αριθµητικοί 2. Συγκριτικοί 3. Λογικοί.

Ιεραρχία αριθµητικών τελεστών: 1. Παρενθέσεις 2. Ύψωση σε δύναµη 3. Πολλαπλασιασµός και διαίρεση 4. Πρόσθεση και αφαίρεση

Οι αριθµητικοί τελεστές DIV και MOD Ø Η διαίρεση µε τον τελεστή «div» δίνει ακέραιο πηλίκο ενώ µε τον τελεστή «/» δίνει δεκαδικό, πχ. 11/2=5,5 ενώ 11div2 = 5

Ø Η διαίρεση µε τον τελεστή “mod” δίνει το υπόλοιπο της διαίρεση, πχ. 11mod2 = 1 Τα ψηφία ενός τριψήφιου αριθµού x είναι: Γενικό παράδειγµα Έστω ο αριθµός 357

o 1ο ψηφίο = x DIV 100 y= x MOD 100 «κρατάµε» µόνο δεκάδες και µονάδες δηλ. διψήφιο αριθµό

o 2ο ψηφίο = y DIV 10 o 3ο ψηφίο= y MOD 10

o 357 DIV 100 = 3 o 357 MOD 100 = 57

o 57 DIV 10 = 5 o 57 MOD 10 = 7

Εκφράσεις (expressions): Οι εκφράσεις διαµορφώνονται από τους τελεστέους (operands), που είναι σταθερές και µεταβλητές και από τους τελεστές. Η διεργασία αποτίµησης µίας έκφρασης συνίσταται στην απόδοση τιµών στις µεταβλητές και στην εκτέλεση των πράξεων. Η τελική τιµή της πράξης εξαρτάται από την ιεραρχία των πράξεων και τη χρήση των παρενθέσεων. Μία έκφραση µπορεί να αποτελείται από µία µόνο µεταβλητή ή σταθερά µέχρι µία πολύπλοκη µαθηµατική παράσταση

2.3. Βασικές δοµές αλγορίθµων Οι βασικές δοµές των αλγορίθµων είναι οι:

1. Δοµή ακολουθίας 2. Δοµή επιλογής / πολλαπλής επιλογής 3. Δοµή επανάληψης

2.4. Δοµή ακολουθίας Ονοµάζεται και σειριακή ή ακολουθιακή δοµή. Αποτελείται από ένα σύνολο εντολών που τοποθετούνται η µία κάτω από την άλλη. Χρησιµοποιείται (από µόνη της) για την επίλυση πολύ απλών προβληµάτων όπου η σειρά εκτέλεσης ενός συνόλου ενεργειών είναι δεδοµένη. Χρησιµοποιείται ευρύτατα σε συνδυασµό µε άλλες δοµές (επιλογής, επανάληψης).

Παράδειγµα αλγορίθµου µε δοµή ακολουθίας Λεκτική περιγραφή: Να διαβαστούν δύο αριθµοί και να υπολογιστεί και να εκτυπωθεί το άθροισµά τους. Διάγραµµα ροής: Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_1      Διάβασε  a,  b      c  ←  a  +  b        Εκτύπωσε  c  Τέλος  Παράδειγμα_1  

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 8

Υλοποίηση σε γλώσσα προγραµµατισµού C: #include  <stdio.h>  main()  {  

int  a,  b,  c;  clrscr();  printf("Dose  tin  timi  tou  a:  ");  scanf("%d",&a);  printf("\nDose  tin  timi  tou  b:  ");  scanf("%d",&b);  c=a+b;  printf("To  apotelesma  a+b  einai:  %d",  c);  getch();  

}

2.5. Δοµή επιλογής Αποτελείται από ένα σύνολο εντολών που εκτελούνται κατά περίπτωση. Η διαδικασία της επιλογής περιλαµβάνει τον έλεγχο κάποιας συνθήκης µε δύο δυνατές τιµές (αληθής, ψευδής) και στη συνέχεια την απόφαση εκτέλεσης κάποιας εντολής ανάλογα µε τη συνθήκη.

Παράδειγµα αλγορίθµου µε δοµή απλής επιλογής Λεκτική περιγραφή: Να διαβαστεί ένας αριθµός και να εκτυπωθεί η απόλυτη τιµή του. Διάγραµµα ροής: Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_2      Διάβασε  a      Αν  a  <  0  τότε              a  ← a * (-1)      τέλος_αν      Εκτύπωσε  a  Τέλος  Παράδειγμα_2  

Υλοποίηση σε γλώσσα προγραµµατισµού C:

#include  <stdio.h>  main()  {  

int  a;  clrscr();  printf("Dose  tin  timi  tou  a:  ");  scanf("%d",&a);  if(a<0)  

a=a*(-­‐1);  printf("H  apoliti  timi  tou  a  einai:  ",  a);  getch();  

}

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 9

Παράδειγµα αλγορίθµου µε δοµή σύνθετης επιλογής Λεκτική περιγραφή: Να διαβαστούν δύο αριθµοί και σε περίπτωση που ο πρώτος αριθµός είναι µικρότερος του δεύτερου να υπολογισθεί και να εκτυπωθεί το άθροισµά τους, διαφορετικά να υπολογισθεί και να εκτυπωθεί το γινόµενό τους. Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_3      Διάβασε  a,  b      Αν  a  <  b  τότε              c  ← a + b      αλλιώς                c  ← a * b      τέλος_αν          Εκτύπωσε  c  Τέλος  Παράδειγμα_3  

Παράδειγµα αλγορίθµου µε δοµή πολλαπλής επιλογής Λεκτική περιγραφή: Να διαβαστεί ένας ακέραιος και να εκτυπωθεί το αντίστοιχο γράµµα του λατινικού αλφαβήτου, αν ο ακέραιος έχει την τιµή 1 ή 2 ή 3 διαφορετικά να εκτυπωθεί η λέξη «Άγνωστος». Λογικό διάγραµµα:

Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_4      Διάβασε  a      Αν  a  =  1  τότε              Εκτύπωσε  “A”      αλλιώς_αν  a  =  2  τότε                Εκτύπωσε  “Β”      αλλιώς_αν  a  =  3  τότε                Εκτύπωσε  “C”      αλλιώς                Εκτύπωσε  “Άγνωστος”      τέλος_αν      Τέλος  Παράδειγμα_4

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 10

Υλοποίηση σε γλώσσα προγραµµατισµού C: #include  <stdio.h>  main()  {  

int  a;  clrscr();  printf("Dose  tin  timi  tou  akeraiou:  ");  scanf("%d",&a);  if(a==1)  

printf("A");  else  if(a==2)  

printf("B");  else  if(a==3)  

printf("C");  else  

printf("Agnwstos!");  getch();  

}

Παράδειγµα αλγορίθµου µε δοµή πολλαπλής επιλογής χρησιµοποιώντας την εντολή Επίλεξε Λεκτική περιγραφή: Να εισαχθεί ένας ακέραιος που αντιστοιχεί σε µία ηλικία και να βρεθεί σε ποια όρια εντάσσεται η δεδοµένη ηλικία εµφανίζοντας σχετικό µήνυµα. Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_5      Εκτύπωσε  “Σε  ποια  ηλικία  άρχισε  να  μαθαίνεις  προγραμματισμό;”      Διάβασε  age      Επίλεξε  age              Περίπτωση  <  0                        Εκτύπωσε  “Δώσε  μία  πραγματική  ηλικία…”            Περίπτωση  <  5                        Εκτύπωσε  “Μάλλον  τα  παραλές  …”            Περίπτωση  <  60                      Εκτύπωσε  “Μπράβο…”            Περίπτωση  <  100                        Εκτύπωσε  “Ποτέ  δεν  είναι  αργά…”            Περίπτωση  αλλιώς                        Εκτύπωσε  “Κάλλιο  αργά  παρά  ποτέ…”        τέλος_επιλογών        Τέλος  Παράδειγμα_5

Υλοποίηση σε γλώσσα προγραµµατισµού C:

#include  <stdio.h>    main()    {    

int  day;    printf  ("δωσε  την  ημερα  (ακεραιο  απο  1  μεχρι  και  το  7)\n");    scanf("%d",  &day);    switch  (  day  )  {    

case  (  1  ):  printf  ("Δευτέρα!\n");    break;    

case  (  2  ):  printf  ("Τρίτη!\n");    break;    

    case  (  3  ):  printf  ("Τετάρτη!\n");    break;    

case  (  4  ):  printf  ("Πέμπτη!\n");    break;    

case  (  5  ):  printf  ("Παρασκευή!\n");    break;    

case  (  6  ):  printf  ("Σαββάτο!\n");    

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 11

break;    case  (  7  ):  printf  ("Κυριακή!\n");    

break;    default:  printf  ("λάθος  επιλογή!\n");    

break;    }    

}  

Παράδειγµα µε εµφωλευµένες διαδικασίες Λεκτική περιγραφή: Να διαβάζονται δύο αριθµοί που αντιστοιχούν στο ύψος και στο βάρος ενός άνδρα. Να εκτυπωνέται ότι ο άνδρας είναι «ελαφρύς», αν το βάρος του είναι κάτω από 80 κιλά ή να εκτυπώνεται «βαρύς» στην αντίθετη περίπτωση. Επίσης να εκτυπώνεται «κοντός» αν το ύψος είναι κάτω από 1.70, αλλιώς να εκτυπώνεται «ψηλός». Υλοποίηση σε ψευδογλώσσα:

Αλγόριθμος  Παράδειγμα_6      Διάβασε  ύψος,  βάρος          Αν  βάρος  <  80    τότε              Αν  ύψος  <  1.70  τότε                          Εκτύπωσε  “ελαφρύς  -­‐  κοντός”              αλλιώς                        Εκτύπωσε  “ελαφρύς  -­‐  ψηλός”                τέλος_αν      αλλιώς                Αν  ύψος  <  1.70  τότε                          Εκτύπωσε  “βαρύς  -­‐  κοντός”              αλλιώς                        Εκτύπωσε  “βαρύς  -­‐  ψηλός”                τέλος_αν      τέλος_αν        Τέλος  Παράδειγμα_6

2.6. Δοµή επανάληψης Η δοµή επανάληψης εφαρµόζεται στις περιπτώσεις όπου µία ακολουθία εντολών πρέπει να γίνει περισσότερες από µία φορές. Εφαρµόζεται σε ένα σύνολο περιπτώσεων που έχουν κάτι κοινό. Οι επαναληπτικές διαδικασίες συχνά εµπεριέχουν και συνθήκες επιλογών.

Παράδειγµα αλγορίθµου µε δοµή επανάληψης Λεκτική περιγραφή: Να γραφεί αλγόριθµος που να εµφανίζει τους αριθµούς από το 1 µέχρι το 100. Υλοποίηση σε ψευδογλώσσα µε την εντολή ‘Οσο ... Επανάλαβε:

Αλγόριθμος  Παράδειγμα_7      i  ← 1      Όσο  i  <=  100  επανάλαβε              Εκτύπωσε  i              i  ← i +1      τέλος_επανάληψης    Τέλος  Παράδειγμα_7

Υλοποίηση σε γλώσσα προγραµµατισµού C: #include  <stdio.h>    main()    {       int  i  =  1;     while  (i  <=  100){       printf(“%d”,  i);                            i++;     }     getchar();  }  

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 12

Υλοποίηση σε ψευδογλώσσα µε την εντολή Αρχή_Επανάληψης ... Μέχρις_ότου: Αλγόριθμος  Παράδειγμα_8      i  ← 1      Αρχή_επανάληψης              Εκτύπωσε  i              i  ← i +1      Μέχρις_ότου  i  >  100  Τέλος  Παράδειγμα_8

Υλοποίηση σε γλώσσα προγραµµατισµού C:

#include  <stdio.h>    main()    {       int  i=1;     do  {       printf(“%d”,  i);             i++;     }  while  (i  <=  100);     getchar();  }  

Υλοποίηση σε ψευδογλώσσα µε την εντολή Για... από... µέχρι:

Αλγόριθμος  Παράδειγμα_9      Για  i  από  1  μέχρι  100              Εκτύπωσε  i      τέλος_επανάληψης  Τέλος  Παράδειγμα_9

Υλοποίηση σε γλώσσα προγραµµατισµού C:

#include  <stdio.h>    main()    {       int  i;     for  (i  =1;  i  <=  100,  i++){       printf(“%d”,  i);     }     getchar();  }  

Παράδειγµα αλγορίθµου µε δοµή επανάληψης και επαναληπτική είσοδο στοιχείων Λεκτική περιγραφή: Να γραφεί αλγόριθµος που να διαβάζει ένα άγνωστο πλήθος αριθµών και να εµφανίζει τον κάθε αριθµό (όσο αυτοί είναι θετικοί). Υλοποίηση σε ψευδογλώσσα µε την εντολή ‘Οσο ... Επανάλαβε:

Αλγόριθμος  Παράδειγμα_10      Διάβασε  x      Όσο  x  >  0  επανάλαβε              Εμφάνισε  x              Διάβασε  x      τέλος_επανάληψης    Τέλος  Παράδειγμα_10

Υλοποίηση σε ψευδογλώσσα µε την εντολή Αρχή_Επανάληψης ... Μέχρις_ότου:

Αλγόριθμος  Παράδειγμα_11      Αρχή_επανάληψης              Διάβασε  x              Εμφάνισε  x      Mέχρις_ότου  x  <  0  Τέλος  Παράδειγμα_11

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 13

Παράδειγµα αλγορίθµου υπολογισµού αθροίσµατος αριθµών µε την εντολή Για Λεκτική περιγραφή: Να βρεθεί και να εκτυπωθεί το άθροισµα των 100 ακεραίων από το 1 µέχρι το 100. Λογικό διάγραµµα: Υλοποίηση σε ψευδογλώσσα µε την εντολή Για... από... µέχρι:

Αλγόριθμος  Παράδειγμα_12      sum  ←  0      Για  i  από  1  μέχρι  100              sum  ←  sum    +  i      τέλος_επανάληψης      Εκτύπωσε  sum  Τέλος  Παράδειγμα_12

Υλοποίηση σε γλώσσα προγραµµατισµού C: #include  <stdio.h>  main()  {  

int  i,  sum;  clrscr();    sum=0;  

  for(i=1;  i<=100;  i++)  sum=sum+i;  

 printf("To  athroisma  twn  100  prwtwn  akeraiwn  einai:  %d",  sum);  getch();  

}

Παράδειγµα αλγορίθµου υπολογισµού αθροίσµατος αριθµών µε την εντολή Για Λεκτική περιγραφή: Να βρεθεί και να εκτυπωθεί το άθροισµα των άρτιων αριθµών από το 1 µέχρι το 100. Υλοποίηση σε ψευδογλώσσα µε την εντολή Για... από... µέχρι:

Αλγόριθμος  Παράδειγμα_13      sum  ←  0      Για  i  από  2  μέχρι  100  με_βήμα  2              sum  ←  sum    +  i      τέλος_επανάληψης      Εκτύπωσε  sum  Τέλος  Παράδειγμα_13

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 14

Κεφάλαιο 3ο – Δοµές Δεδοµένων και Αλγόριθµοι 3.1 «Αλγόριθµοι + Δοµές Δεδοµένων = Προγράµµατα» Δοµή δεδοµένων Είναι ένα σύνολο αποθηκευµένων δεδοµένων που υφίστανται επεξεργασία από ένα σύνολο λειτουργιών. Τα δεδοµένα ενός προβλήµατος αποθηκεύονται στον υπολογιστή, είτε στην κύρια µνήµη του είτε στην δευτερεύουσα. Η αποθήκευση δεν γίνεται κατά ένα τυχαίο τρόπο αλλά συστηµατικά, δηλαδή χρησιµοποιώντας µία δοµή. Κάθε µορφή δοµής δεδοµένων αποτελείται από ένα σύνολο κόµβων (nodes). Ως παράδειγµα δοµής δεδοµένων θα µπορούσαµε να αναφέρουµε έναν τηλεφωνικό κατάλογο αποθηκευµένο στη µνήµη του υπολογιστή.

Βασικές λειτουργίες (πράξεις) επί των δοµών δεδοµένων o Προσπέλαση: πρόσβαση σε ένα κόµβο µε σκοπό να εξεταστεί ή να αλλάξει το περιεχόµενό του.

o Εισαγωγή: προσθήκη νέων κόµβων σε µία δοµή. o Διαγραφή: (αντίθετο της εισαγωγής), δηλαδή αφαίρεση ενός κόµβου από µία δοµή. o Αναζήτηση: γίνεται προσπέλαση των κόµβων µίας δοµής προκειµένου να εντοπιστούν ένας ή περισσότεροι που έχουν µία δεδοµένη ιδιότητα.

o Ταξινόµηση: όπου οι κόµβοι διατάσσονται κατά αύξουσα ή φθίνουσα σειρά. o Αντιγραφή: όλοι ή µερικοί από τους κόµβους µίας δοµής αντιγράφονται σε µία άλλη. o Συγχώνευση: δύο ή περισσότερες δοµές ενώνονται σε µία δοµή. o Διαχωρισµός: (αντίστροφα από την συγχώνευση)

Στην πράξη σπάνια χρησιµοποιούνται και οι οκτώ λειτουργίες για κάποια δοµή. Συνηθέστατα παρατηρείται το φαινόµενο µία δοµή δεδοµένων να είναι αποδοτικότερη από µία άλλη δοµή µε κριτήριο κάποια λειτουργία, για παράδειγµα την αναζήτηση, αλλά λιγότερο αποδοτική για κάποια άλλη λειτουργία, για παράδειγµα την εισαγωγή. Αυτές οι παρατηρήσεις εξηγούν αφ' ενός την ύπαρξη διαφορετικών δοµών, και αφ' ετέρου τη σπουδαιότητα της επιλογής της κατάλληλης δοµής κάθε φορά.

Κατηγορίες δοµών δεδοµένων Οι δοµές δεδοµένων διακρίνονται σε δύο µεγάλες κατηγορίες:

o Στατικές (static) o Δυναµικές (dynamic)

Οι δυναµικές δοµές δεν αποθηκεύονται σε συνεχόµενες θέσεις µνήµης αλλά στηρίζονται στην τεχνική της λεγάµενης δυναµικής παραχώρησης µνήµης (dynamic memory allocation). Με άλλα λόγια, οι δοµές αυτές δεν έχουν σταθερό µέγεθος, αλλά ο αριθµός των κόµβων τους µεγαλώνει και µικραίνει καθώς στη δοµή εισάγονται νέα δεδοµένα ή διαγράφονται κάποια δεδοµένα αντίστοιχα. Όλες οι σύγχρονες γλώσσες προγραµµατισµού προσφέρουν τη δυνατότητα δυναµικής παραχώρησης µνήµης.

Σχέση µεταξύ αλγορίθµου και δοµής δεδοµένων Υπάρχει µεγάλη εξάρτηση µεταξύ της δοµής δεδοµένων και του αλγόριθµου που επεξεργάζεται τη δοµή. Μάλιστα, το πρόγραµµα πρέπει να θεωρεί τη δοµή δεδοµένων και τον αλγόριθµο ως µία αδιάσπαστη ενότητα. Η παρατήρηση αυτή δικαιολογεί την εξίσωση που διατυπώθηκε το 1976 από τον Wirth (που σχεδίασε και υλοποίησε τη γλώσσα Pascal):

Αλγόριθµοι + Δοµές Δεδοµένων = Προγράµµατα

Πρόγραµµα Ένα πρόγραµµα ενός υπολογιστή είναι µια συνεχής αλληλουχία εντολών τις οποίες ο υπολογιστής καλείται να εκτελέσει µία προς µία για να παραχθεί το επιθυµητό προς τον χρήστη αποτέλεσµα.

3.2 Τεχνικές σχεδίασης αλγορίθµων Οι µέθοδοι λύσης ενός προβλήµατος που προκύπτουν από την ανάλυσή του, οδηγούν στη σχεδίαση ενός αλγορίθµου που συνιστά την ακολουθία βηµάτων, που πρέπει να ακολουθηθούν για να επιλυθεί το πρόβληµα. Όπως αναφέρθηκε, υπάρχει περίπτωση να παρουσιαστούν περισσότερες από µία τεχνικές για τη λύση ενός προβλήµατος. Κάθε τεχνική έχει τα δικά της χαρακτηριστικά και τις δικές της ιδιαιτερότητες.

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 15

Οι πιο συνηθισµένες τεχνικές σχεδίασης αλγορίθµων είναι οι εξής: o Μέθοδος διαίρει και βασίλευε o Μέθοδος δυναµικού προγραµµατισµού o Άπληστη µέθοδος

Μέθοδος «Διαίρει και Βασίλευε» Στην κατηγορία "Διαίρει και Βασίλευε" (divide and conquer) εντάσσονται οι τεχνικές που υποδιαιρούν ένα πρόβληµα σε µικρότερα υποπροβλήµατα, που έχουν την ίδια τυποποίηση µε το αρχικό πρόβληµα αλλά είναι µικρότερα σε µέγεθος. Με όµοιο τρόπο, τα υπο-προβλήµατα αυτά µπορούν να διαιρεθούν σε ακόµη µικρότερα υποπροβλήµατα κοκ. Έτσι, η επίλυση ενός προβλήµατος έγκειται στη σταδιακή επίλυση των όσο το δυνατόν µικρότερων υποπροβληµάτων, ώστε τελικά να καταλήξουµε στη συνολική λύση του αρχικού ευρύτερου προβλήµατος. Αυτή η προσέγγιση ονοµάζεται από επάνω προς τα κάτω (top-down). Πιο τυπικά, η περιγραφή αυτής της µεθόδου σχεδίασης αλγορίθµων µπορεί να αποδοθεί µε τα επόµενα βήµατα:

1. Δίνεται για επίλυση ένα στιγµιότυπο ενός προβλήµατος. 2. Υποδιαιρείται το στιγµιότυπο του προβλήµατος σε υπο-στιγµιότυπα του ίδιου προβλήµατος.

3. Δίνεται ανεξάρτητη λύση σε κάθε ένα υπο-στιγµιότυπο. 4. Συνδυάζονται όλες οι µερικές λύσεις που βρέθηκαν για τα υπο-στιγµιότυπα, έτσι ώστε να δοθεί η συνολική λύση του προβλήµατος.

Μέθοδος δυναµικού προγραµµατισµού Με τον δυναµικό προγραµµατισµό ακολουθούµε την αντίστροφη διαδικασία από τη µέθοδο «Διαίρει και Βασίλευε». Εδώ έχουµε προσέγγιση του προβλήµατος από κάτω προς τα επάνω (bottom-up). Η φιλοσοφία των προβληµάτων αυτών είναι από την αρχή να επιλύονται τα µικρότερα προβλήµατα και σταδιακά να επιλύονται τα µεγαλύτερα ως σύνθεση των απλούστερων. Εποµένως τα βήµατα που ακολουθούνται κατά την προσέγγιση αυτή είναι:

1. Ξεκινά η λύση από το ελάχιστο στιγµιότυπο του προβλήµατος, 2. Υπολογίζονται σταδιακά αποτελέσµατα όλο και µεγαλύτερων υπο-στιγµιότυπων, 3. Καταλήγει στη σύνθεση.

Άπληστη µέθοδος Σε πολλά προβλήµατα βελτιστοποίησης χρησιµοποιείται µία µέθοδος, που δεν βρίσκει πράγµατι τη βέλτιστη λύση, αλλά σκοπός της είναι να την προσεγγίσει. Συνήθως, οι αλγόριθµοι αυτού του τύπου προχωρούν µε βάση σταδιακές επιλογές που αφορούν στο βέλτιστο κάθε βήµατος, χωρίς µέριµνα για το τελικό βέλτιστο. Η µέθοδος αυτή που είναι γνωστή και ως "άπληστη µέθοδος" (greedy method), µπορεί να τυποποιηθεί σύµφωνα µε τις εξής δύο παραδοχές:

1. Σε κάθε βήµα επιλογή της τρέχουσας βέλτιστης επιλογής. 2. Επιβεβαίωση ότι αυτή η προσέγγιση εγγυάται τη συνολική βέλτιστη.

3.3. Πίνακες Με τον όρο στατική δοµή δεδοµένων εννοείται ότι το ακριβές µέγεθος της απαιτούµενης κύριας µνήµης καθορίζεται κατά τη στιγµή του προγραµµατισµού τους και κατά συνέπεια παραπέµενει σταθερό σε όλη τη διάρκεια εκτέλεσης του προγράµµατος. Τα στοιχεία των στατικών δοµών αποθηκευόνται σε συνεχόµενες θέσεις µνήµης. Στην πράξη οι στατικές δοµές δεδοµένων υλοποιούνται µε πίνακες. Μπορούµε να ορίσουµε ως πίνακα µία δοµή που περιέχει στοιχεία του ίδιου τύπου (δηλαδή ακέραιος, πραγµατικούς, χαρακτήρες, κλπ.). Η αναφορά στα στοιχεία ενός πίνακα γίνεται µε τη χρήση του συµβολικού ονόµατος του πίνακα ακολουθούµενου από την τιµή ενος ή περισσοτέρων δεικτών (indexes) σε παρένθεση ή αγκύλη, πχ. Πίνακας[2] . Ένας πίνακας µπορεί να είναι µονοδιάστατος, αλλά στη γενικότερη περίπτωση µπορεί να δισδιάστατος, τρισδιάστατος, κλπ. Στους δισδιάστατους πίνακες αν το µέγεθος των δύο διαστάσεων είναι ίσο τότε ο πίνακας λέγεται τετραγωνικός και συµβολίζεται ως πίνακας n x n. Παραδείγµατα πινάκων:

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 16

Παράδειγµα εύρεσης του µικρότερου στοιχείου ενός µονοδιάστατου πίνακα Λεκτική περιγραφή: Δίνεται ένας µονοδιάστατος πίνακας table 100 στοιχείων. Να σχεδιαστεί αλγόριθµος που να βρίσκει το µικρότερο στοιχείο του.

Αλγόριθμος  Παράδειγμα_1      Δεδομένα  //  table      min  ←  table[1]      Για  i  από  2  μέχρι  100              Αν  table[i]  <  min  τότε                      min  ←  table[i]              τέλος_αν      τέλος_επανάληψης      Εμφάνισε  min    Τέλος  Παράδειγμα_1

Παράδειγµα εύρεσης αθροίσµατος στοιχείων ενός δισδιάστατου πίνακα Λεκτική περιγραφή: Δίνεται ένας δισδιάστατος πίνακας table µε m γραµµές και n στήλες. Να βρεθεί το άθροισµα κατά γραµµή, κατά στήλη και συνολικά.

Αλγόριθμος  Παράδειγμα_2  Δεδομένα  //  m,  n,  table  

  sum  ←  0  Για  i  από  1  μέχρι  m     row[i]  ←  0  τέλος_επανάληψης  Για  j  από  1  μέχρι  n     col[j]  ←  0  τέλος_επανάληψης  Για  i  από  1  μέχρι  m  

Για  j  από  1  μέχρι  n         sum  ←  sum  +  table[i,j]         row[i]  ←  row[i]  +  table[i,j]  

col[j]  ←  col[j]  +  table[i,j]  τέλος_επανάληψης  

τέλος_επανάληψης  Αποτελέσματα  //  row,  col,  sum  

Τέλος  Παράδειγμα_2

3.4. Στοίβα Μία στοίβα δεδοµένων µοιάζει µε µία στοίβα από πιάτα. Για παράδειγµα κάθε πιάτο που πλένεται τοποθετείται στην κορυφή της στοίβας των πιάτων, ενώ για σκούπισµα λαµβάνεται και πάλι το πιάτο της κορυφής. Αυτή η µέθοδος επεξεργασίας ονοµάζεται Τελευταίο Μέσα Πρώτο Έξω ή απλούστερα µε την αγγλική συντοµογραφία LIFO (Last-In-First-Out). Δύο είναι οι κύριες λειτουργίες σε µία στοίβα:

o Η ώθηση (push) στοιχείου στην κορυφή της στοίβας και o Η απώθηση (pop) στοιχείου από κορυφή της στοίβας

Η διαδικασία της ώθησης πρέπει οπωσδήποτε να ελέγχει αν η στοίβα είναι γεµάτη, οπότε λέγεται ότι συµβαίνει υπερχείλιση (overflow) της στοίβας. Αντίστοιχα η διαδικασία της απώθησης ελέγχει αν υπάρχει ένα τουλάχιστον στοιχείο στη στοίβα, δηλαδή ελέγχει αν γίνεται υποχείλιση (underflow) της στοίβας. Μία στοίβα µπορεί να υλοποιηθεί πολύ εύκολα µε τη βοήθεια ενός µονοδιάστατου πίνακα. Μία βοηθητική µεταβλητή (µε όνοµα συνήθως top) χρησιµοποιείται για να δείχνει το στοιχείο που τοποθετήθηκε τελευταίο στην κορυφή της στοίβας. Για την εισαγωγή ενός νέου στοιχείου στη στοίβα (ώθηση), αρκεί να αυξηθεί η µεταβλητή top κατά ένα και στη θέση αυτή να εισέλθει το στοιχείο. Αντίθετα για την εξαγωγή ενός στοιχείου από τη στοίβα (απώθηση) εξέρχεται πρώτα το στοιχείο που δείχνειη µεταβλητή top και στη συνέχεια η top µειώνεται κατά ένα για να δείχνει τη νέα κορυφή.

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 17

Αλγόριθµος Ώθησης στοιχείου σε στοίβα Στον ακόλουθο αλγόριθµο χρησιµοποιείται µία λογική µεταβλητή, done, η οποία δηλώνει την επιτυχή εκτέλεσης της διαδικασίας. Η µεταβλητή top δηλώνει την επάνω θέση της στοίβας που είναι κατειληµµένη από κάποιο στοιχείο. Τα δεδοµένα είναι αποθηκευµένα σε ένα µονοδιάστατο πίνακα, που ονοµάζεται stack και έχει µέγεθος size. Η µεταβλητή item χρησιµεύει για την αποθήκευση του στοιχείου που εισάγεται.

Αλγόριθμος  Ώθηση  Δεδομένα  //  top,  item  Αν  top  <  size  τότε                top  ←  top  +  1                stack[top]  ←  item                done  ←  Αληθής  αλλιώς     done  ←  Ψευδής  τέλος_αν  Αποτελέσματα  //  top,  done  

Τέλος  Ώθηση

Αλγόριθµος Απώθησης στοιχείου σε στοίβα Στον ακόλουθο αλγόριθµο χρησιµοποιείται οι ίδιες µεταβλητές µε τον αλγόριθµο της Ώθησης, µε τη µόνη διαφορά ότι εδώ η µεταβλητή item χρησιµεύει για την αποθήκευση του στοιχείου που εξάγεται από τη στοίβα.

Αλγόριθμος  Απώθηση  Δεδομένα  //  top  Αν  top  <=  1  τότε                              item  ←  stack[top]                top  ←  top  -­‐  1                done  ←  Αληθής  αλλιώς     done  ←  Ψευδής  τέλος_αν  Αποτελέσματα  //  item,  top,  done  

Τέλος  Απώθηση

3.5. Ουρά Σε µία ουρά αναµονής µε ανθρώπους συµβαίνει να εξυπηρετείται εκείνος που στάθηκε στην ουρά πρώτος από όλους τους άλλους. Η µέθοδος αυτή επεξεργασίας ονοµάζεται Πρώτο Μέσα Πρώτο Έξω ή απλούστερα µε την αγγλική συντοµογραφία FIFI (First-In-First-Out). Δύο είναι οι κύριες λειτουργίες που εκτελούνται σε µία ουρά:

o Η εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς και o Η εξαγωγή (dequeue) στοιχείου από το εµπρός άκρο της ουράς

Σε αντίθεση µε τη δοµή της στοίβας, στην περίπτωση της ουράς απαιτούνται δύο δείκτες: ο εµπρός (front) και πίσω (rear) δείκτης, που µας δίνουν τη θέση του στοιχείου που σε πρώτη ευκαιρία θα εξαχθεί και τη θέση του στοιχείου που µόλις εισήλθε. Μία ουρά µπορεί να υλοποιηθεί µε τη βοήθεια ενός µονοδιάστατου πίνακα. Για την εισαγωγή ενός νέου στοιχείου στην ουρά αυξάνεται ο δείκτης rear κατά ένα και στη θέση αυτή αποθηκεύεται το στοιχείο. Αντίστοιχα για τη λειτουργία της εξαγωγής, εξέρχεται το στοιχείο που δείχνει ο δείκτης front, ο οποίος στη συνέχεια αυξάνεται κατά ένα, για να δείχνει το επόµενο στοιχείο που πρόκειται να εξαχθεί. Σε κάθε περίπτωση όµως πρέπει να ελέγχεται πριν από οποιαδήποτε ενέργεια αν υπάρχει ελεύθερος χώρος στον πίνακα για την εισαγωγή και αν υπάρχει ένα τουλάχιστον στοιχείο για την εξαγωγή.

Αλγόριθµος Εισαγωγής στοιχείου σε ουρά Στον ακόλουθο αλγόριθµο χρησιµοποιείται µία λογική µεταβλητή, done, η οποία δηλώνει την επιτυχή εκτέλεσης της διαδικασίας. Η µεταβλητή rear δηλώνει το δείκτη που δείχνει την

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 18

τελευταία θέση της ουράς, που είναι ένας πίνακας queue µε µέγεθος size. Η µεταβλητή item χρησιµεύει για την αποθήκευση του στοιχείου που εισάγεται.

Αλγόριθμος  Εισαγωγή_σε_Ουρά  Δεδομένα  //  rear,  item  Αν  rear  <  size  τότε                rear  ←  rear  +  1                queue[rear]  ←  item                done  ←  Αληθής  αλλιώς     done  ←  Ψευδής  τέλος_αν  Αποτελέσματα  //  rear,  done  

Τέλος  Εισαγωγή_σε_Ουρά

Αλγόριθµος Εξαγωγής στοιχείου από ουρά Στον ακόλουθο αλγόριθµο χρησιµοποιείται µία λογική µεταβλητή, done, η οποία δηλώνει την επιτυχή εκτέλεσης της διαδικασίας. Η µεταβλητή front δηλώνει το δείκτη που δείχνει την πρώτη θέση της ουράς, που είναι ένας πίνακας queue µε µέγεθος size. Η µεταβλητή item χρησιµεύει για την αποθήκευση του στοιχείου που εξάγεται.

Αλγόριθμος  Εξαγωγή_από_Ουρά  Δεδομένα  //  rear,  front,  item  Αν  rear  <=  front  τότε                front  ←  front  +  1                item  ←  queue[rear                done  ←  Αληθής  αλλιώς     done  ←  Ψευδής  τέλος_αν  Αποτελέσματα  //  item,  rear,  front,  done  

Τέλος  Εξαγωγή_από_Ουρά Σηµείωση: Η συνθήκη rear <= front που εµφανίζεται στον αλγόριθµο ελέγχει αν η ουρά περιέχει στοιχεία. Η ισότητα ισχύει στην περίπτωση που η ουρά περιέχει µόνο ένα στοιχείο.

3.6 Λίστα Οι πίνακες, η στοίβα και η ουρά είναι στατικές δοµές δεδοµένων, δηλαδή έχουν σταθερό µέγεθος κατά τη διάρκεια της εκτέλεσης του προγράµµατος και οι διαδοχικοί κόµβοι (στοιχεία) αποθηκεύονται σε συνεχόµενες θέσεις µνήµης. Οι λίστες είναι δυναµικές δοµές δεδοµένων και το κύριο χαρακτηριστικό τους είναι ότι οι κόµβοι τους συνήθως βρίσκονται σε αποµακρυσµένες θέσεις µνήµης και η σύνδεση τους γίνεται µε δείκτες. Ο δείκτης (pointer) είναι ένας ιδιαίτερος τύπος που προσφέρεται από τις περισσότερες σύγχρονες γλώσσες προγραµµατισµού. Ο δείκτης δεν λαµβάνει αριθµητικές τιµές όπως ακέραιες, πραγµατικές κ.α, αλλά οι τιµές του είναι διευθύνσεις στην κύρια µνήµη και χρησιµοποιείται ακριβώς για τη σύνδεση των διαφόρων

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 19

στοιχείων µιας δοµής που είναι αποθηκευµένα σε µη συνεχόµενες θέσεις µνήµης. Συνήθως ο δείκτης είναι ένα πεδίο κάθε κόµβου της δοµής:

Δεδοµένα Δείκτης Το πεδίο Δεδοµένα µπορεί να περιέχει µία ή περισσότερες αλφαριθµητικές ή αριθµητικές πληροφορίες. Με τη χρήση των δεικτών διευκολύνονται οι λειτουργίες της εισαγωγής και της διαγραφής δεδοµένων στις λίστες. Οι απαιτούµενες ενέργειες για τη εισαγωγή του νέου κόµβου είναι ο δείκτης του δεύτερου κόµβου να δείχνει το νέο κόµβο και ο δείκτης του νέου κόµβου να δείχνει τον τρίτο κόµβο (δηλαδή να έχει πάρει την τιµή που είχε πριν την εισαγωγή ο δείκτης του δεύτερου κόµβου). Έτσι οι κόµβοι της λίστας διατηρούν τη λογική τους σειρά, αλλά οι φυσικές θέσεις στη µνήµη µπορεί να είναι τελείως διαφορετικές. Αντίστοιχα για τη διαγραφή ενός κόµβου αρκεί να αλλάξει τιµή ο δείκτης του προηγούµενου κόµβου και να δείχνει πλέον τον επόµενο αυτού που διαγράφηκε. Ο κόµβος που διαγράφηκε αποτελεί «άχρηστο δεδοµένο» και ο χώρος µνήµης που καταλάµβανε, παραχωρείται για άλλη χρήση.

Αλγόριθµος Εισαγωγής κόµβου σε λίστα Στον ακόλουθο αλγόριθµο θεωρούµε τη σύµβαση ότι αν p είναι ο δείκτης προς κάποιον κόµβο, τότε p.info είναι το περιεχόµενο του κόµβου (τα δεδοµένα δηλαδή ενός στοιχείου), και p.next είναι ο δείκτης του ίδιου κόµβου προς τον επόµενο κόµβο. Ο δείκτης q δείχνει τον κόµβο που πρόκειται να εισαχθεί στη λίστα µας.

Αλγόριθμος  Εισαγωγή_Κόμβου_σε_Λίστα  Δεδομένα  //  p:  δείκτης  του  κόμβου  μετά  τον  οποίο  θα  γίνει  η                    //  εισαγωγή  δεδομένων  του  νέου  κόμβου                    //  q:  δείκτης  της  θέσης  του  νέου  κόμβου  q.info  ←  data  q.next  ←  p.next  p.next  ←  q  

Τέλος  Εισαγωγή_Κόμβου_σε_Λίστα

Αλγόριθµος Διαγραφής κόµβου από λίστα Στον ακόλουθο αλγόριθµο θεωρούµε ότι µας δίνεται ο δείκτης p που δείχνει προς τον κόµβο, του οποίου ο επόµενος δια διαγραφεί, δηλαδή πρόκειται να διαγραφεί ο κόµβος που δείχνει το p.next.

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 20

Αλγόριθμος  Διαγραφή_Κόμβου_από_Λίστα  Δεδομένα  //  p:  δείκτης  του  κόμβου,  του  οποίου  ο  επόμενος                      //  θα  διαγραφεί  q  ←  p.next  p.next  ←  q.next  

Τέλος  Διαγραφή_Κόμβου_από_Λίστα

3.7 Αναδροµή Η τεχνική της αναδροµής στηρίζεται στη δυνατότητα µία διαδικασία ή συνάρτηση να καλεί τον εαυτό της.

Αλγόριθµος Υπολογισµού του Μέγιστου Κοινού Διαιρέτη (ΜΚΔ) Ένα ιστορικό πρόβληµα είναι η εύρεση του µέγιστου κοινού διαιρέτη δύο ακεραίων αριθµών. Ο αλγόριθµος εύρεσης του ΜΚΔ ανήκει στον Ευκλείδη. Ωστόσο η υλοποίηση του αλγορίθµου µπορεί να γίνει µε πολλούς τρόπους. Ο πρώτος που θα δείξουµε είναι ο πιο απλός αλλά και αργός αλγόριθµος. Ουσιαστικά λαµβάνει το µικρότερο από τους δύο ακεραίους, z, και εξετάζει µε τη σειρά όλους του ακέραιους ξεκινώντας από τον z και µειώνοντας συνεχώς κατά µία µονάδα µέχρι και οι δύο αριθµοί, x και y, να διαιρούνται από τη νέα τιµή του z.

Αλγόριθμος  Μέγιστος_Κοινός_Διαιρέτης  Δεδομένα  //  x,  y  Αν  x  <  y  τότε                z  ←  x  αλλιώς     z  ←  y  τέλος_αν  Όσο  (x  mod  z  <>  0)  Ή  (y  mod  z  <>  0)  επανάλαβε              z  ←  z  -­‐  1  τέλος_επανάληψης  Αποτελέσματα  //  z,  ότι  περιέχει  η  μεταβλητή  z  είναι  ο  ΜΚΔ  

Τέλος  Μέγιστος_Κοινός_Διαιρέτης

Αλγόριθµος Ευκλείδη για τον υπολογισµό του Μέγιστου Κοινού Διαιρέτη (ΜΚΔ) Ο αλγόριθµος που αποδίδεται στον Ευκλείδη βελτιώνει τον προηγούµενο αλγόριθµο, καθώς δεν εξετάζει µε τη σειρά όλους τους ακέραιους.

Αλγόριθμος  Ευκλείδης_ΜΚΔ  Δεδομένα  //  x,  y  z  ←  y  Όσο  z  <>  0  επανάλαβε              z  ←  x  mod  y              x  ←  y              y  ←  z  τέλος_επανάληψης  Αποτελέσματα  //  x,  ότι  περιέχει  η  μεταβλητή  x  είναι  ο  ΜΚΔ  

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

Αναδροµικός Αλγόριθµος Ευκλείδη για τον υπολογισµό του ΜΚΔ Ο αναδροµικός αλγόριθµος καλεί τον εαυτό του για να υπολογίσει τον ΜΚΔ.

Αλγόριθμος  Αναδρομικός_Ευκλείδης_ΜΚΔ  Δεδομένα  //  x,  y  z  ←  y  Αν  y  =  0  τότε                z  ←  x  αλλιώς     z  ←  Αναδρομικός_Ευκλείδης_ΜΚΔ(y,  x  mod  y)  τέλος_αν  Αποτελέσματα  //  z,  ότι  περιέχει  η  μεταβλητή  z  είναι  ο  ΜΚΔ  

Τέλος  Αναδρομικός_Ευκλείδης_ΜΚΔ

Αλγοριθµική και Δοµές Δεδοµένων Τεχνικός Δικτύων και Τηλεπικοινωνιών

Ελένη Χριστοπούλου – ΙΕΚ Κέρκυρας Σελίδα 21

Βιβλιογραφία

1. Ανάπτυξη εφαρµογών σε προγραµµατιστικό περιβάλλον (Γ΄ΓΕΛ) (http://ebooks.edu.gr/modules/ebook/show.php/DSGL-C101/36/198,1069/ )