Sobes.tech
Junior

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

sobes.tech AI

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

Ο πίνακας κατακερματισμού (hash map) είναι μια δομή δεδομένων που υλοποιεί έναν συσχετιστικό πίνακα, αντιστοιχίζοντας κλειδιά σε τιμές.

Βασική αρχή λειτουργίας:

  1. Κατακερματισμός: Για κάθε κλειδί, υπολογίζεται ένας κωδικός κατακερματισμού (hash code) — μια αριθμητική τιμή σταθερού μεγέθους με τη βοήθεια μιας συνάρτησης κατακερματισμού. Μια καλή συνάρτηση κατακερματισμού διανέμει ομοιόμορφα τους κωδικούς hash σε όλο το εύρος εξόδων.
  2. Δείκτης: Ο υπολογισμένος κωδικός hash χρησιμοποιείται για τον προσδιορισμό του δείκτη (θέσης) στον πίνακα όπου θα αποθηκευτεί η αντίστοιχη τιμή. Συχνά, hash(key) % μέγεθος_πίνακα δίνει τον τελικό δείκτη.
  3. Αποθήκευση: Στον πίνακα, στον υπολογισμένο δείκτη, αποθηκεύεται ένα ζεύγος (κλειδί, τιμή).
  4. Αναζήτηση: Για να βρεθεί μια τιμή με βάση το κλειδί, επαναυπολογίζεται ο κωδικός hash του κλειδιού, προσδιορίζεται ο δείκτης και από αυτόν λαμβάνεται η τιμή.
  5. Συγκρούσεις: Προκύπτουν όταν διαφορετικά κλειδιά έχουν τον ίδιο κωδικό hash. Υπάρχουν διάφορες μέθοδοι για την επίλυση συγκρούσεων:
    • Αποσύνδεση με αλυσίδα (Separate Chaining): Σε κάθε δείκτη του πίνακα διατηρείται μια λίστα (ή άλλη δομή δεδομένων) που περιέχει όλα τα ζεύγη (κλειδί, τιμή) των οποίων οι κωδικοί hash οδηγούν σε αυτόν τον δείκτη.
    • Ανοιχτός προσδιορισμός (Open Addressing): Όταν προκύψει σύγκρουση, αναζητείται άλλο ελεύθερο σημείο στον πίνακα σύμφωνα με έναν κανόνα (γραμμική, τετραγωνική, διπλή κατακερματισμός).

Πλεονεκτήματα:

  • Κατά μέσο όρο, οι λειτουργίες εισαγωγής, διαγραφής και αναζήτησης έχουν πολυπλοκότητα O(1), αν η συνάρτηση hash είναι καλή και οι συγκρούσεις είναι σπάνιες.

Μειονεκτήματα:

  • Η χειρότερη περίπτωση απόδοσης μπορεί να είναι O(n), αν όλα τα κλειδιά κατακερματίζονται στον ίδιο δείκτη (π.χ., με κακή συνάρτηση hash ή πολλαπλές συγκρούσεις).
  • Απαιτεί επιπλέον μνήμη για τον πίνακα και πιθανώς για την επίλυση συγκρούσεων.

Στη Swift, οι πίνακες κατακερματισμού υλοποιούνται με τον τύπο Dictionary.

// Παράδειγμα χρήσης του Dictionary στη Swift
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]

// Πρόσβαση μέσω κλειδιού
let value = myDictionary["banana"] // Παίρνει Optional(2)

// Προσθήκη/ενημέρωση
myDictionary["grape"] = 4 // Προσθέτει νέο ζεύγος
myDictionary["apple"] = 10 // Ενημερώνει την τιμή για το κλειδί "apple"

// Διαγραφή
myDictionary["orange"] = nil // Διαγράφει το ζεύγος με κλειδί "orange"