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

Хеш-таблица, которая растёт

СложнаяНайти ошибку2 ошибкиГлава 5

#хеш-таблицы#коэффициент заполнения#коллизииid: ga-growing-hash-table

Хеш-таблица начинается с 4 корзин и удваивается, как только коэффициент заполнения (элементов / корзин) превышает 0.7. Так цепочки остаются короткими, а операции — O(1) в среднем. После вставки коэффициент не должен превышать 0.7. Но в коде две ошибки: таблица растёт не вовремя и после роста теряет ключи. Найдите и исправьте их.

Пример

table = GrowingHashTable()
for i in range(3):
    table.put(i, i * 10)      # 3 / 4 = 0.75 > 0.7 → 8 корзин
len(table.buckets)            # 8
table.get(2)                  # 20

Решение

class GrowingHashTable:
    """Хеш-таблица с цепочками, удваивается при коэффициенте заполнения > 0.7."""

    def __init__(self) -> None:
        self.buckets: list[list[tuple[object, object]]] = [[] for _ in range(4)]
        self.count = 0

    def load_factor(self) -> float:
        return self.count // len(self.buckets)

    def put(self, key: object, value: object) -> None:
        bucket = self.buckets[hash(key) % len(self.buckets)]
        for i, (k, _) in enumerate(bucket):
            if k == key:
                bucket[i] = (key, value)
                return
        bucket.append((key, value))
        self.count += 1
        if self.load_factor() > 0.7:
            self._resize()

    def _resize(self) -> None:
        old = self.buckets
        self.buckets = [[] for _ in range(len(old) * 2)]
        for i, bucket in enumerate(old):
            self.buckets[i] = bucket

    def get(self, key: object, default: object = None) -> object:
        for k, v in self.buckets[hash(key) % len(self.buckets)]:
            if k == key:
                return v
        return default

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