Junior — Middle
Ποια μέθοδοι μπορούν να χρησιμοποιηθούν για να μειωθεί η πιθανότητα συγκρούσεων κατά τη χρήση πινάκων κατακερματισμού;
sobes.tech AI
Απάντηση από AI
Για τη μείωση της πιθανότητας συγκρούσεων στους πίνακες κατακερματισμού, εφαρμόζονται οι ακόλουθες μέθοδοι:
-
Επιλογή καλής συνάρτησης κατακερματισμού — η συνάρτηση πρέπει να διανέμει ομοιόμορφα τα κλειδιά στον πίνακα, ελαχιστοποιώντας την πιθανότητα συγκρούσεων.
-
Αύξηση του μεγέθους του πίνακα — όσο μεγαλύτερος είναι ο πίνακας, τόσο μικρότερη είναι η πιθανότητα δύο κλειδιά να καταλήξουν στο ίδιο κελί.
-
Χρήση μεθόδων επίλυσης συγκρούσεων:
- Ανοιχτή διεύθυνση (γραμμική αναζήτηση, τετραγωνική αναζήτηση, διπλό κατακερματισμό) — σε περίπτωση σύγκρουσης, αναζητείται το επόμενο ελεύθερο κελί.
- Αλυσίδες (chaining) — σε κάθε κελί αποθηκεύεται μια συνδεδεμένη λίστα ή άλλο κοντέινερ για όλα τα στοιχεία με το ίδιο hash.
-
Rehashing (αλλαγή μεγέθους) — όταν επιτευχθεί ένας ορισμένος παράγοντας φόρτωσης, το μέγεθος αυξάνεται και τα στοιχεία αναδιανέμονται.
Παράδειγμα σε Kotlin (αλυσίδες):
class HashTable<K, V>(val size: Int) {
private val buckets = Array<MutableList<Pair<K, V>>>(size) { mutableListOf() }
private fun hash(key: K): Int = key.hashCode().absoluteValue % size
fun put(key: K, value: V) {
val index = hash(key)
val bucket = buckets[index]
val existing = bucket.indexOfFirst { it.first == key }
if (existing >= 0) bucket[existing] = key to value
else bucket.add(key to value)
}
fun get(key: K): V? {
val index = hash(key)
return buckets[index].firstOrNull { it.first == key }?.second
}
}