Παρασκευή 1 Μαΐου 2026

Πολυπλοκότητα Αλγορίθμων – Πλήρης Οδηγός για ΑΕΠΠ (Big O)

Πολυπλοκότητα Αλγορίθμων - Big O notation

Πολυπλοκότητα Αλγορίθμων - Η σημειογραφία Big O είναι το βασικό εργαλείο ανάλυσης αλγορίθμων

Πολυπλοκότητα Αλγορίθμων – Ο Απόλυτος Οδηγός για το ΑΕΠΠ

Ένα από τα πιο κρίσιμα θέματα στο μάθημα Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον (ΑΕΠΠ) είναι η πολυπλοκότητα αλγορίθμων και η σημειογραφία Big O. Πολλοί μαθητές την αντιμετωπίζουν με φόβο, θεωρώντας την «μαθηματική» και δυσνόητη. Στην πραγματικότητα, όμως, η πολυπλοκότητα είναι ένα απλό και πανίσχυρο εργαλείο που μας λέει πόσο γρήγορα μεγαλώνει ο χρόνος εκτέλεσης ενός αλγορίθμου όσο αυξάνεται το μέγεθος των δεδομένων.

Σε αυτόν τον οδηγό θα εξηγήσουμε την πολυπλοκότητα αλγορίθμων (Big O) με απλά λόγια, θα δούμε πρακτικά παραδείγματα σε ΓΛΩΣΣΑ και θα μάθουμε πώς να υπολογίζουμε τη δική μας πολυπλοκότητα σε κάθε πρόγραμμα.

Τι είναι η πολυπλοκότητα αλγορίθμων;

Η πολυπλοκότητα αλγορίθμων (algorithm complexity) είναι ένα μέτρο που μας δείχνει πόσο αυξάνεται ο χρόνος εκτέλεσης ή η μνήμη που χρειάζεται ένας αλγόριθμος, όταν το μέγεθος του προβλήματος (n) μεγαλώνει.

Σκεφτείτε το ως εξής: Αν έχετε έναν αλγόριθμο που ταξινομεί 5 αριθμούς, θα τελειώσει σε χιλιοστά του δευτερολέπτου. Αν τον τρέξετε με 1.000.000 αριθμούς, θα τελειώσει σε λίγα δευτερόλεπτα, σε λεπτά ή σε χρόνια; Η πολυπλοκότητα μας δίνει ακριβώς αυτή την απάντηση.

💡 Απλά: Η πολυπλοκότητα δεν μας λέει τον ακριβή χρόνο σε δευτερόλεπτα. Μας λέει ποιο είναι το «σχήμα» της αύξησης — αν διπλασιάσουμε τα δεδομένα, ο χρόνος διπλασιάζεται, τετραπλασιάζεται, ή μένει ίδιος;

Η Σημειογραφία Big O

Η πιο διαδεδομένη σημειογραφία για την πολυπλοκότητα είναι η Big O notation (Ο-μεγάλο). Το γράμμα O σημαίνει Order (τάξη) και μας λέει ποια είναι η τάξη μεγέθους του χρόνου εκτέλεσης.

Για παράδειγμα, αν ένας αλγόριθμος έχει πολυπλοκότητα O(n²), αυτό σημαίνει ότι ο χρόνος εκτέλεσης αυξάνεται ανάλογα με το τετράγωνο του n (του πλήθους των δεδομένων).

Πώς διαβάζουμε τη Big O:

Σημειογραφία Διαβάζεται Σημαίνει
O(1) Ο-μεγάλο του ένα Σταθερός χρόνος — δεν εξαρτάται από το n
O(n) Ο-μεγάλο του εν Γραμμικός χρόνος — ανάλογα με το n
O(n²) Ο-μεγάλο του εν τετράγωνο Τετραγωνικός χρόνος — ανάλογα με το n²
O(log n) Ο-μεγάλο του λογάριθμος εν Λογαριθμικός χρόνος — πολύ αποδοτικός
O(n log n) Ο-μεγάλο του εν λογ εν Γραμμικολογαριθμικός — πολύ καλός
⚠️ Σημαντικό για ΑΕΠΠ: Στις Πανελλήνιες, συνήθως σας ζητείται να βρείτε τη χειρότερη περίπτωση (worst case) του αλγορίθμου. Αυτό σημαίνει ότι υπολογίζετε το μέγιστο χρόνο που μπορεί να πάρει ο αλγόριθμος.

