@@ -38,6 +38,7 @@ struct map {
38
38
MapNode array ; // Ο πίνακας που θα χρησιμοποιήσουμε για το map (remember, φτιάχνουμε ένα hash table)
39
39
int capacity ; // Πόσο χώρο έχουμε δεσμεύσει.
40
40
int size ; // Πόσα στοιχεία έχουμε προσθέσει
41
+ int deleted ; // Πόσα κελιά είναι DELETED
41
42
CompareFunc compare ; // Συνάρτηση για σύγκριση δεικτών, που πρέπει να δίνεται απο τον χρήστη
42
43
HashFunc hash_function ; // Συνάρτηση για να παίρνουμε το hash code του κάθε αντικειμένου.
43
44
DestroyFunc destroy_key ; // Συναρτήσεις που καλούνται όταν διαγράφουμε έναν κόμβο απο το map.
@@ -56,6 +57,7 @@ Map map_create(CompareFunc compare, DestroyFunc destroy_key, DestroyFunc destroy
56
57
map -> array [i ].state = EMPTY ;
57
58
58
59
map -> size = 0 ;
60
+ map -> deleted = 0 ;
59
61
map -> compare = compare ;
60
62
map -> destroy_key = destroy_key ;
61
63
map -> destroy_value = destroy_value ;
@@ -141,15 +143,19 @@ void map_insert(Map map, Pointer key, Pointer value) {
141
143
} else {
142
144
// Νέο στοιχείο, αυξάνουμε τα συνολικά στοιχεία του map
143
145
map -> size ++ ;
146
+
147
+ if (node -> state == DELETED ) // αν βρήκαμε DELETED, θα αλλάξει σε OCCUPIED
148
+ map -> deleted -- ;
144
149
}
145
150
146
151
// Προσθήκη τιμών στον κόμβο
147
152
node -> state = OCCUPIED ;
148
153
node -> key = key ;
149
154
node -> value = value ;
150
155
151
- // Αν με την νέα εισαγωγή ξεπερνάμε το μέγιστο load factor, πρέπει να κάνουμε rehash
152
- float load_factor = (float )map -> size / map -> capacity ;
156
+ // Αν με την νέα εισαγωγή ξεπερνάμε το μέγιστο load factor, πρέπει να κάνουμε rehash.
157
+ // Στο load factor μετράμε και τα DELETED, γιατί και αυτά επηρρεάζουν τις αναζητήσεις.
158
+ float load_factor = (float )(map -> size + map -> deleted ) / map -> capacity ;
153
159
if (load_factor > MAX_LOAD_FACTOR )
154
160
rehash (map );
155
161
}
@@ -168,6 +174,7 @@ bool map_remove(Map map, Pointer key) {
168
174
169
175
// θέτουμε ως "deleted", ώστε να μην διακόπτεται η αναζήτηση, αλλά ταυτόχρονα να γίνεται ομαλά η εισαγωγή
170
176
node -> state = DELETED ;
177
+ map -> deleted ++ ;
171
178
map -> size -- ;
172
179
173
180
return true;
0 commit comments