Как линейное зондирование обрабатывает удаления, не нарушая поиск? - PullRequest
1 голос
/ 11 марта 2020

Вот мое понимание линейного зондирования.

Для вставки: - У нас sh до определенной позиции. Если эта позиция уже имеет значение, мы линейно увеличиваем ее до следующей позиции, пока не встретим пустую позицию, а затем вставим туда. Это имеет смысл.

Мой вопрос вращается вокруг поиска. Из описаний, которые я прочитал, я полагаю, что поиск работает так:

  • Мы смотрим на позицию, к которой мы ищем хэши.
  • Если позиция пуста, мы возвращаемся Не найдено
  • Если позиция заполнена, мы линейно перемещаемся к позициям, пока не встретим искомое значение или не встретим пустую позицию (значение не найдено)

Так как же это работает, когда мы удаляем элемент из ха sh? Разве это не испортило бы этот поиск? Скажите две вещи, которые sh в одной позиции. Мы добавляем оба элемента, затем удаляем первый, который добавили. Итак, теперь ожидаемая позиция второго элемента (который должен был быть перемещен в другую позицию, поскольку первый элемент изначально занимал его) пуста. Обрабатывает ли удаление это каким-либо образом?

1 Ответ

1 голос
/ 12 марта 2020

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

Для этого есть несколько решений. Одним из них является использование удаление захоронения . При удалении надгробной плиты, чтобы удалить элемент, вы заменяете элемент маркером, который называется надгробная плита , который указывает «элемент, который был здесь, но с тех пор был удален». Затем, когда вы выполняете поиск, вы используете ту же процедуру, что и раньше: прыгайте в положение ha sh, затем продолжайте идти вперед, пока не найдете пустое место. Идея заключается в том, что надгробный камень не считается пустым местом, поэтому вы продолжите сканировать его, чтобы найти то, что ищете.

Чтобы количество надгробий было низким, есть хорошие методы, которые вы можете использовать, такие как перезапись надгробий во время вставок или глобальное восстановление таблицы, если число надгробий становится слишком большим.

Другой вариант - использовать хеширование Робин Гуда и удаление с обратным смещением . В хешировании Робин Гуда вы храните элементы в таблице таким образом, что они по существу сохраняют их отсортированными по их коду ha sh (обтекание в начале таблицы делает вещи немного сложнее, чем это, но это общая идея) , После этого при удалении вы можете сдвинуть элементы назад на одну точку, чтобы заполнить пробел в удаленном элементе, пока вы не нажмете пробел или элемент, который уже находится в нужном месте и не нуждается в перемещении.

Для получения более подробной информации, ознакомьтесь с этими слайдами лекций по линейному зондированию и хэшированию Робин Гуда .

Надеюсь, это поможет!

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