Χρόνος Εκτέλεσης vs Χωρική Πολυπλοκότητα

Υπάρχουν δύο είδη πολυπλοκότητας που πρέπει να γνωρίζετε:

1. Χρονική Πολυπλοκότητα (Time Complexity)

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

2. Χωρική Πολυπλοκότητα (Space Complexity)

Μετράει πόση μνήμη (RAM) χρειάζεται ο αλγόριθμος για να τρέξει. Εξαρτάται από τον αριθμό των μεταβλητών και πινάκων που δημιουργούνται.

Παράδειγμα

Η ταξινόμηση φυσαλίδας (Bubble Sort) έχει:

  • Χρονική πολυπλοκότητα: O(n²) — γιατί χρησιμοποιεί 2 εμφωλευμένες επαναλήψεις
  • Χωρική πολυπλοκότητα: O(1) — γιατί χρησιμοποιεί μόνο μία βοηθητική μεταβλητή temp, ανεξάρτητα από το n

Τα Είδη Πολυπλοκότητας με Παραδείγματα

O(1) — Σταθερός Χρόνος (Constant Time)

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

Πρόγραμμα Σταθερός
Μεταβλητές
  Ακέραιες: n, x
Αρχή
  Διάβασε n
  x <- 2 * n
  Γράψε x
Τέλος_Προγράμματος

Αν το n είναι 5 ή 5.000.000, το πρόγραμμα κάνει πάντα 1 πολλαπλασιασμό. Η πολυπλοκότητα είναι O(1).

O(n) — Γραμμικός Χρόνος (Linear Time)

Ο χρόνος αυξάνεται ανάλογα με το n. Αν διπλασιάσουμε τα δεδομένα, διπλασιάζεται και ο χρόνος.

Πρόγραμμα Γραμμικός
Μεταβλητές
  Ακέραιες: n, i, sum
  Πίνακας: A[100]
Αρχή
  Διάβασε n
  sum <- 0
  Για i από 1 μέχρι n
    sum <- sum + A[i]
  Τέλος_επανάληψης
  Γράψε sum
Τέλος_Προγράμματος

Η επανάληψη τρέχει n φορές. Αν n = 10, τρέχει 10 φορές. Αν n = 1000, τρέχει 1000 φορές. Πολυπλοκότητα: O(n).

O(n²) — Τετραγωνικός Χρόνος (Quadratic Time)

Ο χρόνος αυξάνεται ανάλογα με το τετράγωνο του n. Αν διπλασιάσουμε τα δεδομένα, ο χρόνος τετραπλασιάζεται!

Πρόγραμμα Τετραγωνικός
Μεταβλητές
  Ακέραιες: n, i, j, count
Αρχή
  Διάβασε n
  count <- 0
  Για i από 1 μέχρι n
    Για j από 1 μέχρι n
      count <- count + 1
    Τέλος_επανάληψης
  Τέλος_επανάληψης
  Γράψε count
Τέλος_Προγράμματος

Η εσωτερική εντολή εκτελείται n × n = n² φορές. Πολυπλοκότητα: O(n²).

⚠️ Προσοχή: Αυτός είναι ο λόγος που οι αλγόριθμοι ταξινόμησης (Φυσαλίδα, Επιλογή, Εισαγωγή) είναι αργοί για μεγάλα n. Με n = 1000, το n² = 1.000.000 πράξεις!

O(log n) — Λογαριθμικός Χρόνος (Logarithmic Time)

Ο χρόνος αυξάνεται πολύ αργά. Αν διπλασιάσουμε τα δεδομένα, ο χρόνος αυξάνεται κατά 1 μονάδα!

Πρόγραμμα Λογαριθμικός
Μεταβλητές
  Ακέραιες: n, i
Αρχή
  Διάβασε n
  i <- n
  Όσο i >= 1 επανάλαβε    ! i μειώνεται στο μισό κάθε φορά
    Γράψε i
    i <- i / 2
  Τέλος_επανάληψης
Τέλος_Προγράμματος

