Как производить удаление элементов из хэш-таблицы правильно?

Как определить, является ли удаляемый элемент последним в цепочке коллизий, чтобы правильно пометить его ячейку как свободную? Каким образом обеспечить корректное удаление элемента 15 из цепочки коллизий 14 15 1?
  • 10 марта 2024 г. 16:29
Ответы на вопрос 3
Для удаления элемента из хэш-таблицы правильно, следует выполнить следующие шаги:

1. Найти ячейку, в которой находится удаляемый элемент.
2. Если в этой ячейке хранится только од элемент, удалить его и пометить ячейку как пустую.
3. Если в этой ячейке есть другие элементы (коллизии), то необходимо определить, является ли удаляемый элемент последним в цепочке коллизий.
4. Если удаляемый элемент не является последним, то просто удалить его из цепочки коллизий.
5. Если удаляемый элемент последний в цепочке коллизий, то пометить ячейку как удаленную и перестроить цепочку коллизий (например, переместить предпоследний элемент в другую ячейку).

Для корректного удаления элемента 15 из цепочки коллизий 14 15 1 необходимо определить, что он является последним в цепочке. Затем пометить ячейку, в которой находится элемент 15, как свободную, и, возможно, переместить элемент 14 в другую ячейку (если она есть свободная).
Никак. Конечно, можно проверить, что там дальше ячейка пустая через k*k для всех возможных k (или что ячейка на (k-1)^2 назад пуста), но это слишком долго. И не сработает во всех случаях. Поэтому так и не делают вообще. Обычно "удаленные" значения убирают при перехешировании, которое все-равно придется делать при достаточном заполнении таблицы.
Судя по всему метод открытой адресации - это проосто нехороший метод для решения проблем хеширования. Я не знаю, толи преподаватели пошли очень душные. Толи студенты любопытные, но всех 
тянет как магнитом к open addressing (OA), хотя многие продуктовые библиотеки коллекций C++/C#/Java
просто не используют OA по дефолту. Они берут Separate Chaining и это работает всегда хорошо.

Я-бы сделал следующую рекомендацию. Поскольку удаление элемента при OA - тяжелая операция,
которая требует перепроверки всех элементов цепочки ключа
, то лучше вообще не удалять а
пере-создавать новую таблицу или отказаться от OA в пользу Separate Chaining.
Похожие вопросы