Skip to content

Commit 655c41d

Browse files
committed
Handle the update of an element that had collided with a deleted item
1 parent e519ae2 commit 655c41d

File tree

6 files changed

+12
-9
lines changed

6 files changed

+12
-9
lines changed

hashtable/02_linear_probing/hashtable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ def __delitem__(self, key):
4343

4444
def __setitem__(self, key, value):
4545
for index, pair in self._probe(key):
46-
if pair in (None, DELETED) or pair.key == key:
46+
if pair is DELETED: continue
47+
if pair is None or pair.key == key:
4748
self._slots[index] = Pair(key, value)
4849
break
4950
else:

hashtable/02_linear_probing/test_hashtable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ def test_should_wrap_index_around_when_collides(mock_hash):
333333
assert hash_table._slots[0] == (False, True)
334334

335335

336-
def test_should_overwrite_deleted(hash_table):
336+
def test_should_not_overwrite_deleted(hash_table):
337337
del hash_table["hola"]
338338
deleted_slot = hash_table._slots.index(DELETED)
339339

@@ -344,7 +344,7 @@ def test_should_overwrite_deleted(hash_table):
344344
hash_table["gracias"] = "thank you"
345345

346346
assert len(hash_table) == 3
347-
assert DELETED not in hash_table._slots
347+
assert DELETED in hash_table._slots
348348

349349

350350
def test_should_raise_memory_error_when_not_enough_capacity():

hashtable/03_autoresize/hashtable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ def __delitem__(self, key):
4343

4444
def __setitem__(self, key, value):
4545
for index, pair in self._probe(key):
46-
if pair in (None, DELETED) or pair.key == key:
46+
if pair is DELETED: continue
47+
if pair is None or pair.key == key:
4748
self._slots[index] = Pair(key, value)
4849
break
4950
else:

hashtable/03_autoresize/test_hashtable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def test_should_wrap_index_around_when_collides(mock_hash):
337337
assert hash_table._slots[0] == (False, True)
338338

339339

340-
def test_should_overwrite_deleted(hash_table):
340+
def test_should_not_overwrite_deleted(hash_table):
341341
del hash_table["hola"]
342342
deleted_slot = hash_table._slots.index(DELETED)
343343

@@ -348,7 +348,7 @@ def test_should_overwrite_deleted(hash_table):
348348
hash_table["gracias"] = "thank you"
349349

350350
assert len(hash_table) == 3
351-
assert DELETED not in hash_table._slots
351+
assert DELETED in hash_table._slots
352352

353353

354354
def test_should_double_capacity():

hashtable/04_load_factor/hashtable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ def __setitem__(self, key, value):
4949
self._resize_and_rehash()
5050

5151
for index, pair in self._probe(key):
52-
if pair in (None, DELETED) or pair.key == key:
52+
if pair is DELETED: continue
53+
if pair is None or pair.key == key:
5354
self._slots[index] = Pair(key, value)
5455
break
5556

hashtable/04_load_factor/test_hashtable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ def test_should_wrap_index_around_when_collides(mock_hash):
360360
assert hash_table._slots[0] == (False, True)
361361

362362

363-
def test_should_overwrite_deleted(hash_table):
363+
def test_should_not_overwrite_deleted(hash_table):
364364
del hash_table["hola"]
365365
deleted_slot = hash_table._slots.index(DELETED)
366366

@@ -371,7 +371,7 @@ def test_should_overwrite_deleted(hash_table):
371371
hash_table["gracias"] = "thank you"
372372

373373
assert len(hash_table) == 3
374-
assert DELETED not in hash_table._slots
374+
assert DELETED in hash_table._slots
375375

376376

377377
def test_should_double_capacity():

0 commit comments

Comments
 (0)