Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

9.4. Пропустите списки 407

Удаление в списке пропуска

Как поиск и алгоритмы вставки, алгоритм удаления для списка пропуска довольно прост. Фактически, это еще легче, чем алгоритм вставки. Таким образом, чтобы выполнить стирание (k) операция, мы начинаем, выполняя функцию SkipSearch (k). Если положение p снабжает вход ключом, отличающимся от k, мы возвращаем пустой указатель. Иначе, мы удаляем p и все положения выше p, к которым легко получают доступ при помощи вышеупомянутых операций, чтобы взобраться по башне этого входа в S, начинающемся в положении p. Алгоритм удаления иллюстрирован в рисунке 9.12, и подробное описание его оставляют как осуществление (Упражнение R-9.17). Поскольку мы показываем в следующем подразделе, операция стирают в списке пропуска с n записями, имеет O (зарегистрируйте n), ожидаемая продолжительность.

Прежде чем мы дадим этот анализ, однако, есть некоторые незначительные улучшения

структура данных списка пропуска мы хотели бы обсудить. Во-первых, мы не должны фактически хранить ссылки на записи на уровнях пропуска, упоминают выше нижний уровень, потому что все, что необходимо на этих уровнях, является ссылками на ключи. Во-вторых, нам фактически не нужна вышеупомянутая функция. Фактически, нам не нужно перед функцией также. Мы можем выполнить вставку входа и удаление строго нисходящим, передовым просмотром способом, таким образом оставив свободное место для и «предыдущие» ссылки. Мы исследуем детали этой оптимизации в Упражнении C-9.10. Ни одна из этой оптимизации не улучшает асимптотическое исполнение списков пропуска больше, чем, постоянный множитель, но эти улучшения может, тем не менее, быть значащим на практике. Фактически, экспериментальные данные свидетельствуют, что оптимизированные списки пропуска быстрее на практике, чем деревья AVL и другие уравновешенные деревья поиска, которые обсуждены в Главе 10.

Ожидаемая продолжительность алгоритма удаления - O (зарегистрируйте n), который мы

покажите в Разделе 9.4.2.

Рисунок 9.12: Удаление входа с ключевыми 25 из списка пропуска рисунка 9.11. Положения, которые посещают после поиска положения S0, держащего вход, подсвечены синим. Удаленные положения оттянуты с пунктирными линиями.

408 Глава 9. Хеш-таблицы, карты и списки пропуска

Поддержание самого верхнего уровня

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

Одна возможность состоит в том, чтобы ограничить высший уровень, h, чтобы быть сохраненной в некотором постоянном значении, которое является функцией n, числом записей в настоящее время в карте (от анализа

мы видим, что h = макс. 10, 2⌈log n ⌉ является разумным выбором, и выбирающий h = 3⌈log n ⌉

еще более безопасно). Осуществление этого выбора означает, что мы должны изменить вставку

алгоритм, чтобы прекратить вставлять новое положение, как только мы достигаем самого верхнего уровня (если

⌈log n <⌈log (n + 1) ⌉, когда мы можем теперь пойти, по крайней мере, еще один уровень с тех пор

привязанный высота увеличивается).

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

долго как головы продолжает возвращаться из генератора случайных чисел. Это - подход, проявленный в Алгоритме SkipInsert Кодового Фрагмента 9.22. Поскольку мы показываем в анализе списков пропуска, вероятность, что вставка пойдет в уровень, который является больше, чем O (регистрируют n) очень низкая, таким образом, этот выбор дизайна должен также работать.

Любой выбор все еще приводит к ожидаемому O (зарегистрируйте n), время, чтобы выполнить поиск, в -

sertion и удаление, однако, который мы показываем в следующей секции.

9.4.2 Вероятностный анализ пропуска перечисляет

Поскольку мы показали выше, пропустите списки, обеспечивают простое внедрение заказанной карты. С точки зрения работы худшего случая, однако, списки пропуска не превосходящая структура данных. Фактически, если мы официально не препятствуем тому, чтобы вставка продолжилась значительно мимо текущего высшего уровня, тогда алгоритм вставки может войти в то, что является почти бесконечной петлей (это не фактически бесконечная петля, однако, так как вероятность наличия справедливой монеты неоднократно подходит, головы навсегда 0). Более - мы не можем бесконечно добавить положения к списку, в конечном счете не исчерпывая память. В любом случае, если мы заканчиваем вставку положения на высшем уровне h, тогда продолжительность худшего случая для выполнения находки, вставки, и стираем операции в списке S пропуска с n записями, и высота h - O (n + h). Эта работа худшего случая

происходит, когда башня каждого входа достигает уровня h - 1, где h - высота S.

Однако у этого события есть очень низкая вероятность. Судя по этому худшему случаю, нам

мог бы прийти к заключению, что структура списка пропуска строго низшая по сравнению с другой картой im-plementations обсужденный ранее в этой главе. Но это не было бы справедливым анализом, потому что это поведение худшего случая - грубая переоценка.