Как увеличить хеш-таблицу?

Простенькая задачка из problem solving with algorithms and data structures.
Есть хеш-таблица с определенным размером - равным простому числу.
При определенной заполненности необходимо увеличить ее размер, чтобы избежать чрезмерных коллизий.
Собственно как вычислить эту заполненность?
Как увеличить?(мое предположение в два раза и поиск ближайшего простого числа)
И что делать с элементами, которые уже есть в таблице? (хешировать заново по новому размеру?)
Для наглядности начало таблицы:
class Map:

    def __init__(self, size=11):
        self.size = size
        self.slots = [None] * self.size
        self.data = [None] * self.size

    def put(self, key, data):
        hashvalue = self.hashfunction(key, len(self.slots))
        if self.slots[hashvalue] == None:
            self.slots[hashvalue] = key
            self.data[hashvalue] = data
        else:
            if self.slots[hashvalue] == key:
                self.data[hashvalue] = data
            else:
                nextslot = self.rehash(key, len(self.slots))
                while self.slots[nextslot] != None and \
                    self.slots[nextslot] != key:
                    nextslot = self.rehash(nextslot,len(self.slots))
                if self.slots[nextslot] == None:
                    self.slots[nextslot] = key
                    self.data[nextslot] = data
                else:
                    self.data[nextslot] = data
  • Вопрос задан
  • 757 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Заполненность обычно берут 70-75% от размера таблицы. Можете также попробовать посчитать число шагов в цикле rehash, и если оно для какого-то элемента больше критической величины (например, 3 или 5), значит, пора.
"Умножить на 2 и взять следующее простое число" - нормально.
Хешировать заново, конечно, придётся - как же без этого :)
Кстати, то, что rehash не знает про исходный ключ - это правильно? Ведь так получается, что если для двух ключей rehash дал одинаковые результаты, то и вся последующая цепочка для них совпадёт, и будут повышаться шансы, что новые элементы будут попадать именно в эту цепочку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Можно подсмотреть в питоне
https://www.youtube.com/watch?v=JhixzgVpmdM
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы