Нашли ошибку?

Своя хеш-таблица с цепочками

СредняяДописатьГлава 5

#хеш-таблицы#коллизии#хеш-функцииid: ga-chained-hash-table

Соберите хеш-таблицу своими руками. Массив из size корзин, ключ попадает в корзину hash(key) % size, коллизии разрешаются цепочками: в каждой корзине лежит список пар. Допишите методы put и get. Пользоваться встроенным dict внутри нельзя. Пропуски помечены # TODO.

Пример

table = ChainedHashTable(size=4)
table.put("яблоко", 120)
table.put("молоко", 90)
table.put("яблоко", 110)   # обновление, а не второй ключ
table.get("яблоко")        # 110
table.get("хлеб", 0)       # 0
len(table)                 # 2

Решение

class ChainedHashTable:
    """Хеш-таблица с разрешением коллизий цепочками."""

    def __init__(self, size: int = 8) -> None:
        self.buckets: list[list[tuple[str, int]]] = [[] for _ in range(size)]

    def _bucket(self, key: str) -> list[tuple[str, int]]:
        return self.buckets[hash(key) % len(self.buckets)]

    def put(self, key: str, value: int) -> None:
        """Добавляет пару или обновляет значение существующего ключа."""
        bucket = self._bucket(key)
        for i, (k, _) in enumerate(bucket):
            # TODO: если ключ уже есть — замените пару и выйдите из метода
            pass
        # TODO: ключа не было — добавьте пару в корзину

    def get(self, key: str, default: int | None = None) -> int | None:
        """Значение по ключу или default."""
        # TODO: найдите ключ в его корзине
        return default

    def __len__(self) -> int:
        return sum(len(bucket) for bucket in self.buckets)

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 chained_hash_table.py — тесты те же, результат покажет ✓ / ✗ и итог.