Σίγουρα έχεις ακούσει την έννοια “αλγόριθμος”. Η λέξη “αλγόριθμος” συχνά αντιμετωπίζεται ως αφηρημένη έννοια, σαν κάτι σύνθετο και σχετικό με τα μαθηματικά. Στην πραγματικότητα όμως είναι κάτι πολύ πιο απλό.
Τι είναι Αλγόριθμος
Για να ορίσεις ένα αλγόριθμο χρειάζεσαι μία αρχική και μία τελική κατάσταση.
Ο Αλγόριθμος είναι μια σειρά από εντολές που σε πάνε από μία αρχική σε μία τελική κατάσταση.
Η αρχική κατάσταση λέγεται είσοδος (input) του αλγορίθμου.
Η τελική κατάσταση λέγεται έξοδος (output) του αλγορίθμου.
![ορισμός](http://images.ctfassets.net/i9fio8fr0de4/2nBkFBwZOXOdqtW7ngWSOS/32b594962b153f44f5252e914739ff1c/____________________.webp)
Παράδειγμα Αλγορίθμου
Έστω ότι ξυπνάς το πρωί και θες να πιεις χυμό πορτοκάλι.
Αρχική κατάσταση (Input): Θες να πιεις χυμό πορτοκάλι.
Τελική κατάσταση (Output): Έχεις ένα ποτήρι χυμό πορτοκάλι στα χέρια σου.
Αλγόριθμος:
Ετοιμασία υλικών:
Βρες δύο ή περισσότερα ώριμα πορτοκάλια.
Βρες ένα στίφτη.
Βρες ένα ποτήρι ή ένα δοχείο για να συλλέξεις τον χυμό.
Προετοιμασία των πορτοκαλιών:
Κόψε τα πορτοκάλια στη μέση οριζόντια (από τον μίσχο προς τη βάση).
Στύψιμο:
Πάρε το μισό πορτοκάλι και τοποθέτησέ το στο στίφτη.
Άσκησε πίεση πιέζοντας και περιστρέφοντας το πορτοκάλι επάνω στο στίφτη, ώστε να βγει όσο περισσότερος χυμός γίνεται.
Επανάλαβε τη διαδικασία για το άλλο μισό πορτοκάλι και για όλα τα πορτοκάλια που έχεις.
Συλλογή χυμού:
Άδειασε το δοχείο του στίφτη με τον χυμό στο ποτήρι σου.
Άρα ο αλγόριθμος είναι η διαδικασία που σε οδηγεί από την αρχική (πορτοκάλια) στην τελική (χυμός πορτοκάλι) κατάσταση.
Γιατί Χρειαζόμαστε τους Αλγόριθμους
Οι αλγόριθμοι είναι χρήσιμοι γιατί μας προσφέρουν λύσεις σε προβλήματα.
Είτε θες να φτιάξεις ένα γλυκό, είτε να δέσεις τα κορδόνια σου, είτε να ταξινομήσεις αριθμούς από τον μικρότερο στο μεγαλύτερο χρειάζεσαι αλγόριθμο.
Εφόσον κάποιος δημιουργήσει ένα αλγόριθμο μπορεί να μοιραστεί την λύση μαζί σου. Έτσι δεν χρειάζεται να λύσουμε όλοι το ίδιο πρόβλημα και μπορούμε να χρησιμοποιήσουμε την καλύτερη λύση.
Αυτό είναι ιδιαίτερα χρήσιμο στην επιστήμη των υπολογιστών που οι αλγόριθμοι έχουν τον πιο καθοριστικό ρόλο. Για παράδειγμα o αλγόριθμος που ταξινομεί αριθμούς αποδοτικά, χρησιμοποιείται καθημερινά δισσεκατομύρια φορές από υπολογιστικά συστήματα.
Πότε ένας Αλγόριθμος είναι Καλός
Ένας καλός αλγόριθμος κάνει τα παρακάτω:
Λύνει σωστά το πρόβλημα. Πρέπει να μας δίνει το σωστό αποτέλεσμα (output) για κάθε πιθανή είσοδο (Input).
Είναι αποδοτικός. Στον προγραμματισμό, η αποδοτικότητα είναι κρίσιμη. Σκέψου πως ένας αλγόριθμος μπορεί να εκτελείται εκατομμύρια φορές καθημερινά. Μετράμε την αποδοτικότητα σε χρονική (πόσο αυξάνεται ο χρόνος εκτέλεσης σε σχέση με το μέγεθος της εισόδου) και χωρική (πόση μνήμη χρησιμοποίει).
Μπορεί να χρησιμοποιηθεί σε κλίμακα. Ο αλγόριθμος μπορεί να δουλέψει αποδοτικά και γρήγορα για μικρές και μεγάλες εισόδους. Για παράδειγμα ο αλγόριθμος ταξινόμησης δουλεύει γρήγορα και σωστά για 2 αριθμούς και για 2.000.000 αριθμούς.
Αλγόριθμοι που χρησιμοποιείς Καθημερινά
Παρακάτω είναι παραδείγματα αλγορίθμων που χρησιμοποιείς καθημερινά.
Djikstra. Ο αλγόριθμος βρίσκει το συντομότερο από όλα τα πιθανά μονοπάτια για να πας από το σημείο Α στο σημείο Β. Τον χρησιμοποιούν τα συστήματα πλοήγησης που χρησιμοποιείς καθημερινά.
Αλγόριθμοι κρυπτογραφίας: Χρησιμοποιούνται για να κρατάνε τα προσωπικά σου δεδομένα σου ασφαλή. Είτε πρόκειται για τις συνομιλίες σου στα social είτε για το e-banking σου.
Pagerank: Είναι ο αλγόριθμος που χρησιμοποιεί η Google για να κατατάξει τις ιστοσελίδες στην αναζήτηση σου.
Αλγόριθμοι προτάσεων: Αναλύουν την συμπεριφορά σου και τις προτιμήσεις σου για να κάνουν προτάσεις. Τους χρησιμοποιεί το Netflix για να σου προτείνει την σειρές, το Spotify για να σου προτείνει τραγούδια και τα e-shops για σου προτείνουν σχετικά προϊόντα.
Αλγόριθμοι αναγνώρισης προσώπου: Σου επιτρέπουν να ξεκλειδώνεις το κινητό σου με το πρόσωπο σου (faceID).
Αλγόριθμοι Social Media: Χρησιμοποιούνται από τις πλατφόρμες κοινωνικής δικτύωσης για να αποφασίσουν τι θα δεις στην αρχική σου.
Αλγόριθμοι πρόβλεψης καιρού: Αναλύουν ιστορικά δεδομένα και παρούσες καιρικές συνθήκες ώστε να βρουν μοτίβα και να προβλέψουν με ακρίβεια τον καιρό το επόμενο διάστημα.
![αλγόριθμος](http://images.ctfassets.net/i9fio8fr0de4/zeERhtwe6OKY0bR3sLxuz/a5fffb7bec15470f91d9309f570708d0/algorithms.webp)
Τι είναι ένας Αλγόριθμος στον Προγραμματισμό
Στον προγραμματισμό ο αλγόριθμος είναι μία σειρά από καλώς ορισμένες οδηγίες που μας οδηγούν από μία αρχική σε μία τελική κατάσταση. Ο ορισμός είναι ίδιος με αυτόν που αναλύσαμε παραπάνω.
Η μόνη διαφορά είναι πως στον προγραμματισμό οι αλγόριθμοι εκτελούνται από υπολογιστές. Ο σκοπός τους ποικίλει από υπολογισμούς απλών δεδομένων μέχρι λύσεις σύνθετων προβλημάτων.
Οι αλγόριθμοι γράφονται σε Γλώσσες Προγραμματισμού όπως Python, Java, C++ κτλ. Μόνο έτσι, να μπορούν να τους καταλάβουν οι υπολογιστές. Κάθε γλώσσα προγραμματισμού έχει την δική της σύνταξη και γραμματική αλλά η λογική είναι ίδια.
Οι αλγόριθμοι αποτελούν τον πυλώνα του λογισμικού. Είναι υπεύθυνοι για λειτουργικότητα και την αποδοτικότητα των προγραμμάτων.
Τεχνικές Σχεδιασμού Αλγορίθμων
Όνομα | Μέθοδος | Παράδειγμα |
Brute Force | Δοκιμάζει όλες τις πιθανές λύσεις | Hacking Κωδικών |
Αναδρομή | Μετατρέπει το πρόβλημα σε αναδρομική σχέση | Υπολογισμός παραγοντικού |
Κατακερματισμός | Χρησιμοποιεί συνάρτηση κατακερματισμού | Γρήγορη αναζήτηση |
Διαίρει και βασίλευε | Χωρίζει το πρόβλημα σε υποπροβλήματα | Ταξινόμιση |
Άπληστο κριτήριο | Βρίσκει εύκολη λύση | Συντομότερο μονοπάτι |
Δυναμικός Προγραμματισμός | Αποθηκεύει επανειλημμένους υπολογισμούς | Ακολουθία Fibonacci |
Τυχαιότητα | Χρησιμοποιεί τυχαιότητα | Μέθοδοι Monte Carlo |
Brute Force (Ωμή Δύναμη): Ο αλγόριθμος δοκιμάζει όλες τις πιθανές λύσεις μέχρι να βρει την σωστή. Εύκολο να τον σκεφτείς και να τον κατανοήσεις. Όσο περισσότερες είναι οι πιθανές λύσεις τόσο πιο αργός γίνεται ο αλγόριθμος.
Αναδρομή: Ο αλγόριθμος σπάει το πρόβλημα σε μικρότερα τα οποία λύνει με βάση μια αναδρομική σχέση.
Κατακερματισμός (Hashing): Ο αλγόριθμος μετατρέπει τα δεδομένα σε μία τιμή με βάση μια συνάρτηση κατακερματισμού. Με αυτή την μετατροπή μπορούμε να βρίσκουμε και να αλλάζουμε γρήγορα τα δεδομένα. Χρησιμοποιούνται συχνά σε βάσεις δεδομένων.
Διαίρει και βασίλευε (Divide and Conquer): Ο αλγόριθμος σπάει το πρόβλημα σε μικρότερα υπο-προβλήματα. Έπειτα, λύνει το καθένα ξεχωριστά και στο τέλος συνδυάζει τις λύσεις για να βρει την λύση σε ολόκληρο το πρόβλημα.
Άπληστο κριτήριο: Ο αλγόριθμοςλύνει γρήγορα το πρόβλημα χρησιμοποιειόντας ένα άπληστο κριτήριο. Έτσι,δεν χρειάζεται να εξετάσει όλα τα ενδεχόμενα. Σκέψου το σαν τον "έξυπνο" τρόπο να κάνεις κάτι. Οι άπληστοι αλγόριθμοι είναι πολύ αποδοτικοί. Όμως, δεν υπάρχει άπληστο κριτήριο και επομένως άπληστος αλγόριθμος για κάθε πρόβλημα.
Δυναμικός Προγραμματισμός: Οι αλγόριθμοι δυναμικού προγραμματισμού αποθηκεύουν υπολογισμούς που προκύπτουν επανειλημμένα κατά την λύση του προβλήματος. Έτσι, την δεύτερη φορά που προκύπτει ο ίδιος υπολογισμός γλυτώνουν χρόνο παίρνοντας έτοιμη την λύση.
Τυχαιότητα: Ο αλγόριθμος χρησιμοποιεί τυχαιότητα για να βρει λύση. Γίνεται σε πρόβληματα που επαρκούν απαντήσεις με μεγάλη πιθανότητα.