Junior
Μίλησε για τις κατακερματιστικές πίνακες και το βασικό τους αρχή λειτουργίας.
sobes.tech AI
Απάντηση από AI
Ο πίνακας κατακερματισμού (hash map) είναι μια δομή δεδομένων που υλοποιεί έναν συσχετιστικό πίνακα, αντιστοιχίζοντας κλειδιά σε τιμές.
Βασική αρχή λειτουργίας:
- Κατακερματισμός: Για κάθε κλειδί, υπολογίζεται ένας κωδικός κατακερματισμού (hash code) — μια αριθμητική τιμή σταθερού μεγέθους με τη βοήθεια μιας συνάρτησης κατακερματισμού. Μια καλή συνάρτηση κατακερματισμού διανέμει ομοιόμορφα τους κωδικούς hash σε όλο το εύρος εξόδων.
- Δείκτης: Ο υπολογισμένος κωδικός hash χρησιμοποιείται για τον προσδιορισμό του δείκτη (θέσης) στον πίνακα όπου θα αποθηκευτεί η αντίστοιχη τιμή. Συχνά,
hash(key) % μέγεθος_πίνακαδίνει τον τελικό δείκτη. - Αποθήκευση: Στον πίνακα, στον υπολογισμένο δείκτη, αποθηκεύεται ένα ζεύγος (κλειδί, τιμή).
- Αναζήτηση: Για να βρεθεί μια τιμή με βάση το κλειδί, επαναυπολογίζεται ο κωδικός hash του κλειδιού, προσδιορίζεται ο δείκτης και από αυτόν λαμβάνεται η τιμή.
- Συγκρούσεις: Προκύπτουν όταν διαφορετικά κλειδιά έχουν τον ίδιο κωδικό 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"