Αν n = 64, οι τιμές του i θα είναι: 64 → 32 → 16 → 8 → 4 → 2 → 1. Δηλαδή 7 επαναλήψεις. Αν n = 128, θα είναι 8 επαναλήψεις. Πολυπλοκότητα: O(log n).

💡 Μνημονικό: Το O(log n) είναι σαν να «κόβετε» το πρόβλημα στα δύο σε κάθε βήμα — πολύ αποδοτικό!

Παραδείγματα σε ΓΛΩΣΣΑ

Παράδειγμα 1: Εύρεση Μέγιστου — O(n)

Πρόγραμμα Μέγιστο
Μεταβλητές
  Ακέραιες: n, i, max
  Πίνακας: A[100]
Αρχή
  Διάβασε n

  Για i από 1 μέχρι n
    Διάβασε A[i]
  Τέλος_επανάληψης

  max <- A[1]
  Για i από 2 μέχρι n
    Αν A[i] > max τότε
      max <- A[i]
    Τέλος_αν
  Τέλος_επανάληψης
  Γράψε max
Τέλος_Προγράμματος

Ανάλυση: Η δεύτερη επανάληψη τρέχει n-1 φορές. Αγνοούμε τις σταθερές και τα χαμηλότερα βαθμώδη. Πολυπλοκότητα: O(n).

Παράδειγμα 2: Ταξινόμηση Φυσαλίδας — O(n²)

Πρόγραμμα Φυσαλίδα_Πολυπλοκότητα
Μεταβλητές
  Ακέραιες: n, i, j, temp
  Πίνακας: table[100]
Αρχή
  Διάβασε n

  Για i από 1 μέχρι n
    Διάβασε table[i]
  Τέλος_επανάληψης

  ! Ταξινόμηση φυσαλίδας
  Για i από 2 μέχρι n
    Για j από n μέχρι i με_βήμα -1
      Αν table[j-1] > table[j] τότε
        temp <- table[j-1]
        table[j-1] <- table[j]
        table[j] <- temp
      Τέλος_αν
    Τέλος_επανάληψης
  Τέλος_επανάληψης
Τέλος_Προγράμματος

Ανάλυση: Η εξωτερική επανάληψη τρέχει ~n φορές. Η εσωτερική τρέχει έως n φορές. Συνολικά: n × n = O(n²).

Πώς Υπολογίζω την Πολυπλοκότητα; — 4 Απλά Βήματα

Οδηγός Βήμα-Βήμα

  1. Βρες το n: Τι είναι το μέγεθος εισόδου; (πλήθος στοιχείων πίνακα, ψηφία αριθμού, κλπ.)
  2. Μέτρα τις επαναλήψεις: Πόσες φορές εκτελείται η «βασική εντολή»;
  3. Κράτα μόνο το κυρίαρχο όρο: Αν έχεις 3n² + 5n + 10, κρατάς μόνο το n²
  4. Αγνόησε τις σταθερές: Το 3n² γίνεται απλά n² → O(n²)

Παραδείγματα υπολογισμού:

Συνάρτηση χρόνου Κυρίαρχος όρος Big O
3n² + 2n + 100 3n² O(n²)
5n + 20 5n O(n)
n³ + 100n² + 50 O(n³)
2n log n + 5n 2n log n O(n log n)
100 (σταθερά) 100 O(1)
💡 Κανόνας αντίχειρας: Αν έχεις 1 επανάληψηO(n). Αν έχεις 2 εμφωλευμένεςO(n²). Αν έχεις 3 εμφωλευμένεςO(n³). Αν διαιρείς το n στο μισό σε κάθε βήμα → O(log n).

Ένα πρακτικό παράδειγμα εφαρμογής της πολυπλοκότητας είναι οι αλγόριθμοι ταξινόμησης (Φυσαλίδα, Επιλογή, Εισαγωγή). Δείτε τον αναλυτικό οδηγό μας: Αλγόριθμοι Ταξινόμησης για το ΑΕΠΠ.

Σύγκριση Αλγορίθμων Ταξινόμησης

Αλγόριθμος Καλύτερη Μέση Χειρότερη Μνήμη
Φυσαλίδα O(n) O(n²) O(n²) O(1)
Επιλογή O(n²) O(n²) O(n²) O(1)
Εισαγωγή O(n) O(n²) O(n²) O(1)
Γρήγορη (Quick) O(n log n) O(n log n) O(n²) O(log n)

