Sobes.tech
Junior

Πώς είναι δομημένοι οι πίνακες στον προγραμματισμό;

sobes.tech AI

Απάντηση από AI

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

Βασικά χαρακτηριστικά:

  • Δεικτοδότηση: Η πρόσβαση στα στοιχεία γίνεται μέσω δείκτη που ξεκινά από το 0. Ο δείκτης δείχνει την απόκλιση από την αρχή του πίνακα.
  • Μέγεθος: Το μέγεθος του πίνακα (αριθμός στοιχείων) είναι σταθερό κατά τη δημιουργία του σε γλώσσες με στατικό τύπο ή μπορεί να αλλάξει δυναμικά σε γλώσσες με δυναμικό τύπο (π.χ., Swift Array).
  • Τύπος δεδομένων: Όλα τα στοιχεία του πίνακα πρέπει να έχουν τον ίδιο τύπο δεδομένων.
  • Συγκεκριμένη διαδοχή: Η αποθήκευση των στοιχείων σε γειτονικά κυττάρα μνήμης εξασφαλίζει γρήγορη πρόσβαση σε οποιοδήποτε στοιχείο μέσω του δείκτη του.

Λειτουργίες:

  • Πρόσβαση μέσω δείκτη: O(1) - σταθερός χρόνος.
  • Προσθήκη/διαγραφή στο τέλος: O(1) κατά μέσο όρο για δυναμικούς πίνακες (Swift Array).
  • Προσθήκη/διαγραφή στην αρχή ή στη μέση: O(n) - γραμμικός χρόνος, καθώς μπορεί να χρειαστεί μετατόπιση των στοιχείων.

Παράδειγμα σε Swift:

// Δημιουργία πίνακα συμβολοσειρών
var names: [String] = ["Alice", "Bob", "Charlie"]

// Πρόσβαση σε στοιχείο μέσω δείκτη
let first_name = names[0] // "Alice"

// Προσθήκη στοιχείου
names.append("David") // ["Alice", "Bob", "Charlie", "David"]

// Διαγραφή στοιχείου
names.remove(at: 1) // ["Alice", "Charlie", "David"]

// Επανάληψη στον πίνακα
for name in names {
    print(name)
}

Εσωτερική δομή (για δυναμικούς πίνακες τύπου Swift Array):

Οι δυναμικοί πίνακες υλοποιούνται συνήθως πάνω σε στατικά εκχωρημένο buffer μνήμης. Όταν η χωρητικότητα του buffer φτάσει, εκχωρείται ένας νέος μεγαλύτερος buffer και αντιγράφονται τα παλιά στοιχεία (reallocation). Αυτό εξασφαλίζει μια αποσβεσμένη πολυπλοκότητα O(1) για την προσθήκη στο τέλος.