Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
nestudent.ru_46905.doc
Скачиваний:
22
Добавлен:
12.09.2019
Размер:
2.07 Mб
Скачать

Удаление элементов

Удаление элементов из блоков сложнее, чем из связных списков, но оно возможно. Во‑первых, найдем элемент, который требуется удалить из хеш‑таблицы. Если блок не заполнен, то на место удаленного элемента помещается последний элемент блока, при этом все непустые ячейки блока будет находиться в его начале. Тогда, если при поиске элемента в блоке позднее найдется пустая ячейка, то можно будет заключить, что элемента в таблице нет.

Если блок, содержащий искомый элемент, заполнен, то нужно провести поиск заменяющего его элемента в дополнительных блоках. Если ни один из элементов в дополнительных блоках не принадлежит к данному блоку, то искомый элемент заменяется последним элементом в блоке, и последняя ячейка блока становится пустой.

Иначе, если в дополнительном блоке существует элемент, который принадлежит к данному блоку, то найденный элемент из дополнительного блока помещается на место удаленного элемента. При этом в дополнительном блоке образуется пустое пространство, но это легко исправить — в образовавшуюся пустую ячейку помещается последний элемент из последнего дополнительного блока.

На рис. 11.7 показан процесс удаления элемента из заполненного блока. Во‑первых, из блока 0 удаляется элемент 24. Так как блок 0 был заполнен, то нужно попытаться найти элемент из дополнительных блоков, который можно было бы вставить на его место в блок 0. В данном случае блок 0 содержит все четные элементы, поэтому любой четный элемент из дополнительных блоков подойдет. Первый четным элементом в дополнительных блоках будет элемент 14, поэтому можно заменить элементы 24 в блоке 0 элементом 14.

При этом в третьей позиции первого дополнительного блока образуется пустая ячейка. Заполним ее последним элементом из последнего дополнительного блока, в данном случае элементом 79. В этот момент хеш‑таблица снова готова к работе.

Другой метод состоит в том, чтобы вместо удаления элемента помечать его как удаленный. Для поиска элементов в таком блоке нужно игнорировать удаленные элементы. Если позднее в блок будут добавляться новые элементы, можно будет помещать их на место элементов, помеченных как удаленные.

@Рис. 11.7. Удаление элемента из блока

=========294

Быстрее и легче вместо удаления элемента просто помечать его как удаленный, но, в конце концов, таблица может оказаться заполненной неиспользуемыми ячейками. Если добавить в хеш‑таблицу ряд элементов и затем удалить большинство из них в порядке первый вошел — первый вышел, то расположение элементов в блоках может оказаться «перевернутым». Большая часть настоящих данных будет находиться в конце блоков и в дополнительных блоках. Добавлять новые элементы в таблицу будет просто, но при поиске элемента довольно много времени будет тратиться на пропуск удаленных элементов.

В качестве компромисса при удалении элемента из блока можно перемещать последний элемент блока на освободившееся место и затем помечать последний элемент блока как удаленный. Тогда при поиске в блоке можно прекратить дальнейший поиск в блоке, если при этом встретится элемент, помеченный, как удаленный. После этого можно провести поиск в дополнительных блоках, если они существуют.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]