Πρακτικό Παράδειγμα

Αν έχουμε n = 1000 στοιχεία:

  • O(n) = 1.000 πράξεις ✅
  • O(n log n) ≈ 10.000 πράξεις ✅
  • O(n²) = 1.000.000 πράξεις ⚠️
  • O(n³) = 1.000.000.000 πράξεις ❌

Tips για Πανελλήνιες

  • ✍️ Μέτρα μόνο τις επαναλήψεις: Οι απλές εντολές (εκχώρηση, είσοδος/έξοδος) είναι O(1) και δεν τις μετράμε.
  • 🔍 Πρόσεχε τα βήματα: Αν μια επανάληψη έχει με_βήμα 2, ο αριθμός επαναλήψεων είναι n/2, άρα παραμένει O(n).
  • 📉 Λογαριθμικό = Διαίρεση στο μισό: Όταν δείτε i <- i / 2 ή i <- i * 2, σκεφτείτε O(log n).
  • 🧮 Εμφωλευμένες = Πολλαπλασιασμός: Αν η μία τρέχει n φορές και η άλλη m φορές, το συνολικό είναι n × m.
  • 📌 Ξεχώρισε χρόνο από μνήμη: Η χρονική πολυπλοκότητα εξαρτάται από επαναλήψεις. Η χωρική από μεταβλητές/πίνακες.
  • 🎯 Αγνόησε σταθερές: Το 3n² + 5n + 10 είναι πάντα O(n²).

Συχνές Ερωτήσεις (FAQ)

Τι σημαίνει «κυρίαρχος όρος»;

Ο κυρίαρχος όρος είναι ο όρος που μεγαλώνει πιο γρήγορα όσο το n αυξάνεται. Για παράδειγμα, στο 3n² + 5n + 10, ο n² μεγαλώνει πολύ πιο γρήγορα από τον n και τη σταθερά. Άρα, ο n² είναι ο κυρίαρχος.

Γιατί αγνοούμε τις σταθερές;

Γιατί η Big O μας ενδιαφέρει για το σχήμα της αύξησης, όχι για την ακριβή ταχύτητα. Με n = 1.000.000, η διαφορά μεταξύ 2n και 5n είναι ασήμαντη μπροστά στο n². Οι σταθερές εξαρτώνται από τον υπολογιστή, όχι από τον αλγόριθμο.

Ποια περίπτωση μετράω; Καλύτερη, μέση ή χειρότερη;

Στο ΑΕΠΠ και γενικά στην ανάλυση αλγορίθμων, υπολογίζουμε συνήθως τη χειρότερη περίπτωση (worst case). Αυτό μας δίνει ένα ασφαλές άνω όριο για τον χρόνο εκτέλεσης.

Τι είναι η χωρική πολυπλοκότητα O(1);

Σημαίνει ότι ο αλγόριθμος χρησιμοποιεί σταθερή μνήμη, ανεξάρτητα από το n. Για παράδειγμα, η ταξινόμηση φυσαλίδας χρειάζεται μόνο μία μεταβλητή temp για ανταλλαγές — άρα O(1) μνήμη.

Μπορώ να έχω O(n) χρόνο με O(n²) μνήμη;

Ναι! Η χρονική και η χωρική πολυπλοκότητα είναι ανεξάρτητες. Μπορεί ένας αλγόριθμος να είναι γρήγορος (O(n)) αλλά να «τρώει» πολύ μνήμη (O(n²)), ή το αντίστροφο.

Συμπέρασμα

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

Με λίγη εξάσκηση, θα μπορείτε να κοιτάτε έναν αλγόριθμο και να λέτε αμέσως: «Αυτός είναι O(n)», «Αυτός είναι O(n²)» ή «Εδώ έχουμε O(log n)». Και αυτή η ικανότητα είναι χρήσιμη όχι μόνο για τις Πανελλήνιες, αλλά και για κάθε προγραμματιστή που θέλει να γράφει αποδοτικό κώδικα.


#ΠολυπλοκότηταΑλγορίθμων #BigO #ΑΕΠΠ #ΓΛΩΣΣΑ #Πανελλήνιες #Αλγόριθμοι #ΧρονικήΠολυπλοκότητα

Δεν υπάρχουν σχόλια :

Δημοσίευση σχολίου